2015-05-20 5 views
0

Я новичок в 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 

ответ

2

<<< и >>> подписаны операторы сдвига - т.е. 0xF0 >>> 1 = 0xF8 против 0xF0 >> 1 = 0x78. Правое смещение будет по-разному, но <<< будет таким же, как <<.

Чтобы сделать циклическую сдвиг вправо, используйте вместо этого tempred <= {tempred[0],tempred[11:1]};.

 Смежные вопросы

  • Нет связанных вопросов^_^