Experimento FPGA 2: diseño de contador de módulo variable

Tabla de contenido

1. Propósito del experimento

2. Requisitos experimentales

3. Código del experimento

1. Código fuente experimental

2. Análisis de algunas ideas de diseño de código

4. Resultados experimentales y análisis

1. Pasador de bloqueo

2. Simulación de forma de onda y análisis

3. Descargue los resultados y análisis de las pruebas

5. Experiencia experimental

1. Resolver las dificultades encontradas en el experimento y resolverlas

2. La experiencia después de completar el experimento


1. Propósito del experimento

(1) Dominar los métodos de implementación de FPGA de circuitos lógicos combinacionales y circuitos secuenciales;

(2) Familiarizado con el uso de placas de desarrollo EDA y software de desarrollo;

(3) aprender el uso de tubos digitales estáticos y el diseño de decodificadores de pantalla digital de 7 segmentos;

(4) Dominar el papel de los relojes en los circuitos secuenciales;

(5) Dominar el método de realización del circuito de división de frecuencia.

2. Requisitos experimentales

Diseñe un contador BCD, puede elegir el tamaño del módulo (el valor máximo del módulo es de al menos 3 dígitos), los requisitos experimentales:

(1) El resultado del conteo se muestra con un tubo digital de 3 dígitos y se muestra el código BCD;

(2) Proporcione la forma de onda de simulación de este diseño;

(3) Seleccione el circuito experimental para verificar la función de este contador.

(4) Diseñe un puerto de entrada con un valor de módulo variable y cambie el valor del módulo del contador ingresando el valor del módulo y configurando la señal

(5) La configuración implica un interruptor y un botón, el interruptor se usa como control de habilitación y el botón se usa como borrado asíncrono.

(6) Con salida de acarreo, y la salida de acarreo se muestra con luces LED

3. Código del experimento

1. Código fuente experimental

