Notas de estudio FPGA (1) -12-19

1. Bloqueo y no bloqueo:

      1. La ejecución de la asignación de bloqueo puede ser considerada como una operación con un solo paso, es decir, calcular el valor de RHS y actualizar LHS, en este momento no se permite interferencia de otras declaraciones. Símbolo =    
      2. La asignación sin bloqueo está determinada por el tiempo del reloj. Cuando el reloj sube, se ejecuta el lado derecho de la instrucción de asignación, y luego todas las instrucciones de asignación entre el principio y el final se asignan al lado izquierdo de la instrucción de asignación al mismo tiempo.

 

La diferencia entre la declaración de asignación y siempre
           La instrucción de asignación no se puede utilizar con un reloj.
           La declaración always puede ser con o sin reloj. Cuando siempre sin reloj, la función lógica y la asignación son exactamente las mismas, y solo generan lógica combinacional. La instrucción de asignación se recomienda para lógica combinacional simple, y la instrucción always se recomienda para lógica combinacional más compleja.

 

 Pestillo se refiere al pestillo
          Un circuito de celda de memoria sensible al nivel de pulso. Tanto los pestillos como los registros son unidades de almacenamiento básicas, los pestillos son memorias activadas por nivel y los registros son memorias activadas por flancos. Las funciones básicas de los dos son las mismas y ambos pueden almacenar datos. Los pestillos se generan mediante lógica combinacional, mientras que los registros se utilizan en circuitos secuenciales y se generan mediante activadores de reloj.
El principal peligro de los pestillos es la falla En el diseño, se debe evitar el uso de pestillos tanto como sea posible.
        Dos razones para la aparición de pestillos en el código son la descripción incompleta de las declaraciones if o case en la lógica combinatoria. Por ejemplo, si carece de la rama else y case carece de la rama predeterminada, los pestillos aparecen en el proceso de síntesis del código. La solución es que si debe traer la rama else, el caso debe traer la rama predeterminada.
        Cabe señalar que solo la declaración if o case de la declaración always sin el reloj está incompleta producirá el pestillo, y la declaración de la declaración if o case con el reloj no producirá el pestillo si la declaración está incompleta.
 

máquina estatal

Mealy state machine : la salida de la lógica combinacional no solo depende del estado actual, sino también del estado de entrada.
Máquina de estados de Moore : la salida de la lógica combinacional solo depende del estado actual.
Máquina de estado de tres etapas:
       Una etapa: toda la máquina de estado se escribe en un módulo always, en el que se describe la transición de estado, así como la entrada y salida del estado. Este tipo de máquina de estado no se recomienda , porque en términos de estilo de código, generalmente se requiere separar la lógica combinacional y la lógica secuencial; en términos de mantenimiento y actualización del código, la combinación de lógica combinacional y lógica secuencial no conduce al mantenimiento y modificación del código. Tampoco es propicio para la moderación.
        Dos etapas: se utilizan dos módulos siempre para describir la máquina de estado. Un módulo siempre utiliza temporización síncrona para describir la transición de estado; el otro módulo utiliza lógica combinatoria para determinar las condiciones de transición de estado y describe las reglas y salidas de transición de estado. A diferencia de la máquina de estado de una etapa, necesita definir dos estados, el estado actual y el segundo estado, y luego realizar la lógica secuencial mediante la conversión del estado actual y el segundo estado.
        Tres etapas: según los dos métodos de descripción de módulo siempre, se utilizan tres módulos siempre, uno siempre utiliza temporización síncrona para describir la transición de estado, uno siempre utiliza lógica combinatoria para determinar las condiciones de transición de estado y describe las reglas de transición de estado, y el otro siempre describe las condiciones de transición de estado. Salida de estado (se puede emitir mediante un circuito combinacional o mediante un circuito secuencial).
        El formato básico de una máquina de estados de tres etapas es:
            La primera declaración siempre se da cuenta del salto de estado de sincronización;
            La segunda declaración always usa lógica combinacional para determinar las condiciones de transición de estado;
            La tercera declaración siempre describe la salida de estado (puede emitirse mediante un circuito combinacional o mediante un circuito secuencial).
            Antes de escribir el código de la máquina de estado, generalmente dibuje primero el diagrama de transición de estado, para que la idea sea más clara al escribir el código.
