带有使能的VHDL移位寄存器

时间:2013-06-07 11:15:04

标签: vhdl

我是VHDL的新手。我正在使用VHDL实现串行输出72位移位寄存器。当使能信号为高电平时,我希望移位寄存器移位72次,无论使能是继续为高电平还是低电平。我编写了以下代码,该代码仅在启用高时才起作用。任何人都可以帮助我在启用高电平后移位数据然后不依赖于启用移位数据吗?


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; 

非常感谢!

2 个答案:

答案 0 :(得分:2)

我认为您需要一个由 start 信号设置的RS-FlipFlop。它的输出是 enable 信号。 start 信号也会启动72个时钟周期计数器。当计数器翻转(或达到零,取决于其方向)时,您将重置FlipFlop,从而导致禁用移位寄存器。

编辑此外,您可以在 start 信号中添加一个门,该信号会在计数器处于活动状态时阻止新的 start 脉冲。因此,您可以确保您的数据仅以72位的倍数移位。

答案 1 :(得分: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;