#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, поведение стало выглядеть так, как я ожидал. Должно быть, это просто что-то, о чем умолчали во время урока, или, может быть, я недостаточно уделял внимания.