¿Uso del estado siguiente y del divisor de reloj?

-1

Tengo un divisor de reloj y una máquina de estados como esta:

signal clk_200Hz : std_logic := '0';
signal counter : unsigned(19 downto 0) := x"00000";
begin

clkdiv : process (clk_100Mhz)
begin
    if rising_edge(clk_100Mhz) then
        if counter = x"00000" then
            counter <= X"3D090"
            clk_200Hz <= not clk_200Hz;
        else
            counter <= counter - 1;
        end if;
    end if;
end process clkdiv;

Estados:

 type SM_STATES is (state_column_1, scan_col_1, state_column_2, scan_col_2,
                          state_column_3, scan_col_3);
 signal my_state     : SM_STATES                   := state_column_1;
 -- By next state I mean something like this :
 -- signal my_state, my_next_state     : SM_STATES                   := state_column_1;

A continuación se muestra la máquina de estado:

scanner_sm : process (clk)
begin  -- process key_scanner
  if clk'event and clk = '1' then

  if clk_200Hz = '1' then -- clock divider finished counting down 

    -- reset scan_complete
    scan_complete <= '0';

case my_state is

  when state_column_1 =>
    scanned_val  <= (others => '0');
    original_col   <= "110";
    my_state <= scan_col_1;

  when scan_col_1 =>
    case bcd_val is
      when "1110" => 
      out_flag <= '1';
      scanned_val <= "1100100";  -- 1 wrong
      when "1101" => 
      out_flag <= '1';
      scanned_val <= "1100010";  -- 2 wrong
      when others => 
      out_flag <= '0';
      scanned_val <= "0010000";
    end case;
    my_state <= state_column_2;

  when state_column_2 =>
    original_col   <= "011";
    my_state <= scan_col_2;

  when scan_col_2 =>
    case bcd_val is
      when "1110" => 
    out_flag <= '1';
    scanned_val <= "1011011";  -- 5 wrong
      when "1101" => 
    out_flag <= '1';
    scanned_val <= "1011111";  -- 6 wrong
      when others =>
      out_flag <= '0';
      scanned_val <= "0000000";
    end case;
    my_state <= state_column_3;

  when state_column_3 =>
    original_col   <= "101";
    my_state <= scan_col_3;

  when scan_col_3 => -- Reading S1 // The only working state
    case bcd_val is
      when "1110" =>
    out_flag <= '1'; 
    scanned_val <= "1100000";  -- 9/ 1
      when "1101" => 
    out_flag <= '1';
    scanned_val <= "0111110";  -- X/ 2
      when others =>
     out_flag <= '0';
     scanned_val <= "0000000";
    end case;
    my_state <= state_column_1; -- 
    scan_complete <= '1'; -- 

  when others => scanned_val <= "0000000";
end case;

      end if;
  end if;
end process scanner_sm;

Pregunta 1: No tengo el siguiente estado y todo funciona bien, ¿lo necesito? ¿Para que sirve? Si todo funciona sin él, ¿por qué la gente lo necesita? Por siguiente estado me refiero a un segundo tipo de estado que contiene los mismos estados, comienza con my_state, final de cada estado, el estado cambia a my_next_state y después de cada reloj ascendente my_state <= my_next_state . ¿Es esto mealy o moore? Según mi opinión ¿Cuántos procesos están involucrados en esto y cuáles son?

Pregunta 2: La máquina de estado se activa solo si clk_200Hz es "1" Tengo 6 estados, ¿un escaneo completo toma 1200 Hz o 200 Hz? Mi pregunta es: ¿voy a cada estado cada 200 Hz o en 200Hz se están escaneando los 6 estados? Si alguien puede elaborar estos eventos de reloj para la máquina de estado, ¡me alegraría!

Pregunta 3: ¿Cómo puedo controlar la duración de out_flag ? Me gustaría hacer que digamos 70 ms. Me gustaría aumentar su duración o tal vez disminuir. ¿Cómo puedo hacer esto? El valor predeterminado de out_flag es cero.

¡Muchas gracias por leer!

    
pregunta Anarkie

2 respuestas

1
  1. Ya definió un estado siguiente en su proceso cronometrado. Si tuvieras un proceso de siguiente estado no sincronizado (combinacional), entonces definirías explícitamente una señal next_state y lo dirigirías a un proceso temporizado definido en otro lugar.

  2. Si su habilitación clk_200hz pulsa cada 200Hz y su máquina de estados tiene 6 estados, tomará 6 pulsos de habilitación para recorrer su máquina de estados completa. Entonces, supongo que a 1200 Hz, pero esa es una forma un tanto inusual de pensar en ello.

  3. Lo más sencillo sería crear un estado de espera separado después de cada estado que establece out_flag y que el nuevo estado de espera espere 70 ms antes de pasar al estado siguiente.

Editado :

Para 3: agrega algo como esto después de cada uno de tus estados

when example_wait1 =>
    if (count = 70) then -- adjust count to 70ms based off your clock speed
        count    <= (others => '0');
        my_state <= next_state;
    else
        count    <= count + 1;
        my_state <= example_wait1;
    end if;
...
when example_wait2 =>
    if (count = 70) then -- adjust count to 70ms based off your clock speed
        count    <= (others => '0');
        my_state <= next_state;
    else
        count    <= count + 1;
        my_state <= example_wait2;
    end if;
...
    
respondido por el mrbean
0

1.No hay ninguna palabra clave en VHDL llamada next_state . Si cambia de un estado a otro en cualquier señal, entonces tiene un estado presente y el siguiente. La máquina que consideraste aquí es Mealy ya que su salida ( out_flag ) depende de la entrada ( scanned_val ) y el estado actual.

2.Esto depende de la frecuencia de clk . El proceso scanner_sm se llama cada vez que se cambia clk . Y va a su declaración de caso si clk_200Hz es alto (nivel disparado). Supongo que su clk_200Hz tiene una frecuencia de 200Hz.

  • Si la frecuencia de clk > > frecuencia de clk_200Hz , luego se requieren menos de 0.5 ms (período de tiempo de la señal de 200 Hz) para escanear sus 6 estados.
  • If Si la frecuencia de clk < < frecuencia de clk_200Hz , entonces depende del período de tiempo de clk que sería mayor que 0.5ms.

3. Creo que quería asignar el valor de out_flag a algún pin del procesador. Para eso, escriba un proceso como el que se muestra a continuación y agréguelo después de su proceso clkdiv .

proc1:process(processor_pin)
begin
wait for 70 ms;
processor_pin <= out_flag;
end process proc1
    
respondido por el nidhin

Lea otras preguntas en las etiquetas