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

相关问题