Я новичок в verilog и застрял в один любопытный момент. Я пытаюсь сделать циклические светодиоды мигающими (зеленые огни слева направо и красные справа налево). У меня 12 светодиодов, и я синхронизирую свою программу с clock(CLK)
.Правильный арифметический (цикл) сдвиг в verilog
Я хотел использовать арифметический сдвиг для этого, но по какой-то причине <<<
и >>>
ведут себя как <<
и >>
, поэтому сдвиг не является циклическим. Почему это так? Я делаю что-то неправильно?
Я помещаю весь код только в случае, если это необходимо, его очень мало:
module test1(
input CLK,
output [11:0] MLED
);
reg [11:0] tmp;
reg [11:0] tmpred;
reg [11:0] tmpgreen;
assign MLED = tmp;
reg [1:0] COUNTER;
wire [1:0] COUNTER_WIRE;
assign COUNTER_WIRE=COUNTER;
wire LOG;
assign LOG=(COUNTER_WIRE==2'd3) ? 1'b1 : 1'b0;
initial
begin
tmp<=12'b100000000001;
tmpred<=12'b000000000001;
tmpgreen<=12'b100000000000;
COUNTER<=0;
end
[email protected](posedge CLK)
begin
if (LOG)
begin
tmpred <= $signed(tmpred) <<< 2;
tmpgreen <= $signed(tmpgreen) >>> 2;
tmp <= tmpred | tmpgreen;
end
COUNTER <= COUNTER + 1'b1;
end
endmodule