2017-08-03 154 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

請不要在這裏與乞討搞破壞的標題 - 它創建工作爲志願編輯。 – halfer

+0

請閱讀[在什麼情況下,我可以添加「緊急」或其他類似的短語到我的問題,以獲得更快的答案?](/ meta.stackoverflow.com/q/326569) - 總結是,這不是這是解決志願者問題的理想方式,可能會對獲得答案產生反作用。請不要將這添加到您的問題。 – halfer

+0

嗯,這是我在這裏的第一篇文章,所以我不知道,對不起。感謝您的支持,但是降低我的帖子對任何人都無濟於事。事實上,會做相反的事情。乾杯。 –

回答

1

的Verilog模塊語法可能包含聲明的,程序塊,連續asisgnments,和模塊的實例化。像這種單獨的表達式混淆了verilog編譯器。它在'generate'塊內部使用的事實並沒有改變任何東西,因爲後者並不代表這樣一個範圍,而只是內聯其內部。因此,我假設OP想要爲寄存器'm [i]'(其中[i]是生成的索引)賦值。在Verilog中,這可以在程序塊中完成(總是在這種情況下阻止)。所以,正確的使用,同時在考慮的Verilog V2K語法是:

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

系統的Verilog我建議改用此:

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

@halfer yep,...固定。 – Serge