Tomemos como ejemplo una división por 7
 
1 module divider7_fsm (
2 //系统时钟与复位
3 input sys_clk , 
4 input sys_rst_n , 
5 
6 //输出时钟
7 output reg clk_divide_7 
8 );
9 
10 //parameter define 
11 parameter S0 = 7'b0000001; //独热码定义方式
12 parameter S1 = 7'b0000010;
13 parameter S2 = 7'b0000100;
14 parameter S3 = 7'b0001000;
15 parameter S4 = 7'b0010000;
16 parameter S5 = 7'b0100000;
17 parameter S6 = 7'b1000000; 
18 
19 //reg define 
20 reg [6:0] curr_st ; //当前状态
21 reg [6:0] next_st ; //下一个状态
22
23 //*****************************************************
24 //** main code
25 //***************************************************** 
26
27 //状态机的第一段采用同步时序描述状态转移
28 always @(posedge sys_clk or negedge sys_rst_n) begin
29 if (!sys_rst_n)
30 curr_st <= S0;
31 else
32 curr_st <= next_st;
33 end
34
35 //状态机的第二段采用组合逻辑判断状态转移条件
36 always @(*) begin
37 case (curr_st)
38 S0: next_st = S1;
39 S1: next_st = S2;
40 S2: next_st = S3;
41 S3: next_st = S4;
42 S4: next_st = S5;
43 S5: next_st = S6;
44 S6: next_st = S0;
45 default: next_st = S0;
46 endcase
47 end
48
49 //状态机的第三段描述状态输出(这里采用时序电路输出)
50 always @(posedge sys_clk or negedge sys_rst_n) begin
51 if (!sys_rst_n)
52 clk_divide_7 <= 1'b0;
53 else if ((curr_st == S0) | (curr_st == S1) | (curr_st == S2) | (curr_st == S3))
54 clk_divide_7 <= 1'b0;
55 else if ((curr_st == S4) | (curr_st == S5) | (curr_st == S6))
56 clk_divide_7 <= 1'b1; 
57 else
58 ;
59 end
60
61 endmodule

Diseño modular
        Adopta generalmente un diseño de arriba hacia abajo
 
El archivo puede estar en la parte superior del módulo de facilitador de TOP Example     
          El lado izquierdo de la figura anterior es la definición de submódulos, varias interfaces de entrada y salida
          El lado derecho de la figura anterior corresponde a la instanciación del módulo de nivel superior, que incluye el nombre del submódulo. El nombre del módulo instanciado (puede escribirlo a voluntad, generalmente lo llamamos u_ + nombre del submódulo). El puerto del submódulo debe ser coherente con el puerto de función del submódulo. El puerto del módulo instanciado es consistente con la definición de puerto de la capa SUPERIOR, es decir, se realiza la conexión correspondiente
 
La instanciación del parámetro, la instanciación del parámetro se basa en la instanciación del módulo, agregando la definición de señal del parámetro, como se muestra en la siguiente figura:
   

     
Al crear una instancia de los parámetros, agregue "#" después del nombre del módulo para indicar que se sigue la lista de parámetros. El MAX_NUM definido por el módulo de temporización y el TIME_SHOW del módulo de nivel superior son ambos iguales a 25000_000. Cuando se define TIME_SHOW = 12500_000 en el módulo de nivel superior, entonces el valor de MAX_NUM del submódulo es en realidad igual a 12,500_000. Por supuesto, incluso si el submódulo contiene parámetros, no es necesario agregar la instanciación de los parámetros cuando se instancia el módulo. En este caso, el valor del parámetro del submódulo es igual al valor realmente definido dentro del módulo.
 
El significado de localparam en la gramática de Verilog es también definición de parámetro. El uso es básicamente el mismo que el de parámetro. La diferencia es que el parámetro definido por parámetro puede ser instanciado, mientras que el parámetro definido por localparam se refiere al parámetro local . El módulo superior no puede hacer el parámetro definido por localparam. Instanciar
                                       
 

 


 

Supongo que te gusta

Origin blog.csdn.net/qq_25479231/article/details/103608291
Recomendado
Clasificación