2013-06-07 2 views
2

Я новичок в VHDL. Я использую последовательный последовательный 72-разрядный сдвиговый регистр с использованием VHDL. Когда сигнал разрешения высок, я хочу, чтобы сдвиговый регистр сдвигался 72 раза, независимо от того, продолжает ли включение оставаться высоким или низким. Я написал следующий код, который работает только при высоком разрешении. Может ли кто-нибудь помочь мне сдвинуть данные после того, как разрешение будет высоким, а затем не будет зависеть от возможности переноса данных?VHDL Сменный регистр с разрешением


library ieee; 
use ieee.std_logic_1164.all; 

entity SR is 
    port(clk, din, rst, enable : in std_logic; 
     sr_out : inout std_logic_vector(71 downto 0)); 
end SR; 

architecture behavioral of SR is 
    signal shift_reg: std_logic_vector(71 downto 0); 
begin 

process (clk, rst) 
begin 
    if (rst = '0') then 
     shift_reg <= (others => '0'); 
    elsif (clk'event and clk = '1') then 
     if enable= '1' then 
     shift_reg(70 downto 0) <= shift_reg(71 downto 1); 
     shift_reg(71) <= din; 
     end if; 
    end if; 

end process; 
sr_out <= shift_reg; 
end behavioral; 

Спасибо большое!

ответ

0

Для этого вам понадобится машина с двумя состояниями. Вот очень хорошая идея, как это сделать. Я почти уверен, что он делает то, что вам нужно или очень близко.

library ieee; 
use ieee.std_logic_1164.all; 

entity SR is 
    port(
     clk  : in std_logic; 
     din  : in std_logic; 
     rst  : in std_logic; 
     enable : in std_logic; 
     sr_out : inout std_logic_vector(71 downto 0) 
    ); 
end SR; 

architecture behavioral of SR is 
    signal shift_reg : std_logic_vector(71 downto 0); 
    signal shift_cnt : integer range 0 to 72 := 0; 

    type T_STATE_TYPE is (IDLE, COUNTING); 
    signal current_state : T_STATE_TYPE; 

begin 

p_shift_counter : process(clk,rst) 
begin 

    if rst = '1' then 
     current_state <= IDLE; 
     shift_cnt <= 0; 

    elsif rising_edge(clk) then 

     if (current_state = IDLE) then --no enable detected yet 
     shift_cnt <= 0; 
     if enable = '1' then 
      current_state <= COUNTING; 

     end if;  

     elsif (current_state = COUNTING) then --will stay in that state until it finishes counting 
     if (shift_cnt < 72) then 
      shift_reg(0) <= din; 
      for i in 0 to 71 loop shift_reg(i+1) <= shift_reg(i); end loop; --shifting register 
      shift_cnt <= shift_cnt + 1; 
     else 
      current_state <= IDLE; --finished counting 
     end if; 

     end if; 

    end if; 

end process; 

sr_out <= shift_reg; 

end behavioral; 
2

Я думаю, что вам нужен RS-FlipFlop, который устанавливается сигналом . Его выход - это ваш сигнал. Сигнал также запускает счетчик тактовых импульсов 72. Когда счетчик опрокидывается (или достигает нуля, в зависимости от его направления), вы возвращаете FlipFlop, что приводит к отключенному регистру сдвига.

редактировать: Кроме того, вы можете добавить ворота в старта сигнала, который блокирует новые начала импульсов, пока счетчик активен. Таким образом, вы можете быть уверены, что ваши данные сдвинуты с точностью до 72 бит.