Verilog Вычитание и сложение

Я пытаюсь запрограммировать программу сложения и вычитания в Verilog. Проблема заключается в реализации и тестировании в Verilog модуля, который выполняет сложение или вычитание, затем Mux выбирает между пропуском результата одного или другого и затем декодирует выбранный результат из двоичного файла в 7-сегментный формат отображения. Модуль Verilog будет иметь 3 входа: два 4-битных входа с именами A и B и вход выбора S. Ваша схема должна добавить два числа и вычесть B из A (это так же просто, как иметь AB в вашем коде). В зависимости от значения S (т. Е. Будь то единица или ноль), вы должны пропустить либо результат сложения, либо результат вычитания.

Вот код, который у меня есть: module AddOrSubtractThenSelectAndDecodeInto7SegmentsDisplay(A,B,S, Результат, Переполнение, Отображение);

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

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

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



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

always @(Overflow,Result) begin
    case (Result)
        4'b0000: Display = 7'b1111110;//0
        4'b0001: Display = 7'b0110000;//1
        4'b0010: Display = 7'b1101101;//2
        4'b0011: Display = 7'b1111001;//3
        4'b0100: Display = 7'b0110011;//4
        4'b0101: Display = 7'b1011011;//5
        4'b0110: Display = 7'b1011111;//6
        4'b0111: Display = 7'b1110000;//7
        4'b1000: Display = 7'b1111111;//8
        4'b1001: Display = 7'b1111011;//9
        4'b1010: Display = 7'b1110111;//A
        4'b1011: Display = 7'b0011111;//B
        4'b1100: Display = 7'b1001110;//C
        4'b1101: Display = 7'b0111101;//D
        4'b1110: Display = 7'b1001111;//E
        4'b1111: Display = 7'b1000111;//F
        default: Display = 7'bx;
    endcase

    if (Overflow == 1)begin
        Result = 4'bx;
        Display = 7'b0011101;
    end
end


endmodule

Когда я запускаю тестовый стенд инструкторов, все линии зеленые, кроме дисплея. На нем написано "Display[6:0] xxxxxxx", за которым следуют красные линии. Я провел 2 дня, глядя на это, пытаясь это исправить. Любая помощь, пожалуйста?

2 ответа

Проблема с вашим кодом заключается в том, что вы выполняли присваивание в одной и той же сети через более чем 1 блок.

Не присваивайте одну и ту же переменную более чем одному всегда блоку.

Итак, ваш код должен быть таким:

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 Coding Guidelines вы можете проверить Verilog Coding Guidelines

Кроме того, я назначил "х" в коде, в соответствии с вашим исходным кодом. Но я настоятельно не рекомендую использовать назначение "x" для кода RTL.

Одна строка выглядит странно:

if (S == 0'b0)

В основном это означает "число ноль с нулевыми битами". В Verilog я думаю, что формат битов´bзначение. Замените b на h для шестнадцатеричного формата (и используйте google для остальных опций;))

Также, как говорили другие авторы, S кажется двухбитным вектором, хотя используется только MSB.

А также значение x не существует в реальном мире - это просто способ для симулятора сказать "Я не знаю". Так что не будет синтезировать.

Иначе я не вижу, где один и тот же сигнал назначается более двух раз в разных блоках всегда? Когда сделано в том же блоке, все должно быть в порядке. Последнее значение просто переопределяет предыдущее. Google для блокировки и неблокирования для получения дополнительной информации.

редактировать: также, что вы используете в качестве стимула? Если A и B являются статическими, они не вызовут событие, которое, в свою очередь, не вызовет срабатывания ни одного из блоков всегда. Следовательно, выход остается в 7'bx. Не совсем уверен в этом, но стоит проверить.

Другие вопросы по тегам