Я получаю эту ошибку от Quartus при попытке компиляции:
Ошибка (10200): ошибка условного оператора HDL Verilog в time_of_day_FSM.v (166): невозможно сопоставить операнд (ы) вусловие для соответствующих ребер во включающем элементе управления событиями конструкции Always
Вот некоторый фон.Я делаю часы, и для этого блока always
я хочу увеличить и установить определенные значения, чтобы они напоминали поведение часов в формате hh:mm:ss
.У меня есть источник синхронизации, который увеличивается каждую миллисекунду, и использую счетчик для установки secondPassed
reg.
Я хочу, чтобы код в блоке обновлялся каждый раз, когда проходит секунда, например, часы или когда на моей доске нажимается KEY[2]
(down = 0
), поскольку это то, что пользователь использует для увеличениячасы, минуты или секунды при установке часов.Вот блок always
, о котором идет речь (извините за вложенные операторы if, я не могу придумать лучшего способа сделать это):
// every second. Used just to keep time going. Independent of states.
always @(posedge secondPassed, negedge KEY[2], negedge KEY[0]) begin
if(KEY[0] == 0) begin
hr1 <= 1;
hr0 <= 2;
min1 <= 0;
min0 <= 0;
sec1 <= 0;
sec0 <= 0;
end
else if(secondPassed == 1 || KEY[2] == 0) begin // I don't care about explicitly stating the conditions, as the sensitivity list covers that right?
if(sec0 == 9) begin
sec0 <= 0;
if(sec1 == 5) begin
sec1 <= 0;
if(min0 == 9) begin
min0 <= 0;
if(min1 == 5) begin
min1 <= 0;
if(hr1 == 1) begin
if(hr0 == 2) begin
hr0 <= 1; // go to 1 o'clock
hr1 <= 0;
end
else hr0 <= hr0 + 1;
end
else hr0 <= hr0 + 1;
end
else min1 <= min1 + 1;
end
else min0 <= min0 + 1;
end
else sec1 <= sec1 + 1;
end
else begin
sec0 <= sec0 + 1;
end
just_flashed <= ~just_flashed;
end // end big else
end // end always
Мой вопрос: почему жалуется компилятор Quartusесли я попытаюсь сделать сценарий без сброса ПРОСТО И ПРОСТО, как это:
// every second. Used just to keep time going. Independent of states.
always @(posedge secondPassed, negedge KEY[2], negedge KEY[0]) begin
if(KEY[0] == 0) begin
hr1 <= 1;
hr0 <= 2;
min1 <= 0;
min0 <= 0;
sec1 <= 0;
sec0 <= 0;
end
else begin // this is causing the issue. compiler complains .
// same logic to drive clock as above
just_flashed <= ~just_flashed;
end // end big else
end // end always
Я чувствую, что видел много примеров, когда люди просто используют, а другие начинают заканчиваться для своего кода.Мой код, кажется, хочет, чтобы мой ЯВНО подтвердила условия списка чувствительности для остального if.Любое объяснение?Я новичок в крупных проектах Verilog.