Verilog-booth加减算法 模块计算器(状态、U、V、X、X_1、乘法器、乘法器、计数); 输入[1:0]状态; 输入[3:0]乘法器,乘法器; 输出寄存器[3:0]U、V、X; 输出寄存器X_1; 输出寄存器[2:0]计数; 导线[7:0]ASR; 导线[4:0]CSR; 电汇[3:0]和,分; 始终@(状态或计数) 开始 U

Verilog-booth加减算法 模块计算器(状态、U、V、X、X_1、乘法器、乘法器、计数); 输入[1:0]状态; 输入[3:0]乘法器,乘法器; 输出寄存器[3:0]U、V、X; 输出寄存器X_1; 输出寄存器[2:0]计数; 导线[7:0]ASR; 导线[4:0]CSR; 电汇[3:0]和,分; 始终@(状态或计数) 开始 U,verilog,Verilog,您的代码存在多个问题 首先,没有钟。case语句看起来很完整,是一种组合逻辑,但是“哪种移位有效?”?您的代码中没有变化。不要在那里使用非阻塞分配。@Serge实际上,ASR和CSR意味着转移。ASR是算术移位,CSR是循环移位。CSR只是电线,简单的变量。无论你给它们取什么名字,都不会让它们移动或其他任何东西。那么,它起作用意味着什么呢?@Serge有用于轮班操作的模块。我制作了shift模块并将它们添加到项目文件中。您可以在最后几行看到输出连接到导线的模块。在计数上有异步反馈。至少需要将计数

您的代码存在多个问题


首先,没有钟。case语句看起来很完整,是一种组合逻辑,但是“哪种移位有效?”?您的代码中没有变化。不要在那里使用非阻塞分配。@Serge实际上,ASR和CSR意味着转移。ASR是算术移位,CSR是循环移位。CSR只是电线,简单的变量。无论你给它们取什么名字,都不会让它们移动或其他任何东西。那么,它起作用意味着什么呢?@Serge有用于轮班操作的模块。我制作了shift模块并将它们添加到项目文件中。您可以在最后几行看到输出连接到导线的模块。在
计数上有异步反馈。至少需要将计数逻辑移到单独的
始终@(posedge时钟)
,或使整个始终块时钟敏感。此外,组合逻辑需要完整的敏感列表并使用阻塞(
=
)赋值;非非非阻塞(

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:
begin
    U<=sum;   // << here is assighment #1
    {U,V}<=ASR; // << here is assignment #2
    {X,X_1}<=CSR;
end