Секвенсор VHDL: увеличение выходных сигналов в FSM

Я работаю над секвенсором и не могу понять, как увеличить некоторые выходные сигналы. В состоянии 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;

person user2863635    schedule 09.10.2013    source источник


Ответы (2)


Вы можете использовать два регистра счетчика.

   ...
   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.

person Community    schedule 09.10.2013

Нет необходимости в отдельном процессе - сделайте что-то вроде этого:

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
person Martin Thompson    schedule 10.10.2013