Не могу использовать в блоке verilog всегда - PullRequest
0 голосов
/ 22 ноября 2018

Я получаю эту ошибку от 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.

1 Ответ

0 голосов
/ 24 ноября 2018

Вы смешиваете комбинационную логику и синхронную логику в блоке always, и это плохая привычка кодирования.Как правило, в большинстве конструкций есть 2 основных always блока.

Комбинация:

always@(*) // * adds anything under this always block to sensitivity list.
begin      // Which makes this always block combinational.
    count_reg_d <= somelogic;
end

Затем эта комбинационная логика присваивается соответствующим регистрам в последовательном блоке всегда:

always@(posedge clk, negedge rst)
begin
    if(~rst)
        count_reg_q <= 0;
    else
    begin
        count_reg_q <= count_reg_d;
    end
end

Кодируя таким образом, вы избегаете смешанного всегдаблоки, и код гораздо более читабелен и ближе к аппаратному обеспечению, которое синтезируется.Поэтому, если вы правильно обновите список чувствительности блоков always, проблемы должны быть решены.

...