Red de conocimiento informático - Problemas con los teléfonos móviles - Programación verilog HDL

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 )

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

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.