Код синтезирован правильно, но когда я пытаюсь смоделировать его, только lda изменяется с 0 на 1. Остальные управляющие сигналы остаются такими же.
Сигнал eqz никогда не меняется от x. Остальные сигналы остаются в состоянии 0.
Я перепробовал все. Может кто-нибудь сказать мне, где я ошибся?
Испытательный стенд
module multiplier(input clk, start, [15:0]datain , output done);
wire eqz, lda, ldb, ldp, clrp, decb;
mul_datapath D(eqz, clk, lda, ldb, ldp, clrp, decb, datain);
mul_control C(done, lda, ldb, ldp, clrp, decb, clk, start, eqz, datain);
endmodule
Путь данных
module mul_datapath(eqz, clk, lda, ldb, ldp, clrp, decb, datain);
input clk, lda, ldb, ldp, clrp, decb;
input [15:0] datain;
wire [15:0]x, y, z, bout;
output eqz;
PIPO1 P1(x, clk, lda, datain);
PIPO2 P2(y, clk, ldp, clrp, z);
ADD A(z, x, y);
COUNT CNT(bout, clk, ldb, decb, datain);
COMP com(eqz, bout);
endmodule
PIPO регистр A
module PIPO1(x, clk, lda, datain);
input clk, lda;
input [15:0] datain;
output reg [15:0] x;
always @(posedge clk)
if(lda) x<= datain;
endmodule
PIPO регистр B
module PIPO2(y, clk, ldp, clrp, z);
input clk, ldp, clrp;
input [15:0] z;
output reg [15:0]y;
always @(posedge clk)
begin
if(clrp) y<= 16'b0;
else if(ldp) y<= z;
end
endmodule
Сумматор
module ADD(z, x, y);
input [15:0]x, y;
output reg [15:0]z;
always @(*)
z = x + y;
endmodule
Счетчик уменьшения B
module COUNT(bout, clk, ldb, decb, datain);
input clk, ldb, decb;
input [15:0] datain;
output reg [15:0]bout;
always @(posedge clk)
begin
if(ldb) bout <= datain;
else if(decb)
bout <= bout -1;
end
endmodule
Компаратор для сравнения B с нулем
module COMP(eqz, bout);
input [15:0] bout;
output eqz;
assign eqz = (bout==0);
endmodule
Путь управления
module mul_control(done, lda, ldb, ldp, clrp, decb, clk, start, eqz, datain);
input clk, start, eqz;
input[15:0] datain;
output reg lda, ldb, ldp, clrp, decb, done;
reg [2:0]state;
parameter S0=000, S1=001, S2=010, S3=011, S4=100;
always @(posedge clk)
begin
case(state)
S0 : if(start) state<= S1;
S1 : state<=S2;
S2 : state<= S3;
S3 : begin if(eqz) state<=S4; else state<=S3; end
S4 : state<= S4;
default : state<= S0;
endcase
end
always @(state)
begin
case(state)
S0: begin lda = 0; ldb = 0; ldp = 0; clrp = 0; decb = 0; done = 0; end
S1: begin lda = 1; ldb = 0; ldp = 0; clrp = 0; decb = 0; done = 0; end
S2: begin lda = 0; ldb = 1; ldp = 0; clrp = 0; decb = 0; done = 0; end
S3: begin lda = 0; ldb = 0; ldp = 1; clrp =0; decb = 1; done = 0; end
S4: begin lda = 0; ldb = 0; ldp = 0; clrp = 0; decb = 0; done = 1; end
default : begin lda = 0; ldb = 0; ldp = 0; clrp = 0; decb = 0; done = 0; end
endcase
end
endmodule