(1) archivo fuente de diseño (limitado al espacio, solo se muestra una parte del código y se marca el código central)

  1. `timescale 1ns / 1ns
    module final_counter(
        input CLK,          
        input SW1,          
        input KEY1,       
        input [6:0] M_SET,  
        input M_EN,
        output reg [10:0] display_segout,
        output reg LED_OUT          //输出,用于显示进位状态
    );
    
    reg  [6:0] M;       // 计数器模数
    wire [3:0] bw;
    wire [3:0] sw;
    wire [3:0] gw;
    wire [3:0] qw;
    reg [7:0] cnt_count;
    
    //设置模值
    always@(posedge M_EN)
        begin
           M[0]<=M_SET[0];
           M[1]<=M_SET[1];
           M[2]<=M_SET[2];
           M[3]<=M_SET[3];
           M[4]<=M_SET[4];
           M[5]<=M_SET[5];
           M[6]<=M_SET[6];
         end
            
    
    //数码管各位逻辑关系
    assign qw =M/10;
    assign bw =M%10;
    assign sw =cnt_count%100/10;
    assign gw =cnt_count%10;
    
    reg [19:0]count=0; 
    reg [30:0]count2=0; 
    reg [2:0] sel=0; 
    parameter T1MS=50000;
    reg [6:0]t;
    
    //多位数码管显示
    always@(posedge CLK) 
         begin 
            count<=count+1; 
            if(count==T1MS) 
            begin 
                count<=0; 
                sel<=sel+1; 
                if(sel==4) 
                sel<=0; 
             end 
         end
    //板子计数频率
    reg clk1;
    always @(posedge CLK)
     begin 
      if(count2 == 9_999_999) // 9_999_999==100ms
        begin 
            clk1<=1'b1; 
            count2<=0;
        end 
      else
                begin 
                    clk1<=1'b0;
                    count2<=count2+1'b1;
                end
     end
    //板子数码管显示
    always@(posedge CLK) 
     begin 
        case(sel) 
            0:display_segout<={4'b0111,BCD_OUT0};
            1:display_segout<={4'b1011,BCD_OUT1};
            2:display_segout<={4'b1101,BCD_OUT2};
            3:display_segout<={4'b1110,BCD_OUT3};
            default:display_segout<=11'b1111_1111111; 
        endcase 
     end
     //计数器逻辑
    always @(negedge clk1 or posedge KEY1 )
    begin
        if(KEY1 == 1'b1)   // 异步清零
            begin
                cnt_count <= 0;
            end
        else if(t!=M)
            begin
                cnt_count <= 0;
                t=M;
            end
        else if(SW1 == 1'b1)   // 使能控制
            begin
                if(cnt_count<M-1)
                    begin
                        cnt_count<=cnt_count+1;
                        LED_OUT<=1'b0;
                        if(cnt_count == M-2)
                            LED_OUT <=1'b1;
                    end
                else
                    begin 
                        cnt_count<=0;
                        LED_OUT<=1'b0;
                     end
            end
    end
    
    end module

(2) archivo de prueba de simulación

  1. `timescale 1ns/1ps
    module sim_CNT();
    reg SW1,KEY1;
    reg [6:0]M_SET;
    reg  M_EN;
    wire [10:0] display_segout;   
    wire LED_OUT;
    
    reg clk1;
    
    initial
        begin
        clk1= 1'b0;
        SW1 = 1'b0;
        M_EN=1'b0;
        #2 KEY1 = 1'b1;
           M_EN<=1'b1;
           M_SET<=7'b000_1010;
           M_EN=1'b0;
        #2 M_EN=1'b0;
        
        #2 KEY1 = 1'b1;    //清零
        #2 KEY1 = 1'b0; SW1 = 1'b1;   //复位,准备开始
           #192 
             M_EN<=1'b1;
             M_SET<=7'b001_1111;
           #2 M_EN=1'b0;
           #20
           #2 KEY1 = 1'b1;    //清零
        #2 KEY1 = 1'b0; SW1 = 1'b1;   //复位,准备开始
        end
    always
        begin
        #5 clk1 = ~clk1;
        end
    final_counter uu1(clk1,SW1,KEY1,M_SET,M_EN,display_segout,LED_OUT);
    
    endmodule   

2. Análisis de algunas ideas de diseño de código

(1) Realice la operación de división de frecuencia, la salida es clk1, cada dos saltos clk completos es equivalente a un salto completo 

clk1 salta, cada vez que llega el flanco ascendente de clk1 (cuando la señal del terminal de habilitación es válida y la señal de borrado asíncrono no es válida), 

El valor del contador se incrementa en uno.

 ( 2 ) El contador está diseñado. La transición del contador se basa en la señal del reloj clk1, cuando el terminal de habilitación es válido, 

Cuando la señal clara no es válida, si el valor del contador es menor que el valor de módulo establecido cuando el flanco ascendente de clk1 salta cada vez 

modelo, su valor continuará aumentando en 1. Si el valor del contador es igual al valor del módulo establecido, entonces el valor del contador volverá a 0 y comenzará a contar nuevamente. Entre ellos, cuando el contador está en el número máximo por debajo del valor del módulo, la señal de salida estará en un 

Cuando la señal del reloj se convierte en 1, significa que el conteo del valor del módulo está a punto de finalizar.

4. Resultados experimentales y análisis

1. Pasador de bloqueo

set_property PACKAGE_PIN U16 [get_ports {cnt_count[0]}]

set_property PACKAGE_PIN E19 [get_ports {cnt_count[1]}]

set_property PACKAGE_PIN U19 [get_ports {cnt_count[2]}]

set_property PACKAGE_PIN V19 [get_ports {cnt_count[3]}]

set_property PACKAGE_PIN W18 [get_ports {cnt_count[4]}]

set_property PACKAGE_PIN U15 [get_ports {cnt_count[5]}]

set_property PACKAGE_PIN U14 [get_ports {cnt_count[6]}]

set_property PACKAGE_PIN V14 [get_ports {cnt_count[7]}]

