Как реализовать делитель часов в универсальный сдвиговый регистр

Я пытаюсь сделать код VHDL для 4-битного универсального регистра сдвига, где я хочу загрузить 4 бита и выбрать операцию сдвига с помощью Ctrl. Я не знаю, как реализовать делитель тактовой частоты для запуска выходов на FPGA.

Вот мой код:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity shift_register is
  generic(N : integer := 4);
  port(
    clk, reset : in  std_logic;
    ctrl       : in  std_logic_vector(1 downto 0);
    d          : in  std_logic_vector((N-1) downto 0);
    q          : out std_logic_vector((N-1) downto 0)
    );
end shift_register;

architecture Behavioral of shift_register is

  signal r_reg  : std_logic_vector((N-1) downto 0);
  signal r_next : std_logic_vector((N-1) downto 0);
begin
  process(clk, reset)
  begin
    if(reset = '1') then
      r_reg <= (others => '0');
    elsif(clk'event and clk = '1') then
      r_reg <= r_next;
    end if;
  end process;

  with ctrl select
    r_next <=
    r_reg                      when "00",   --do nothing
    r_reg(N-2 downto 0) & d(0) when "01",   --shift left
    d(N-1) & r_reg(N-1 downto 1)when "10",  --shift right
                     d when others;         --load

  q <= r_reg;
end Behavioral;

person user2466860    schedule 19.09.2014    source источник
comment
Как вопрос делителя часов связан с показанным сдвиговым регистром? Можете ли вы описать более подробно, чего вы хотите достичь?   -  person Morten Zilmer    schedule 19.09.2014
comment
Нет признаков делителя тактовой частоты, нет указаний на исходную тактовую частоту или целевую тактовую частоту, соотношение, целевое устройство/поставщик, ...   -  person    schedule 19.09.2014
comment
@MortenZilmer Я хочу загрузить некоторые входные биты с помощью переключателей на fpga. Ctrl выберет, в какую сторону пойдут биты. И результат будет показан на светодиодах на FPGA. Поэтому я просто хочу реализовать часы, которые будут смещаться каждую секунду.   -  person user2466860    schedule 19.09.2014
comment
@ user2466860: Есть ли уже вход clk на FPGA. Я так предполагаю, поскольку ctrl и d должны быть синхронны с этим clk. Затем этот clk можно использовать для получения сигнала включения, который выдается один цикл каждую секунду, и затем это разрешение можно использовать для выполнения желаемого обновления.   -  person Morten Zilmer    schedule 19.09.2014
comment
@MortenZilmer Спасибо. Как мне изменить код сейчас? Я новичок в программировании VHDL и очень плохо разбираюсь в часах.   -  person user2466860    schedule 19.09.2014
comment
@ user2466860: Пример кода для делителя часов в ответе ниже. Не то чтобы вы должны затем применить enable там, где он находится, чтобы управлять обновлением.   -  person Morten Zilmer    schedule 19.09.2014


Ответы (1)


Шаблон кода делителя с enable утверждает один цикл каждые RATIO тактов:

library ieee;
use ieee.numeric_std.all;

architecture syn of mdl is
  constant RATIO  : natural := 10;
  signal prescale : std_logic_vector(9 downto 0);  -- Scale to fit RATIO - 1
  signal enable   : std_logic;
begin

  process (clk, reset) is
  begin
    if reset = '1' then
      enable   <= '0';
      prescale <= std_logic_vector(to_unsigned(RATIO - 1, prescale'length));
    elsif rising_edge(clk) then
      if unsigned(prescale) = 0 then
        enable   <= '1';
        prescale <= std_logic_vector(to_unsigned(RATIO - 1, prescale'length));
      else
        enable   <= '0';
        prescale <= std_logic_vector(unsigned(prescale) - 1);
      end if;
    end if;
  end process;

end architecture;
person Morten Zilmer    schedule 19.09.2014