código vhdl: una codificación en caliente del estado

5

si estoy usando una codificación activa para los estados y quiero pasar de S0 - > S1 - > S2 - > S3 - > S0

Al parecer el siguiente código hace esto. Sin embargo, no estoy seguro de cómo funciona la parte de asignación de estado en el fragmento (los comentarios mencionan una rotación de 1 bit ...). ¿Alguien puede explicar CÓMO funciona esta rotación? por qué "& estado (2)", etc. También sería extremadamente útil si pudiera proporcionar una representación de hardware simple del fragmento de código.

process (clk) begin
  if rising_edge(clk) then
    if reset = '1' then
      state <= S0;
    else
    --rotate state 1 bit to left
    state <=
      state(1 downto 0)
      & state(2);
    end if;
  end if;
end process;

En la arquitectura se nos dice que S0 = 0001, S1 = 0010, S2 = 0100, S3 = 1000

    
pregunta rrazd

2 respuestas

5

En la práctica, nunca usarás explícitamente una codificación activa. Más bien, debe diseñar su archivo VHDL de modo que utilice enumeración en lugar de estados explícitos. Esto permite que las herramientas de síntesis que utiliza para generar su diseño produzcan su propia codificación preferida. En un CPLD, esto probablemente sería una codificación densa, porque las puertas son más abundantes que las chanclas. En un FPGA, este probablemente sería uno caliente, porque las chanclas son más abundantes. En otros casos aleatorios, el sintetizador podría pensar que la codificación gris, o la codificación secuencial, podría ser mejor.

Sin embargo, para responder a su pregunta, ¿cómo realiza esto una rotación? (note que estoy usando su estado original de 3 bits, aunque su pregunta se refiere a estados de 4 bits)

Considere el estado="001". Por lo tanto, el estado (1 abajo a 0)="01". Además, el estado (2) = '0'.

Por lo tanto, cuando haces el estado < = estado (1 abajo a 0) & estado (2), estás haciendo estado <="01" & '0'. Esto ahora significa estado="010"; una rotación a la izquierda por un bit.

En un lenguaje sencillo, para rotar un vector de n bits a la izquierda en un bit, tome los más bajos n-1 bits y concatene el MSB en el lado derecho. En este ejemplo, toma los bits de estado (1 a 0) y el estado de concatenación (2) en el lado derecho.

En contraste, una rotación a la derecha se representaría como estado < = estado (0) & Estado (2 abajo a 1). Esto toma el LSB, y luego concatena los bits superior n-1 en el lado derecho de este. Para state="001", esta rotación a la derecha sería como state < = '1' & "00". Esto ahora significa estado="100".

    
respondido por el ajs410
1

Creo que la lógica es incorrecta ... tienes un vector de estado de cuatro bits, pero solo estás usando tres de los bits en cualquier lógica. Es obvio que para recorrer los estados, todo lo que tiene que hacer es cambiar los bits dejados por uno con rotación a la derecha. Simplemente haga una tabla que muestre la secuencia de estado deseada:

S0 0 0 0 1
S1 0 0 1 0
S2 0 1 0 0
S3 1 0 0 0
S0 0 0 0 1
...

El hardware para esto es solo cablear la salida del registro de 4 bits en sí mismo con las líneas cruzadas para obtener el efecto anterior.

A saber: Estado (0) < = Estado (3), Estado (1) < = Estado (0), Estado (2) < = Estado (1), Estado (3) < = Estado ( 2)

La forma abreviada de indicar que es formar un nuevo vector del antiguo como este:

NewState(3 downto 0) = { State(2 downto 0), State(3) }
State <= NewState

No estoy seguro de que mi sintaxis sea perfecta, pero creo que es lo esencial; Creo que lo que escribí es algo como un mashup Verilog / VHDL. De todos modos, solo desea expresar el cableado hacia el lugar correcto para que el 1 se desplace a la izquierda y alrededor de cada reloj.

Como se anotó en @mng - el '&' el operador concatena los vectores de bits y no realiza una lógica y, como se podría pensar.

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas