0

我正在研究音序器,但我不知道如何增加一些输出信号。在状态 1 ( S1) 我想增加ram_add_wr(在每个时钟周期)。

clocked_process:PROCESS(clk,rst)
    VARIABLE count: INTEGER RANGE 0 TO 32;
BEGIN  
      IF (rst = '0') THEN  
          pr_state <= idle; 
          count := 0;
      ELSIF (clk'event AND clk='1') THEN    
          count := count+1;
          IF (count>=timer) THEN
              pr_state <= nx_state;
              count := 0;
          END IF;
      END IF;
END PROCESS;        

PROCESS(pr_state, en) 
BEGIN         
    CASE pr_state IS
        WHEN idle =>  
        timer <= 1;
            IF (en = '1') THEN
                sig_ram_add_wr <= "00000";  
                nx_state <= s1;  
            ELSE
                nx_state <= idle;
                sig_ram_add_wr <= "00000";  
    END IF;

        WHEN s1 =>           
        timer <= 32;
            IF (en ='1') THEN
        --timer <= 1;
4

2 回答 2

1

您可以使用两个计数器寄存器。

   ...
   signal cntReg, cntReg_next: integer range 0 to 31 := 0;

begin

   -- Clocked process --
   ...
   elsif (clk'event and clk='1') then
       if (pr_state = s1) then
           cntReg <= cntReg_next;
       end if;
       ...
   ...


   -- Combined process --
   ...
   when s1 =>
      cntReg_next <= cntReg + 1;
   ...

   -- output (depends on the type of sig_ram_add_wr)
   sig_ram_add_wr <= std_logic_vector(to_unsigned(cntReg, 5));  

在其他状态下,您需要将cntReg和都重置cntReg_next为 0。

于 2013-10-09T16:25:00.253 回答
0

不需要一个单独的过程 - 做这样的事情:

clocked_process:PROCESS(clk,rst)

    VARIABLE count: INTEGER RANGE 0 TO 32;
    variable addr : unsigned(sig_ram_add_wr'range);
BEGIN  

      IF rst = '0' THEN  
          ...
          addr := (others => '0';
      ELSIF rising_edge(clk) THEN    
          ...
          if pr_state = s1 then
             addr := addr + 1; -- update the address counter here
          end if;
          ...
      END IF;
      sig_ram_add_wr <= std_logic_vector(addr); -- copy it onto the output pins here - as this is outside the clocked element, the synthesiser will just create a wire
END PROCESS;        

其他注意事项:

  • 无需括号围绕您的if条件
  • 如果rst要低电平有效,我会在信号/引脚名称中指出(我通常使用_n后缀,所以rst_n
于 2013-10-10T10:47:16.573 回答