set_property PACKAGE_PIN U7 [get_ports {display_segout[0]}]

set_property PACKAGE_PIN V5 [get_ports {display_segout[1]}]

set_property PACKAGE_PIN U5 [get_ports {display_segout[2]}]

set_property PACKAGE_PIN V8 [get_ports {display_segout[3]}]

set_property PACKAGE_PIN U8 [get_ports {display_segout[4]}]

set_property PACKAGE_PIN W6 [get_ports {display_segout[5]}]

set_property PACKAGE_PIN W7 [get_ports {display_segout[6]}]

set_property PACKAGE_PIN W4 [get_ports {display_segout[7]}]

set_property PACKAGE_PIN V4 [get_ports {display_segout[8]}]

set_property PACKAGE_PIN U4 [get_ports {display_segout[9]}]

set_property PACKAGE_PIN U2 [get_ports {display_segout[10]}]

set_property PACKAGE_PIN V17 [get_ports {M_SET[0]}]

set_property PACKAGE_PIN V16 [get_ports {M_SET[1]}]

set_property PACKAGE_PIN W16 [get_ports {M_SET[2]}]

set_property PACKAGE_PIN W17 [get_ports {M_SET[3]}]

set_property PACKAGE_PIN V15 [get_ports {M_SET[5]}]

set_property PACKAGE_PIN W14 [get_ports {M_SET[6]}]

set_property PACKAGE_PIN W15 [get_ports {M_SET[4]}]

set_propiedad PAQUETE_PIN W5 [get_ports CLK]

set_property CLOCK_DEDICATED_ROUTE FALSO [get_nets M_EN_IBUF] 

set_property PACKAGE_PIN L1 [get_ports LED_OUT]

set_propiedad PAQUETE_PIN R2 [get_ports SW1]

set_property PACKAGE_PIN T1 [get_ports M_EN]

set_property PACKAGE_PIN U18 [get_ports KEY1]

set_property PACKAGE_PIN T1 [get_ports M_EN]

set_property PACKAGE_PIN U18 [get_ports KEY1]

2. Simulación de forma de onda y análisis

SW1 es el terminal de habilitación, M_SET es el valor del módulo establecido, R_SET es la señal de reinicio, LED_OUT es la salida del contador, cnt_count es la secuencia de conteo, clk1 es la señal del reloj y SET es el interruptor para cambiar el valor del módulo

Tome la forma de onda anterior como ejemplo para el análisis

(1) Verificación del terminal habilitado:

En los primeros 10 ns, el terminal de habilitación tiene un nivel bajo, no es válido y el contador no cuenta. Después de que el terminal de habilitación esté en un nivel alto: cuando el valor del módulo es 2, cada segunda señal de reloj LED_OUT genera una señal de salida.

(2) Verificación de la función de reinicio

El experimento requiere que R_SET se borre de forma asíncrona, como se muestra en la línea azul de la figura, cuando la señal R_SET es 0, el contador 

El valor se borra inmediatamente a cero.

(3) Verificación de la transformación del módulo

La observación muestra que la transformación del valor del módulo se ha realizado aquí Después de que la tecla SET es válida, el contador también vuelve a contar con el nuevo valor del módulo.

Después del borrado asíncrono, el valor del módulo se convierte en 9. Cuando llega la novena señal de reloj, LED_OUT genera una señal de salida, y el valor del módulo del contador continúa cambiando, y LED_OUT genera una señal de salida correspondiente.

La simulación de forma de onda puede observar las funciones de reinicio, habilitación, salida de acarreo de valor de módulo y valor de módulo establecido, por lo que se realiza la función de cualquier contador de valor de módulo.

3. Descargue los resultados y análisis de las pruebas

Los dos primeros dígitos del tubo digital representan el valor del módulo y los dos últimos dígitos representan el conteo

