我的代碼是一個順序結構,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
請不要在這裏與乞討搞破壞的標題 - 它創建工作爲志願編輯。 – halfer
請閱讀[在什麼情況下,我可以添加「緊急」或其他類似的短語到我的問題,以獲得更快的答案?](/ meta.stackoverflow.com/q/326569) - 總結是,這不是這是解決志願者問題的理想方式,可能會對獲得答案產生反作用。請不要將這添加到您的問題。 – halfer
嗯,這是我在這裏的第一篇文章,所以我不知道,對不起。感謝您的支持,但是降低我的帖子對任何人都無濟於事。事實上,會做相反的事情。乾杯。 –