module calculator(state,U,V,X,X_1,multiplicant,multiplier,count);
input [1:0] state;
input [3:0] multiplicant,multiplier;
output reg [3:0] U,V,X;
output reg X_1;
output reg[2:0] count;
wire [7:0] ASR;
wire [4:0] CSR;
wire [3:0] sum, sub;
always @ (state or count)
begin
U<=4'b0;
V<=4'b0;
X<=multiplier;
X_1<=1'b0;
count<=3'b0;
if(state==2'b01)
begin
case({X[0],X_1})
2'b00:
begin
{U,V}<=ASR;
{X,X_1}<=CSR;
end
2'b11:
begin
{U,V}<=ASR;
{X,X_1}<=CSR;
end
2'b01:
begin
U<=sum;
{U,V}<=ASR;
{X,X_1}<=CSR;
end
2'b10:
begin
U<=sub;
{U,V}<=ASR;
{X,X_1}<=CSR;
end
endcase
count <= count +1;
end
end
rca U0_rca4(.a(multiplicant),.b(U),.ci(1'b0),.s(sum));
rca U1_rca4(.a(U),.b(~multiplicant),.ci(1'b1),.s(sub));
ASR8 U2_ASR8({U,V},1'b1,ASR);
CSR5 U3_CSR5({X,X_1},1'b1,CSR);
endmodule
这是我的代码,案例2'b01和案例2'b10不起作用。实际上,移位效果很好但是将rca的sum或sub添加到'U'不起作用。为什么会这样?我需要解释一下。或者我可以更好地修改我的代码吗?我必须制作4bit * 4bit - &gt; 8位结果乘数
答案 0 :(得分:0)
您的代码存在多个问题。
首先,没有时钟。 case语句看起来很完整并且是一个组合逻辑,但是&#39; counter&lt; = counter + 1`不是组合逻辑并且需要翻牌。
您使用的是非阻止作业&#39;&lt; =&#39;在所有地方,使你的模型在任何情况下都不像预期的那样模拟,也可能在模拟中引起毛刺和比赛。请查看有关使用阻止/非阻止分配的章节。
现在针对01
和10
个案件,您对U
变量进行了多次分配:
2'b01:
begin
U<=sum; // << here is assighment #1
{U,V}<=ASR; // << here is assignment #2
{X,X_1}<=CSR;
end
所以,你只是在下一个作业中覆盖它,因此,sum(和10中的sub)不会产生任何影响。