Как поставить счетчик 2 сек в цикл - PullRequest
1 голос
/ 16 января 2012

Я хочу, чтобы в моем цикле for был 2-секундный счетчик, чтобы между каждой итерацией был промежуток в 2 секунды. Я пытаюсь использовать сдвигающий светодиодный дисплей

Код:

 parameter n =10;
 integer i;

 always@(*)
 begin
    for(i=0;i<n;i=i+1)
    begin
       LEDR[i]=1'b1;
       //2 second counter here
    end

 end

Ответы [ 2 ]

4 голосов
/ 17 января 2012

Какой желаемый функционал? Я предполагаю: сдвигать какой светодиод включен каждые 2 секунды, оставляя все остальные светодиоды выключенными? "Скользящий светодиод" ...

Кроме того, я предполагаю, что ваша цель - плата типа FPGA.

В мире FPGA не существует бесплатного «время ожидания Х». Ключ к тому, что вы пытаетесь сделать, это подсчет тактов. Вам нужно знать тактовую частоту часов, которые вы используете для этого блока. Как только вы это узнаете, вы можете рассчитать, сколько нарастающих фронтов тактового генератора вам нужно посчитать, прежде чем нужно будет предпринять «действие».

Я рекомендую два процесса. В одном из них вы будете наблюдать за нарастающим фронтом часов и запустить счетчик достаточного размера, чтобы он переворачивался каждые две секунды. Каждый раз, когда ваш счетчик равен 0, вы устанавливаете «флаг» для одного такта.

Другой процесс просто будет наблюдать за появлением «флага». Когда появляется флаг, вы переключаете, какой светодиод включен, и выключаете все остальные светодиоды.

3 голосов
/ 17 января 2012

Я думаю, что этот модуль реализует то, что описывал Джош.Этот модуль создаст два регистра: регистр счетчика (counter_reg) и регистр сдвига (leds_reg).Регистр счетчика будет увеличиваться один раз за такт, пока он не перевернется.Когда он переворачивается, переменная «tick» будет равна 1. Когда это произойдет, регистр сдвига будет вращаться на одну позицию влево.

module led_rotate_2s (
    input wire clk,
    output wire [N-1:0] leds,
);

parameter N=10;                 // depends on how many LEDs are on your board
parameter WIDTH=<some integer>; // depends on your clock frequency
localparam TOP=<some integer>;  // depends on your clock frequency

reg [WIDTH-1:0] counter_reg = 0, counter_next;
reg [N-1:0] leds_reg = {{N-1{1'b0}}, 1'b1}, leds_next;

wire tick = (counter_reg == 0);

assign leds = leds_reg;

always @* begin : combinational_logic
    counter_next = counter_reg + 1'b1;
    if (counter_next >= TOP)
        counter_next = 0;
    leds_next = leds_reg;
    if (tick)
        leds_next = {leds_reg[N-2:0], leds_reg[N-1]}; // shift register
end

always @(posedge clk) begin : sequential_logic
    counter_reg <= counter_next;
    leds_reg <= leds_next;
end

endmodule
...