2013-10-09 4 views
0

Я работаю над секвенсером, и я не могу понять, как увеличить некоторые выходные сигналы. В состоянии 1 (S1) Я хочу увеличить ram_add_wr (на каждом такте).VHDL-секвенсор: увеличение выходных сиг- налов в FSM

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; 

ответ

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.

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

 Смежные вопросы

  • Нет связанных вопросов^_^