сеть с несколькими приводами, или reg не управляется

#verilog

#verilog

Вопрос:

Я работаю над заданием, в котором мне нужно создать игру с джекпотом. Но у меня возникли проблемы с управлением регистром, который управляет условием выигрыша, и я не могу понять, почему. Насколько я знаю, блок always@ (posedge zero) должен иметь возможность запускаться всякий раз, когда я перевожу переключатель в положение up. Затем, пока правильное значение горячего регистра происходит в одно и то же мгновение, он должен иметь возможность установить регистр win. Однако это не так. Кажется, ничего не происходит, и я не уверен, почему. Я пробовал запускать блок always с разной чувствительностью, но, похоже, на это ничего не влияет. Может быть, я просто неправильно понимаю, как всегда работают блоки или как работает коммутатор, любая помощь приветствуется.

 module jackpot(
    input [3:0] SWITCHES,
    output [3:0] LEDS,
    input CLOCK,
    input reset
    );
    
    reg [3:0] hot = 4'd1;
    reg win;
    wire clk, zero, one, two, three;
    Clock_Div CDD (CLOCK, clk);
    
    assign LEDS[2:0] = hot[2:0];
    assign zero = SWITCHES[0];
    assign one = SWITCHES[1];
    assign two = SWITCHES[2];
    assign three = SWITCHES[3];
    assign LEDS[3] = zero;
    
    initial begin
        win <= 1'b0;
    end
    
    always @(posedge zero) begin
        if(hot[0] amp;amp; zero)
            win <= 1'd1;
    end
    
    always @(posedge clk) begin
        if (reset == 1'b1) begin
            hot <= 4'd1;
            win <= 1'd0;
        end
        else if(win == 1'b1) begin
            hot <= 4'b1111;
        end
        else begin
            if(hot == 4'b1000) begin
                hot <= 4'b0001;
            end
            else begin
                hot <= hot << 1;
            end
        end
    end
    
    
endmodule 

Комментарии:

1. Вы собираетесь сделать из этого аппаратное обеспечение? Если это так, у вас большие проблемы. Этот код не поддается синтезированию. Вам нужно разобраться с этим, прежде чем беспокоиться о деталях его поведения. В принципе, вам нужно узнать о синтезируемых стилях кодирования в Verilog, и вам нужно определить, какое оборудование вы пытаетесь создать, прежде чем начинать кодирование.

2. вы не должны управлять ‘win’ из разных блоков always. это делает поведение моделирования непредсказуемым.

3. @Serge спасибо за комментарий, это была именно проблема. Должно быть, это было затушевано в классе или что-то в этом роде. Теперь он работает нормально.

Ответ №1:

Благодаря комментарию Сержа я понял проблему. Как говорится в его комментарии, управление регистром из нескольких блоков always выдает критическое предупреждение, и Vivado выбирает один из блоков для использования поверх другого. Как только я убедился, что изолировал reg от always block, поведение стало выглядеть так, как я ожидал. Должно быть, это просто что-то, о чем умолчали во время урока, или, может быть, я недостаточно уделял внимания.