Verilog代码2错误我可以';t find:如果能多给我一双眼睛来发现我可能犯的错误,我将不胜感激;我忽略了
我正在写一个verilog代码,读取两个文件并将这些数字保存到寄存器中。然后我将它们相乘并相加。几乎是一个乘法累加器。然而,对于我所拥有的代码,我经历了一段艰难而沮丧的时光。它能正确读取文件中的数字,并且会成倍增加,但问题出在这里?当我第一次使用ModelSim运行它时,我重置了所有内容,以便清除累加器。然后我开始了这个项目,但是我的“macc_out”总是有这么大的延迟,我似乎不知道为什么。这个延迟不应该存在,而是应该从A*B+MAC中得到结果。即使在延迟之后,它也无法获得正确的输出。我的第二个问题是,如果我从“重置高”转到“重置低”(启动程序),然后再回到“重置高”(重置所有值),它们不会重置!这是令人沮丧的,因为我已经为此工作了一周,不知道/看不到bug。我要求额外的一双眼睛,看看你是否能发现我的错误。附件是我的代码和实例,也是我的ModelSim函数波形。感谢您的帮助Verilog代码2错误我可以';t find:如果能多给我一双眼睛来发现我可能犯的错误,我将不胜感激;我忽略了,verilog,modelsim,intel-fpga,Verilog,Modelsim,Intel Fpga,我正在写一个verilog代码,读取两个文件并将这些数字保存到寄存器中。然后我将它们相乘并相加。几乎是一个乘法累加器。然而,对于我所拥有的代码,我经历了一段艰难而沮丧的时光。它能正确读取文件中的数字,并且会成倍增加,但问题出在这里?当我第一次使用ModelSim运行它时,我重置了所有内容,以便清除累加器。然后我开始了这个项目,但是我的“macc_out”总是有这么大的延迟,我似乎不知道为什么。这个延迟不应该存在,而是应该从A*B+MAC中得到结果。即使在延迟之后,它也无法获得正确的输出。我的第二
module FSM(clk,start,reset,done,clock_count);
input clk, start, reset;
output reg done;
output reg[10:0] clock_count;
reg [0:0] macc_clear;
reg[5:0] Aread, Bread, Cin;
wire signed [7:0] a, b;
wire signed [18:0] macc_out;
reg [3:0] i,j,m;
reg add;
reg [0:0] go;
reg[17:0] c;
parameter n = 8;
reg[1:0] state;
reg [1:0] S0 = 2'b00;
reg [1:0] S1 = 2'b01;
reg [1:0] S2 = 2'b10;
reg [1:0] S3 = 2'b11;
ram_A Aout(.clk(clk), .addr(Aread), .q(a));
ram_B Bout(.clk(clk), .addr(Bread), .q(b));
mac macout(.clk(clk), .macc_clear(macc_clear), .A(a), .B(b), .macc_out(macc_out), .add(add));
ram_C C_in(.clk(clk), .addr(Cin), .q(c));
always @(posedge clk) begin
if (reset == 1) begin
i <= 0;
add<=0;
j <= 0;
m <= 0;
clock_count <= 0;
go <= 0;
macc_clear<=1;
end
else
state<=S0;
case(state)
S0: begin
// if (reset) begin
// i <= 0;
// add<=0;
// j <= 0;
// m <= 0;
// clock_count <= 0;
// go <= 0;
// macc_clear<=1;
// state <= S0;
// end
macc_clear<=1;
done<=0;
state <= S1;
end
S1: begin
add<=1;
macc_clear<=0;
clock_count<=clock_count+1;
m<=m+1;
Aread <= 8*m + i;
Bread <= 8*j + m;
if (m==7) begin
state <= S2;
macc_clear<=1;
add<=0;
end
else
state <=S1;
end
S2: begin
add<=1;
macc_clear<=0;
m<=0;
i<=i+1;
if (i<7)
state<=S1;
else if (i==8) begin
state<=S3;
add<=0;
end
end
S3: begin
add<=1;
i<=0;
j<=j+1;
if(j<7)
state<=S1;
else begin
state<=S0;
done<=1;
add<=0;
end
end
endcase
end
always @ (posedge macc_clear) begin
Cin <= 8*j + i;
c <= macc_out;
end
endmodule
module mac(clk, macc_clear, A, B, macc_out, add);
input clk, macc_clear;
input signed [7:0] A, B;
input add;
output reg signed [18:0] macc_out;
reg signed [18:0] MAC;
always @( posedge clk) begin
if (macc_clear) begin
macc_out <= MAC;
MAC<=0;
end
else if (add) begin
MAC<=(A*B)+ MAC;
macc_out<=MAC;
end
end
endmodule
module ram_A( clk, addr,q);
output reg[7:0] q;
input [5:0] addr;
input clk;
reg [7:0] mem [0:63];
initial begin
$readmemb("ram_a_init.txt", mem);
end
always @(posedge clk) begin
q <= mem[addr];
end
endmodule
module ram_C(clk,addr, q);
input [18:0] q;
input [5:0] addr;
input clk;
reg [18:0] mem [0:63];
always @(posedge clk) begin
mem[addr] <= q;
end
endmodule
模块FSM(时钟、启动、复位、完成、时钟计数);
输入时钟、启动、复位;
输出完成;
输出寄存器[10:0]时钟计数;
reg[0:0]macc_清除;
reg[5:0]区域、面包、Cin;
电文签名[7:0]a,b;
电文签署[18:0]macc_out;
reg[3:0]i,j,m;
注册添加;
reg[0:0]开始;
reg[17:0]c;
参数n=8;
reg[1:0]状态;
reg[1:0]S0=2'b00;
reg[1:0]S1=2'b01;
reg[1:0]S2=2'b10;
reg[1:0]S3=2'b11;
ram_A Aout(.clk(clk),.addr(Aread),.q(A));
ram_B Bout(.clk(clk),.addr(Bread),.q(B));
mac-macout(.clk(clk),.macc_-clear(macc_-clear),.A(A),.B(B),.macc_-out(macc_-out),.add(add));
ram_C_in(.clk(clk),.addr(Cin),.q(C));
始终@(posedge clk)开始
如果(重置==1)开始
我1)看一看你的MACC模块的示意图-我认为你的一些“问题”将从中显而易见
2)考虑使用<代码>始终@(*)< /代码>(组合)块,用于FSM控制信号(如“代码>添加< /代码>或<代码> MACCURLISH < /代码>”,而不是<代码>始终@(PaseECLK)(顺序)-它使逻辑更容易断言。现在他们已经注册了,所以你有一个周期延迟
3) 在MAC电脑中,重置时清除MAC寄存器,但不清除macc\u out
寄存器
简而言之,我认为你需要退后一步,考虑哪些信号是组合逻辑,哪些是顺序的,需要在寄存器中。< /P>