Verilog减法和加法

Verilog减法和加法,verilog,digital-logic,digital-design,Verilog,Digital Logic,Digital Design,我正在尝试用Verilog编写一个加减法程序。问题是在Verilog中实现和测试一个执行加法或减法的模块,然后Mux在一个或另一个结果之间进行选择,然后将所选结果从二进制解码为7段显示格式。Verilog模块将有3个输入:两个名为A和B的4位输入,以及一个选择输入S。您的电路应将这两个数字相加,并从A中减去B(这就像代码中有A-B一样简单)。根据S的值(即,它是1还是0),应该让加法或减法的结果通过 这是我的代码: 模块地址或子域,然后选择并解码为7段显示(A、B、S、结果、溢出、显示) 当我运

我正在尝试用Verilog编写一个加减法程序。问题是在Verilog中实现和测试一个执行加法或减法的模块,然后Mux在一个或另一个结果之间进行选择,然后将所选结果从二进制解码为7段显示格式。Verilog模块将有3个输入:两个名为A和B的4位输入,以及一个选择输入S。您的电路应将这两个数字相加,并从A中减去B(这就像代码中有A-B一样简单)。根据S的值(即,它是1还是0),应该让加法或减法的结果通过

这是我的代码: 模块地址或子域,然后选择并解码为7段显示(A、B、S、结果、溢出、显示)


当我运行讲师测试台时,除显示外,所有线条均为绿色。显示[6:0]xxxxxxx,后面是红线。我花了两天的时间研究这个问题,试图解决它。有什么帮助吗?

代码的问题是,您在同一个网络上通过1个以上的“始终”块完成了作业

不要从多个always块向同一变量赋值。

因此,您的代码应该如下所示:

input [3:0] A;
input [3:0] B;
input [1:0] S;

output [3:0] Result;
output reg Overflow;
output reg [6:0] Display;

reg [3:0] Result_reg;

wire [3:0] A;
wire [3:0] B;
wire [1:0] S;

assign Result = (Overflow) ? 4'bx : Result_reg;

always @(A,B) begin
    if (S == 0'b0)
        {Overflow, Result_reg} = A - B;
    else if (S == 1'b1)
        {Overflow, Result_reg} = A + B;
    end

always @(Overflow,Result_reg) begin
    case ({Overflow, Result_reg}) inside
        [5'b1000:5'b11111] : Display = 7'b0011101; 
        5'b00000: Display = 7'b1111110;//0
        5'b00001: Display = 7'b0110000;//1
        5'b00010: Display = 7'b1101101;//2
        5'b00011: Display = 7'b1111001;//3
        5'b00100: Display = 7'b0110011;//4
        5'b00101: Display = 7'b1011011;//5
        5'b00110: Display = 7'b1011111;//6
        5'b00111: Display = 7'b1110000;//7
        5'b01000: Display = 7'b1111111;//8
        5'b01001: Display = 7'b1111011;//9
        5'b01010: Display = 7'b1110111;//A
        5'b01011: Display = 7'b0011111;//B
        5'b01100: Display = 7'b1001110;//C
        5'b01101: Display = 7'b0111101;//D
        5'b01110: Display = 7'b1001111;//E
        5'b01111: Display = 7'b1000111;//F
        default: Display = 7'bx;
    endcase
end
有关Verilog编码指南,您可以查看


此外,我已根据您的原始代码在代码中指定了“x”。但是我强烈不建议对RTL代码使用“x”赋值。

有一行看起来很奇怪:

if (S == 0'b0)
基本上这意味着“零位数字”。在verilog中,我认为格式是bits'bvalue。将十六进制格式的b替换为h(其余选项使用谷歌;)

正如其他海报所说,S似乎是2比特向量,尽管只使用了MSB

而且x值在现实世界中并不存在-这只是模拟器说“我不知道”的一种方式。所以这不会合成

否则,我看不到在不同的always块中,同一个信号分配了两次以上的位置?当在同一块中完成时,应该是正常的。后一个值仅覆盖前一个值。谷歌的封锁和非封锁的更多信息

编辑:你用什么作为刺激?如果A和B是静态的,它们将不会导致事件,而该事件反过来又不会导致任何always块触发。因此,输出保持在7'bx。对此不是很确定,但值得检查。

重复问题:当您只有2个选项时,为什么要将“S”取为2位。为什么要将溢出量设为1(从硬件的角度来看,您不能将“x”分配给任何网络)?
if (S == 0'b0)