Programación verilog HDL
Hice esto el año pasado. Te daré mi programa para tu referencia. Puedes ajustarlo correctamente.
1. Requisitos de diseño
Para diseñar un reloj digital, se requiere utilizar un tubo digital para mostrar las cuentas de horas, minutos y segundos respectivamente. se puede configurar la hora y la pantalla de hora establecida debe parpadear.
2. Principio de diseño
En funcionamiento normal, el contador cuenta la frecuencia de 1 Hz y, en el estado de ajuste de tiempo, cuenta los módulos de tiempo que deben ajustarse; Los botones se utilizan para seleccionar si contar normalmente o ajustar el tiempo y decidir ajustar las horas, minutos y segundos cuando se presiona la tecla numérica establecida, significa que el bloque de ajuste correspondiente debe incrementarse en uno. el tubo digital LED que muestra la hora parpadeará y cuando se establezca el número establecido. Cuando se presiona el botón, la visualización de la hora correspondiente aumenta en uno. Todos los tubos digitales LED que muestran la hora se implementan mediante pantallas de escaneo dinámico. Su diagrama esquemático se muestra en 9-7-1.
reloj del módulo(seg7,scan,clk,clr,en,mode,inc);
salida[6:0] seg7;
salida[5 :0] scan;
input clk; //entrada de reloj 20MHz
input clr; //borrar fin
entrada en //pausar señal< / p>
modo de entrada; //Señal de control, utilizada para seleccionar el modo
input inc; //Establecer señal
reg[6:0] seg7; señal de control de visualización de segmento (abcdefg)
reg[5:0] scan; //señal de selección de dirección de tubo digital
estado reg[1:0] //definición de 4 tipos; Estado
reg[3:0] qhh,qhl,qmh,qml,qsh,qsl; //Los bits altos y bajos de horas, minutos y segundos
reg[3: 0] data;
reg[2:0] cnt; //Escaneo del contador de tubos digitales
reg clk1khz, clk1hz, clk2hz //Señales de división de frecuencia de 1kHz, 1Hz, 2Hz;
reg[2:0] parpadea; //Señal de destello
reg inc_reg;
reg[7:0] seg,min;
reg[7:0] hora;
parámetro state0=2'b00,state1=2'b01,state2=2'b10,state3=2'b11;
reg [13:0] cuenta1;
reg[8:0] cuenta2;
reg[8:0] cuenta3;
//--- - -----------------------División de frecuencia de 1kHz, utilizada para escanear la dirección del tubo digital--------
siempre @(posedge clk)
comenzar
if(count1=='d10000)
comenzar clk1khz<=~clk1khz;count1<=0; /p>
else
comenzar cuenta1<=cuenta1+1; finalizar
final
//---------- ---------- División de frecuencia de 1 Hz, utilizada para cronometrar--------------------------------< / p>
siempre @(posedge clk1khz)
comenzar
if(count2=='d500)
comenzar clk1hz<=~clk1hz;count2 < =0; fin
else
comenzar cuenta2<=cuenta2+1; fin
if(count3=='d250) //División de frecuencia de 2Hz, utilizar El tubo digital parpadea
comenzar clk2hz<=~clk2hz; contar3<=0; finalizar
else
comenzar contar3<=contar3+1; /p> p>
if(cnt=='d5) //Recuento de escaneo dinámico del tubo digital
start cnt<='d0;
/p>
else
comenzar cnt<=cnt+1; finalizar
fin
//---------- --------------- Conversión de modo---------------------------------
siempre @(modo posedge)
comenzar
if(clr)
comenzar estado<=estado0;
comenzar estado<=estado+1; finalizar
final
//--------------------- ----Control de estado--------------------------------
siempre @(posedge clk1hz ) p>
comenzar
if(es)
comenzar hora<=hora;
min<=min;
seg <= seg;
fin
else if(clr)
inicio hora<=0;
min<= 0;
seg<=0;
fin
más
comienzo
caso(estado)
state0:begin //Modo 0, sincronización normal
if(sec==8'd59)
start sec<='d0;
si(min==8'd59)
comienza min<='d0;
si(hora==8'd23)
comienza hora<= 8'd0; fin
más
inicio hora<=hora+1 fin
fin
más p>
inicio min<=min+1; fin
fin
else
inicio seg<=seg+1;
fin
estado1:comenzar //Modo 1, establecer hora
if(inc)
comenzar
if( !inc_reg )
comenzar inc_reg<=1;
if(hora==8'd23)
comenzar
hora<=8'd0; fin
else
inicio hora<=hora+1 fin
fin
fin
p>else
start inc_reg<=0; end
end
state2:begin //Modo 2, establecer minutos
if(inc)
comenzar
if(!inc_reg)
comenzar inc_reg<=1;
if( min ==8'd59)
inicio min<=8'd0; fin
else
inicio min<=min+1;
fin
fin
else
comenzar inc_reg<=0; fin
fin
estado3 :begin //Modo 3, establece el tiempo en segundos
if(inc)
comenzar
if(!inc_reg)
comenzar inc_reg <=1;
if(sec==8'd59)
comenzar seg<=8'd0; finalizar
else
comenzar seg<=seg+1; finalizar
finalizar
finalizar
else
comenzar inc_reg<=0; p>
fin
caso final
fin
fin
//-------- --- -----------------------Al configurar la hora, haga que el tubo digital parpadee----------------------- --- -----
siempre @(estado,clk2hz)
comenzar
caso(estado)
estado0: parpadear[2 :0]<='b111;
estado1:parpadeo[2]<=clk2hz;
estado2:parpadeo[1]<=clk2hz;
estado3:parpadeo[0]<=clk2hz ;
default:blink[2:0]<='bx;
endcase
end
//---- -----------------------Convertir el conteo de segundos de decimal a código BCD------------------- -- ------
siempre @(seg)
comenzar
caso(seg[7:0])
8 'd0:comenzar qsh[3:0]<='b0000;qsl[3:0]<='b0000; finalizar
8'd1:comenzar qsh[3:0]<=' b0000; qsl[3:0]<='b0001; fin
8'd2:comenzar qsh[3:0]<='b0000;qsl[3:0]<='b0010; /p >
8'd3:comenzar qsh[3:0]<='b0000;qsl[3:0]<='b0011; finalizar
8'd4:comenzar qsh[3: 0] <='b0000;qsl[3:0]<='b0100; fin
8'd5:begin qsh[3:0]<='b0000;qsl[3:0]<= 'b0101 ; fin
8'd6:comenzar qsh[3:0]<='b0000;qsl[3:0]<='b0110; fin
8'd7: comenzar qsh [3:0]<='b0000;qsl[3:0]<='b0111; finalizar
8'd8:comenzar qsh[3:0]<='b0000;qsl[3 :0 ]<='b1000; fin
8'd9:comenzar qsh[3:0]<='b0000;qsl[3:0]<='b1001; > 8 'd10:comenzar qsh[3:0]<='b0001;qsl[3:0]<='b0000; finalizar
8'd11:comenzar qsh[3:0]<=' b0001; qsl[3:0]<='b0001; fin
8'd12:comenzar qsh[3:0]<='b0001;qsl[3:0]<='b0010; /p >
8'd13:comenzar qsh[3:0]<='b0001;qsl[3:0]<='b0011; finalizar
8'd14:comenzar qsh[3: 0] <='b0001;qsl[3:0]<='b0100; fin
8'd15:begin qsh[3:0]<='b0001;qsl[3:0]<= 'b0101 ; fin
8'd16:comenzar qsh[3:0]<='b0001;qsl[3:0]<='b0110; fin
8'd17: comenzar qsh [3:0]<='b0001;qsl[3:0]<='b0111; finalizar
8'd18:comenzar qsh[3:0]<='b0001;
qsl[3:0]<='b1000; fin
8'd19:comenzar qsh[3:0]<='b0001;qsl[3:0]<='b1001; >
8'd20:comenzar qsh[3:0]<='b0010;qsl[3:0]<='b0000; finalizar
8'd21:comenzar qsh[3:0] <='b0010;qsl[3:0]<='b0001; fin
8'd22:comenzar qsh[3:0]<='b0010;qsl[3:0]<='b0010 ; finalizar
8'd23:comenzar qsh[3:0]<='b0010;qsl[3:0]<='b0011; finalizar
8'd24:comenzar qsh [3:0]<='b0010;qsl[3:0]<='b0100; fin
8'd25:begin qsh[3:0]<='b0010;qsl[3:0 ]<='b0101; fin
8'd26:comenzar qsh[3:0]<='b0010;qsl[3:0]<='b0110; 'd27:comenzar qsh[3:0]<='b0010;qsl[3:0]<='b0111; finalizar
8'd28:comenzar qsh[3:0]<='b0010; qsl[3:0]<='b1000; fin
8'd29:comenzar qsh[3:0]<='b0010;qsl[3:0]<='b1001; >
8'd30:comenzar qsh[3:0]<='b0011;qsl[3:0]<='b0000; finalizar
8'd31:comenzar qsh[3:0] <='b0011;qsl[3:0]<='b0001; fin
8'd32:comenzar qsh[3:0]<='b0011;qsl[3:0]<='b0010 ; finalizar
8'd33:comenzar qsh[3:0]<='b0011;qsl[3:0]<='b0011; finalizar
8'd34:comenzar qsh [3:0]<='b0011;qsl[3:0]<='b0100; fin
8'd35:begin qsh[3:0]<='b0011;qsl[3:0 ]<='b0101; fin
8'd36:comenzar qsh[3:0]<='b0011;qsl[3:0]<='b0110; 'd37:comenzar qsh[3:0]<='b0011;qsl[3:0]<='b0111; finalizar
8'd38:comenzar qsh[3:0]<='b0011; qsl[3:0]<='b1000; fin
8'd39:comenzar qsh[3:0]<='b0011;qsl[3:0]<='b1001; >
8'd40:comenzar qsh[3:0]<='b0100;qsl[3:0]<='b0000; finalizar
8'd41:comenzar qsh[3:0] <='b0100;qsl[3
:0]<='b0001; fin
8'd42:comenzar qsh[3:0]<='b0100;qsl[3:0]<='b0010; > 8'd43:comenzar qsh[3:0]<='b0100;qsl[3:0]<='b0011; finalizar
8'd44:comenzar qsh[3:0]<=' b0100;qsl[3:0]<='b0100; fin
8'd45:begin qsh[3:0]<='b0100;qsl[3:0]<='b0101; /p>
8'd46:comenzar qsh[3:0]<='b0100;qsl[3:0]<='b0110; finalizar
8'd47:comenzar qsh[3: 0]<='b0100;qsl[3:0]<='b0111; fin
8'd48:begin qsh[3:0]<='b0100;qsl[3:0]<= 'b1000; finalizar
8'd49:comenzar qsh[3:0]<='b0100;qsl[3:0]<='b1001; finalizar
8'd50: comenzar qsh[3:0]<='b0101;qsl[3:0]<='b0000; finalizar
8'd51:comenzar qsh[3:0]<='b0101;qsl[3 :0]<='b0001; fin
8'd52:begin qsh[3:0]<='b0101;qsl[3:0]<='b0010; > 8'd53:comenzar qsh[3:0]<='b0101;qsl[3:0]<='b0011; finalizar
8'd54:comenzar qsh[3:0]<=' b0101;qsl[3:0]<='b0100; fin
8'd55:begin qsh[3:0]<='b0101;qsl[3:0]<='b0101; /p>
8'd56:comenzar qsh[3:0]<='b0101;qsl[3:0]<='b0110; finalizar
8'd57:comenzar qsh[3: 0]<='b0101;qsl[3:0]<='b0111; fin
8'd58:begin qsh[3:0]<='b0101;qsl[3:0]<= 'b1000; finalizar
8'd59:comenzar qsh[3:0]<='b0101;qsl[3:0]<='b1001; finalizar
predeterminado: comenzar qsh [3:0]<='bx;qsl[3:0]<='bx; fin
endcase
fin
//--- ------------------------Convertir decimal a código BCD para contar minutos------------------ -
siempre @(min)
comenzar
caso(min[7:0])
8'd0:comenzar qmh [3:0]<='b0000;qml[3:0]<='b0000; fin
8'd1:comenzar qmh[3:0]<='b0
000;qml[3:0]<='b0001; fin
8'd2:begin qmh[3:0]<='b0000;qml[3:0]<='b0010; /p>
8'd3:comenzar qmh[3:0]<='b0000;qml[3:0]<='b0011; finalizar
8'd4:comenzar qmh[3: 0]<='b0000;qml[3:0]<='b0100; fin
8'd5:begin qmh[3:0]<='b0000;qml[3:0]<= 'b0101; fin
8'd6:comenzar qmh[3:0]<='b0000;qml[3:0]<='b0110; fin
8'd7: comenzar qmh[3:0]<='b0000;qml[3:0]<='b0111; finalizar
8'd8:begin qmh[3:0]<='b0000;qml[3 :0]<='b1000; fin
8'd9:begin qmh[3:0]<='b0000;qml[3:0]<='b1001; > 8'd10:comenzar qmh[3:0]<='b0001;qml[3:0]<='b0000; finalizar
8'd11:comenzar qmh[3:0]<=' b0001;qml[3:0]<='b0001; fin
8'd12:begin qmh[3:0]<='b0001;qml[3:0]<='b0010; /p>
8'd13:comenzar qmh[3:0]<='b0001;qml[3:0]<='b0011; finalizar
8'd14:comenzar qmh[3: 0]<='b0001;qml[3:0]<='b0100; fin
8'd15:begin qmh[3:0]<='b0001;qml[3:0]<= 'b0101; finalizar
8'd16:comenzar qmh[3:0]<='b0001;qml[3:0]<='b0110; finalizar
8'd17: comenzar qmh[3:0]<='b0001;qml[3:0]<='b0111; finalizar
8'd18:begin qmh[3:0]<='b0001;qml[3 :0]<='b1000; fin
8'd19:begin qmh[3:0]<='b0001;qml[3:0]<='b1001; > 8'd20:comenzar qmh[3:0]<='b0010;qml[3:0]<='b0000; finalizar
8'd21:comenzar qmh[3:0]<=' b0010;qml[3:0]<='b0001; fin
8'd22:begin qmh[3:0]<='b0010;qml[3:0]<='b0010; /p>
8'd23:comenzar qmh[3:0]<='b0010;qml[3:0]<='b0011; finalizar
8'd24:comenzar qmh[3: 0]<='b0010;qml[3:0]&
lt;='b0100; fin
8'd25:begin qmh[3:0]<='b0010;qml[3:0]<='b0101; 'd26:comenzar qmh[3:0]<='b0010;qml[3:0]<='b0110; finalizar
8'd27:comenzar qmh[3:0]<='b0010; qml[3:0]<='b0111; fin
8'd28:begin qmh[3:0]<='b0010;qml[3:0]<='b1000; >
8'd29:comenzar qmh[3:0]<='b0010;qml[3:0]<='b1001; finalizar
8'd30:comenzar qmh[3:0] <='b0011;qml[3:0]<='b0000; fin
8'd31:begin qmh[3:0]<='b0011;qml[3:0]<='b0001 ; finalizar
8'd32:comenzar qmh[3:0]<='b0011;qml[3:0]<='b0010; finalizar
8'd33:comenzar qmh [3:0]<='b0011;qml[3:0]<='b0011; fin
8'd34:begin qmh[3:0]<='b0011;qml[3:0 ]<='b0100; fin
8'd35:comenzar qmh[3:0]<='b0011;qml[3:0]<='b0101; 'd36:comenzar qmh[3:0]<='b0011;qml[3:0]<='b0110; finalizar
8'd37:comenzar qmh[3:0]<='b0011; qml[3:0]<='b0111; fin
8'd38:begin qmh[3:0]<='b0011;qml[3:0]<='b1000; >
8'd39:comenzar qmh[3:0]<='b0011;qml[3:0]<='b1001; finalizar
8'd40:comenzar qmh[3:0] <='b0100;qml[3:0]<='b0000; fin
8'd41:begin qmh[3:0]<='b0100;qml[3:0]<='b0001 ; finalizar
8'd42:comenzar qmh[3:0]<='b0100;qml[3:0]<='b0010; finalizar
8'd43:comenzar qmh [3:0]<='b0100;qml[3:0]<='b0011; fin
8'd44:begin qmh[3:0]<='b0100;qml[3:0 ]<='b0100; fin
8'd45:comenzar qmh[3:0]<='b0100;qml[3:0]<='b0101; 'd46:comenzar qmh[3:0]<='b0100;qml[3:0]<='b0110; finalizar
8'd47:comenzar qmh[3:0]<='b0100; qml[3:0]<='
b0111; finalizar
8'd48:comenzar qmh[3:0]<='b0100;qml[3:0]<='b1000; finalizar
8'd49:comenzar qmh[3:0]<='b0100;qml[3:0]<='b1001; fin
8'd50:comenzar qmh[3:0]<='b0101;qml[3: 0]<='b0000; fin
8'd51:begin qmh[3:0]<='b0101;qml[3:0]<='b0001; 8'd52:comenzar qmh[3:0]<='b0101;qml[3:0]<='b0010; finalizar
8'd53:comenzar qmh[3:0]<='b0101 ;qml[3:0]<='b0011; fin
8'd54:begin qmh[3:0]<='b0101;qml[3:0]<='b0100; p>
8'd55:comenzar qmh[3:0]<='b0101;qml[3:0]<='b0101; finalizar
8'd56:comenzar qmh[3:0 ]<='b0101;qml[3:0]<='b0110; fin
8'd57:begin qmh[3:0]<='b0101;qml[3:0]<=' b0111; finalizar
8'd58:comenzar qmh[3:0]<='b0101;qml[3:0]<='b1000; finalizar
8'd59:comenzar qmh[3:0]<='b0101;qml[3:0]<='b1001; fin
predeterminado: comenzar qmh[3:0]<='bx;qml[3:0] <='bx; fin
caso final
fin
//------------------ - ---------Decimal a código BCD para contar horas---------------------
siempre @(hora)
comienzo
caso(hora)
8'd0:comienzo qhh[3:0]<='b0000;qhl[3:0] <=' b0000; finalizar
8'd1:comenzar qhh[3:0]<='b0000;qhl[3:0]<='b0001; finalizar
8' d2:comenzar qhh[3:0]<='b0000;qhl[3:0]<='b0010; fin
8'd3:comenzar qhh[3:0]<='b0000;qhl [3: 0]<='b0011; fin
8'd4:comenzar qhh[3:0]<='b0000;qhl[3:0]<='b0100; 8'd5:comienza qhh[3:0]<='b0000;qhl[3:0]<='b0101; final
8'd6:comienza qhh[3:0]< ='b0000 ;qhl[3:0]<='b0110; fin
8'd7:comenzar qhh[3:0]<='b0000;qhl[3:0]&
lt;='b0111; fin
8'd8:comenzar qhh[3:0]<='b0000;qhl[3:0]<='b1000; fin
8 'd9:comienza qhh[3:0]<='b0000;qhl[3:0]<='b1001; final
8'd10:comienza qhh[3:0]<='b0001; qhl[3:0]<='b0000; fin
8'd11:comenzar qhh[3:0]<='b0001;qhl[3:0]<='b0001; >
8'd12:comienza qhh[3:0]<='b0001;qhl[3:0]<='b0010; final
8'd13:comienza qhh[3:0] <='b0001;qhl[3:0]<='b0011; fin
8'd14:begin qhh[3:0]<='b0001;qhl[3:0]<='b0100 ; finalizar
8'd15:comenzar qhh[3:0]<='b0001;qhl[3:0]<='b0101; finalizar
8'd16:comenzar qhh [3:0]<='b0001;qhl[3:0]<='b0110; fin
8'd17:begin qhh[3:0]<='b0001;qhl[3:0 ]<='b0111; fin
8'd18:comenzar qhh[3:0]<='b0001;qhl[3:0]<='b1000; fin
8 'd19:comenzar qhh[3:0]<='b0001;qhl[3:0]<='b1001; finalizar
8'd20:comenzar qhh[3:0]<='b0010; qhl[3:0]<='b0000; fin
8'd21:comenzar qhh[3:0]<='b0010;qhl[3:0]<='b0001; >
8'd22:comienza qhh[3:0]<='b0010;qhl[3:0]<='b0010; final
8'd23:comienza qhh[3:0] <='b0010;qhl[3:0]<='b0011; fin
predeterminado: comenzar qhh[3:0]<='bx;qhl[3:0]<='bx;
caso final
fin
//------------------------- -----Escaneo dinámico de tubo digital-------------------------------
siempre @(cnt,qhh,qhl,qmh,qml,qsh,qsl,blink)
comenzar
caso(cnt)
3 ' b000:iniciar datos[3:0]<=qsl[3:0];escanear[5:0]<='b000001&{6{blink[0]}}; : comenzar datos[3:0]<=qsh[3:0];scan[5:0]<='b000010&{6{blink[0]}}; finalizar
3'b010:b
comenzar datos[3:0]<=qml[3:0];scan[5:0]<='b000100&{6{blink[1]}}; finalizar
3'b011:empezar datos [3:0]<=qmh[3:0];scan[5:0]<='b001000&{6{blink[1]}}; fin
3'b100:iniciar datos[3 :0]<=qhl[3:0];scan[5:0]<='b010000&{6{blink[2]}}; fin
3'b101:iniciar datos[3:0] ]<=qhh[3:0];escanear[5:0]<='b100000&{6{blink[2]}}; finalizar
valor predeterminado: comenzar datos<='bx;escanear<= 'bx; fin
endcase
fin
//--------------------- ------------------------Decodificación de 7 segmentos------------------------------- - --------
siempre @(datos)
comenzar
caso(datos[3:0])
4'b0000:seg7[6:0]=7'b1111110;
4'b0001:seg7[6:0]=7'b0110000;
4'b0010: seg7 [6:0]=7'b1101101;
4'b0011:seg7[6:0]=7'b1111001;
4'b0100:seg7[6:0] = 7'b0110011;
4'b0101:seg7[6:0]=7'b1011011;
4'b0110:seg7[6:0]=7'b1011111;
p>4'b0111:seg7[6:0]=7'b1110000;
4'b1000:seg7[6:0]=7'b1111111;
4 'b1001:seg7[6:0]=7'b1111011;
default:seg7[6:0]=7'b0000000;
endcase
end
endmodule
Para contenido específico, consulte el libro del profesor Zhou Runjing.