Написать код Verilog, который имеет выход только при включении
Я создаю файл регистров, который имеет 4 пустых 4-битных регистра, и с каждым тактовым циклом регистр получает значение, помещенное в него, а затем это значение отображается с использованием 7-сегментного декодера. Если регистр пуст, не должно быть отображения, но как только значение загружается в регистр, тогда должно быть отображение. Я попытался написать код verilog для 7-сегментного декодера, где вывод должен быть только при En = 1. Моя проблема в том, что вместо того, чтобы ничего не отображать, 7-сегментный декодер будет отображать ноль, пока значение не будет добавлено в регистр, в В этом случае декодер отобразит загруженное значение. Вот код verilog.
module seven_seg_decoder(S, Z, Y, X, W,En);
input Z,Y,X,W,En;
output [6:0] S;
reg [6:0] S;
always @(En)
begin
case({Z,Y,X,W,En})
5'b00001: S = 'b0000001;
5'b00011: S = 'b1001111;
5'b00101: S = 'b0010010;
5'b00111: S = 'b0000110;
5'b01001: S = 'b1001100;
5'b01011: S = 'b0100100;
5'b01101: S = 'b0100000;
5'b01111: S = 'b0001111;
5'b10001: S = 'b0000000;
5'b10011: S = 'b0000100;
5'b10101: S = 'b0001000;
5'b10111: S = 'b1100000;
5'b11001: S = 'b0110001;
5'b11011: S = 'b1000010;
5'b11101: S = 'b0110000;
5'b11111: S = 'b0111000;
endcase
end
endmodule
Когда регистр загружается со значением, у меня есть выход из регистра, говорящий, что он загружен, и который используется в качестве входа для включения на этом декодере
1 ответ
Посмотрите на возможные кодировки {Z, Y, X, W, En}
что вы перечислили:
5'b00001: S = 'b0000001;
5'b00011: S = 'b1001111;
5'b00101: S = 'b0010010;
5'b00111: S = 'b0000110;
5'b01001: S = 'b1001100;
5'b01011: S = 'b0100100;
5'b01101: S = 'b0100000;
5'b01111: S = 'b0001111;
5'b10001: S = 'b0000000;
5'b10011: S = 'b0000100;
5'b10101: S = 'b0001000;
5'b10111: S = 'b1100000;
5'b11001: S = 'b0110001;
5'b11011: S = 'b1000010;
5'b11101: S = 'b0110000;
5'b11111: S = 'b0111000;
// ^ Look here
Все значения En
являются 1
! Вы никогда не говорили модулю, что делать, если En
является 0
, Он не знает, чтобы очистить дисплей. Вы должны дать ему что-то сделать в этом случае.
У вас есть несколько вариантов:
Простое решение
Вы можете добавить предложение по умолчанию, которое закрывает отображение во всех случаях, которые не были перечислены:
default: S = 'b0000000; //change to whatever means "turn everything off"
Слишком сложное решение
Вы можете получить более точную информацию, используя 5'bxxxx0 в качестве предложения и casex
заявление:
casex ({Z,Y,X,W,En})
// all other enumerated cases
5'bxxxx0: S = 'b0000000; //change to "everything off"
default: S = 'b0000000; //change to "everything off"
Но знайте, что есть некоторые потенциальные ловушки casex
это может затруднить правильное использование и привести к неожиданному поведению. Также обратите внимание, что это заканчивается тем же, что и первое, простое решение. Я бы избежал этого сейчас.
(My) Предпочтительное решение
По сути, это то же самое, что и первые два, но я думаю, что намерение гораздо яснее:
always @(*)
begin
if (!En)
S = 'b0000000; // change to "everything off"
else
case({Z,Y,X,W,En})
5'b00001: S = 'b0000001;
5'b00011: S = 'b1001111;
5'b00101: S = 'b0010010;
5'b00111: S = 'b0000110;
5'b01001: S = 'b1001100;
5'b01011: S = 'b0100100;
5'b01101: S = 'b0100000;
5'b01111: S = 'b0001111;
5'b10001: S = 'b0000000;
5'b10011: S = 'b0000100;
5'b10101: S = 'b0001000;
5'b10111: S = 'b1100000;
5'b11001: S = 'b0110001;
5'b11011: S = 'b1000010;
5'b11101: S = 'b0110000;
5'b11111: S = 'b0111000;
default: S = 'b0000000; // change to some error code
endcase
end
Преимущество этого решения состоит в том, что цель вашего кода гораздо более ясна: если En
это не так, то остальные сигналы не имеют значения. Мы очищаем дисплей. Это происходит и с другими решениями, но эта структура делает более очевидным, что происходит.
default
дело здесь технически не нужно. Там не должно быть никаких случаев, когда En
верно, что не перечислены. Но это много цифр, чтобы напечатать. Если вы сделали опечатку, в этих случаях наличие по умолчанию, которое вызывает отображение ошибки (возможно, только центральная линия дисплея 7seg?), Поможет вам идентифицировать ошибку.
Несколько других заметок:
Вы должны избегать использования
X
а такжеZ
как имена переменных. Они могут быть перепутаны из-за "все равно" и "высокого сопротивления". Это делает код сложнее следовать, чем он должен быть.Я изменил ваш список чувствительности. Грег правильно указал, что если вы хотите, чтобы ваш вывод корректно обновлялся при вводе
W
,X
,Y
а такжеZ
изменить, вам нужноalways
блок, который будет срабатывать при их изменении.*
оператор скажет компилятору Verilog вывести правильный список чувствительности на основе содержимогоalways
блок. (Обратите внимание, что здесь не рассматриваются задачи или функции для определения списка чувствительности.)Я настоятельно рекомендую вам поместить все ваши битовые шаблоны в параметры, чтобы сделать ваш код более читабельным.