2017-08-03 3 views
-2

私のコードは8個の定数タップ、8ビットのFIRの連続構造です。私はすべての入力*タップを保存するためにメモリを使いましたが、これらの乗算を保存しようとしているうちに、エラーが発生し続けます。FIR Verilogコードで「無効なモジュールのインスタンス化」を取得

私はそれをModelsimでコンパイルし、「構文エラー」を受け取りました。その後、私はiverilogを試して、 "構文エラー"と "エラー:無効なモジュールのインスタンス化"を得ました。私は本当に明白な何かを見逃しているように感じますが、解決できませんでした。次のように

コードが行く:

/* Código de um filtro FIR 8 taps, 8 bits 
Aluno: Rafael Menezes 
Start date: 19/07/2017 

Modelo original - Sequencial ALTERNATIVO por reg+load 
v1.5 

BUG REPORT: 
    - Problema com a memória das multiplicações (linha 54); 

NOTES: 
    - Incrementador do sel é feito por always (linha 59); 
    - Necessita, também, fazer o xor pro load (?); 
*/ 

//código do fir 
module fir(x,clk,rst,y); 
input signed [8:0]x;      //entrada do fir 
input clk,rst;        //clock e reset 
output signed [16:0]y;      //saída do fir 
reg signed [16:0] m[0:7];     //variáveis auxiliares para as multiplicações 
wire signed [8:0]x1,x2,x3,x4,x5,x6,x7;  //variáveis auxiliares para os atrasos 
wire signed [8:0]x_aux;      //variável auxiliar para o atraso selecionado pelo mux 
wire signed [8:0]h_aux;      //variável auxiliar para o tap selecionado pelo mux 
reg   [2:0]sel;      //variável responsável pelo select do mux 
parameter n=8;        //parâmetro do loop das multiplicações 

// valores pré-definidos dos taps 
parameter signed h0=-4'd1; 
parameter signed h1=4'd7; 
parameter signed h2=-4'd2; 
parameter signed h3=4'd5; 
parameter signed h4=-4'd5; 
parameter signed h5=4'd3; 
parameter signed h6=4'd1; 
parameter signed h7=4'd4; 

    //atrasos 
    ffd u1(clk,rst,x,x1); //x[n-1] 
    ffd u2(clk,rst,x1,x2); //x[n-2] 
    ffd u3(clk,rst,x2,x3); //x[n-3] 
    ffd u4(clk,rst,x3,x4); //x[n-4] 
    ffd u5(clk,rst,x4,x5); //x[n-5] 
    ffd u6(clk,rst,x5,x6); //x[n-6] 
    ffd u7(clk,rst,x6,x7); //x[n-7] 

genvar i; 
generate 
    for (i=0; i<n; i=i+1) begin: mux 
    mux81 mux1(.clk(clk),.sel(sel),.in1(x),.in2(x1),.in3(x2),.in4(x3), 
        .in5(x4),.in6(x5),.in7(x6),.in8(x7),.out(x_aux));   //mux que seleciona as entradas 
    mux81 mux2(.clk(clk),.sel(sel),.in1(h0),.in2(h1),.in3(h2),.in4(h3), 
        .in5(h4),.in6(h5),.in7(h6),.in8(h7),.out(h_aux));   //mux que seleiona os taps 
    m[i]=x_aux*h_aux;  // THE ERROR IS RIGHT HERE! 
    end 
endgenerate 

//rotina que incrementa o select a cada pulso de clock 
always @(posedge clk) begin 
    if (sel==3'b111) begin 
     sel <= 3'b000; 
    end else begin 
     sel <= sel + 3'b001; 
    end 
end 

    assign y=m[0]+m[1]+m[2]+m[3]+m[4]+m[5]+m[6]+m[7];  

endmodule 


//código do flip flop d que será usado como o integrador (atraso) 
module ffd(clk,rst,in,out); 
input clk,rst; 
input signed [8:0]in; 
output signed [8:0]out; 
reg signed [8:0]out; 

always @ (posedge clk) begin   //sembre na borda de subida verifica se o rst está ligado 
    if(rst==1) begin     //se não estiver ligado, atribui a entrada para a saída 
     out<=0; 
    end else begin 
     out<=in; 
    end 
end 

endmodule 

//código mux para selecionar os taps e as entradas 
module mux81(clk,sel,rst,in1,in2,in3,in4,in5,in6,in7,in8,out); 
input signed [8:0]in1,in2,in3,in4,in5,in6,in7,in8; 
input [2:0]sel; 
input clk,rst; 
output signed [8:0]out; 
reg signed [8:0]out; 

always @ (posedge clk or sel) begin 
    if (rst==1) begin 
     out<=0; 
    end else if (sel==3'd0) begin 
     out<=in1; 
    end else if (sel==3'd1) begin 
     out<=in2; 
    end else if (sel==3'd2) begin 
     out<=in3; 
    end else if (sel==3'd3) begin 
     out<=in4; 
    end else if (sel==3'd4) begin 
     out<=in5; 
    end else if (sel==3'd5) begin 
     out<=in6; 
    end else if (sel==3'd6) begin 
     out<=in7; 
    end else if (sel==3'd7) begin 
     out<=in8; 
    end 
end 

endmodule 
+0

物乞いとここにタイトルをvandalizeしないでください - それは作品を作成し、ボランティア編集者のために。 – halfer

+0

[もっと速い回答を得るために、どのような状況で私の質問に「緊急」やその他の類似のフレーズを追加することができますか?](// meta.stackoverflow.com/q/326569) - 要約は、これはボランティアに対処する理想的な方法であり、おそらく回答を得ることは非生産的です。これをあなたの質問に追加しないでください。 – halfer

+0

これは私の最初の投稿ですので、私は知らないでしょう、申し訳ありません。頭をアップしてくれてありがとう、しかし私の投稿をdownvoting誰も助けることはありません。実際には、正反対になります。乾杯。 –

答えて

1

Verilogモジュールは文法的に宣言、手続き型ブロック、連続asisgnments、およびモジュールのインスタンスが含まれる可能性があります。このm[i]=x_aux*h_aux;のような表現だけで、Verilogコンパイラが混乱します。 'generate'ブロック内で使用されているという事実は、後者がそのようなスコープを表しておらず、インラインでしか内部構造を持たないため、何も変更しません。

したがって、私は、OPがレジスタ 'm [i]'(ここで[i]は生成されたインデックスです)に値を割り当てたいと仮定します。 Verilogでは、手続き型ブロックで行うことができます(このような場合は常にブロックします)。だから、正しい使用、アカウントのverilog v2k構文で服用することである:システムのverilogで

always @* 
    m[i]=x_aux*h_aux; 

私が代わりにこれを使用することをお勧めします。

always_comb 
    m[i]=x_aux*h_aux; 
+1

@halfer yep、... fixed。 – Serge

関連する問題