El valor del módulo se puede configurar de 1 a 15, que se configura mediante los cuatro interruptores de botón en la esquina inferior derecha. La luz LED señalada por L1 representa la señal de salida, y se encenderá una vez cada vez que se complete el conteo.

Las siguientes son las fotos en ejecución de la placa de desarrollo cuando el módulo es 12 y 15

(1) La situación crítica cuando el módulo es 12 y la cuenta es 11 (2) Cuando el módulo es 15 

 

analizar:

Cuando el valor del módulo es 12 y el valor de conteo es 11, la luz LED está encendida, lo que indica que ha terminado un conteo con un valor de módulo de 12

Cuando el valor del módulo es 15 y el valor del conteo es 14, la luz LED se enciende y finaliza un conteo con el valor del módulo 15.

En resumen, se puede ver que el fenómeno de prueba de descarga es consistente con la simulación.

5. Experiencia experimental

1. Resolver las dificultades encontradas en el experimento y resolverlas

(1) El salto de la señal de salida en el momento en que el conteo alcanza el valor máximo del módulo no está en el valor máximo, sino que se convierte en 1 cuando el valor del contador vuelve a 0, es decir, el tiempo de salto es una señal de reloj más tarde que el mostrador. 

Solución: Cambie una condición de juicio en el programa del módulo contador del archivo de código. El programa original está escrito de modo que mientras el valor del contador sea igual al valor del módulo, out generará 1, pero el resultado de esta condición de juicio parece mostrarse solo en la siguiente señal de reloj. Entonces, esta parte del programa cambia, cuando el valor del contador es igual al valor del módulo, se considera que se establece un resultado válido y la salida es 1 inmediatamente. Se encuentra que después de cambiar el código , puede saltar exitosamente al valor máximo .

(2) ¿Por qué se requiere la división de frecuencia?

Esta solicitud se presentó cuando vi la solicitud experimental, y estaba lleno de dudas en ese momento, ¿por qué se debe realizar la división de frecuencia y cuáles son los beneficios de la división de frecuencia? Después de consultar la información, aprendí que la división de frecuencia es dividir la frecuencia original por el valor de la división de frecuencia para obtener la frecuencia actual, simplemente hablando, es reducir la frecuencia por múltiplos enteros. Después de la división de frecuencia, la velocidad de entrada se puede reducir; de lo contrario, la frecuencia de oscilación es demasiado alta, la duración de la señal es demasiado corta y el dispositivo no puede responder normalmente. Además, los requisitos de frecuencia de algunos dispositivos periféricos son diferentes y, si no hay un circuito de división de frecuencia, no se puede controlar. Una cierta división de frecuencia también puede acortar el tiempo de simulación y mejorar la eficiencia experimental.

2. La experiencia después de completar el experimento

En el proceso de completar este experimento, encontré algunos problemas y desafíos, pero a través de pruebas y depuraciones continuas, finalmente completé con éxito todo el experimento.

Creo que es muy importante comprender completamente cómo funciona el contador para completar este experimento . Al realizar experimentos de contador, es necesario comprender completamente el principio de funcionamiento del contador para que se puedan realizar los ajustes y diseños de parámetros adecuados según sea necesario. Al principio, no entendí los requisitos del maestro , y luego me di cuenta de que los dos dígitos de la izquierda representan el valor del módulo y los dos dígitos de la derecha representan el proceso de conteo en el tubo digital . Pero después de muchas veces de depuración del código, se ha completado la aceptación del experimento .

En general, el experimento de diseño de contador variable modular es un proyecto de práctica de diseño muy significativo y útil. En este experimento, podemos aprender mucho sobre el conocimiento básico del diseño de circuitos digitales y, al mismo tiempo, mejorar nuestra capacidad de resolución de problemas y pensamiento. Al mismo tiempo, también necesitamos paciencia y perseverancia. A través de la depuración y optimización continuas, ¡finalmente completaremos un diseño de contador estable y confiable !

 

Supongo que te gusta

Origin blog.csdn.net/m0_64198455/article/details/131527545
Recomendado
Clasificación