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. Не совсем уверен в этом, но стоит проверить.