Always Block в Verilog выполняется каждый раз - PullRequest
0 голосов
/ 11 декабря 2018

У меня были проблемы с простым вычислением этого простого кода.

module diode(switch,led);
output led;
input switch;
reg led;
always@*
begin
led=1'b0;
end
endmodule

Логика заключается в следующем: нажмите кнопку, светодиод включится?

Теперь проблема, с которой я сталкиваюсь, - это всегда блок.Он должен работать так, чтобы при смене переключателя (кнопка, которую я нажимаю) светодиод включался?Но светодиод включается автоматически все время, входя в этот блок Always, даже если я ничего не нажимаю?Единственный способ «решить» это, если я добавлю операторы if / else в блоке Always, чтобы светодиод имел значение по умолчанию (если он не включен).

Мой главный вопрос: почему светодиод получает значение 1'b0 (его включение), когда я даже не нажимаю какие-либо кнопки на своей плате FPGA?

Я пытался дать базузначение для светодиода в начале и даже с этим кодом:

module diode(switch,led);
output led;
input switch;
reg led=1'b0;
always@*
begin
led = 1'b1;
end
endmodule

светодиод всегда выключен из-за того, что написано в блоке Always.В чем подвох, что я не получаю здесь?Почему так себя ведет?

Любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Код ниже будет работать

module diode(input  switch,
             output led);

  assign led = (switch)?(1'b0):(1'b1); //Since 1'b0 switches the LED on.

endmodule
0 голосов
/ 11 декабря 2018

verilog предназначен для симуляции, управляемой событиями.Это означает, что каждый блок всегда (и другие блоки) выполняется только тогда, когда происходит событие ввода.Изменение значения сигнала или фронта составляют событие, которое запускает выполнение блока.

В классическом verilog для всегда блоков сигналы запуска события перечислены в списках чувствительности.в v2k always @* должен вычислять все входы из кода, содержащегося в блоке.

В вашем случае блок Always имеет no входов, поэтому он никогда не должен выполняться,switch никогда не использовался в блоке Always.Нет никаких других входов, кроме константы, которая не может измениться и не может вызвать событие.

вам нужно предоставить некоторую логику, которая бы использовала ваш switch для того, чтобы сделать его функциональным, например:

always @*
    led = ~switch;

Он включит ваш светодиод, когда переключатель находится в положении «1» (нажат), то выключит.Если вам нужна более сложная логика, вы должны работать над ней.если вы хотите переключать состояние светодиода нажатием переключателя, вам нужно создать небольшой конечный автомат.

...