Verilog booth算法的加减

时间:2017-11-07 01:57:23

标签: verilog

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位结果乘数

1 个答案:

答案 0 :(得分:0)

您的代码存在多个问题。

首先,没有时钟。 case语句看起来很完整并且是一个组合逻辑,但是&#39; counter&lt; = counter + 1`不是组合逻辑并且需要翻牌。

您使用的是非阻止作业&#39;&lt; =&#39;在所有地方,使你的模型在任何情况下都不像预期的那样模拟,也可能在模拟中引起毛刺和比赛。请查看有关使用阻止/非阻止分配的章节。

现在针对0110个案件,您对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)不会产生任何影响。