数字逻辑Verilog语言电子钟描述
用Verilog语言编写的多功能数字钟
《数字电子技术课程设计》报告专业班级:姓名:学号:设计日期:一.设计题目多功能数字钟电路设计二.设计任务及要求多功能数字钟应该具有的功能有:显示时—分—秒、整点报时、小时和分钟可调等基本功能。
整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的范围为0~23时。
在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD 码)显示个位,对于小时因为他的范围是从0~23,所以可以用一个2位的二进制码显示十位,用一个4位的二进制码(BCD码)显示个位。
实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz 时钟信号,但是扫描需要一个比较高频率的信号,因此为了得到准确的1Hz 信号,必须对输入的系统时钟50Mhz进行分频。
对于整点报时功能,本实验设计的是当进行正点的倒计时5秒时,让LED来闪烁进行整点报时的提示。
调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时;S2调整分钟,每按下一次,分钟增加一分钟。
另外用S8按键作为系统时钟复位,复位后全部显示00—00—00。
管脚分配如下表:三.基于Verilog HDL语言的电路设计、仿真与综合(一)顶层模块本程序采用结构化设计方法,将其分为彼此独立又有一定联系的三个模块,如图1所示:LocationPIN_R16Option Value VCC S1INPUT Location PIN_P14Option Value VCC S2INPUT Location PIN_J3Option Value VCCCPINPUT Location PIN_M4Location PIN_F3Location PIN_F4Option Value SEL[2..0]OUTPUT Location PIN_L14Option Value LEDOUTPUTLocation PIN_N4Location PIN_G4Location PIN_H4Location PIN_L5Location PIN_L4Location PIN_K4Location PIN_K5Option Value LEDAG[6..0]OUTPUTCP CPoutf enpininst1CPoutS1S2RETHour[5..0]Minute[5..0]Second[5..0]LEDkongzhiqi inst2VCCRETINPUT CPout Hour[5..0]Minute[5..0]Second[5..0]SEL[2..0]LEDAG[6..0]xianshi inst图1:顶层结构框图(二)子模块 1.分频器分频器的作用是对50Mhz 的系统时钟信号进行分频,得到频率为1000hz 的信号,作为显示器的输入信号。
用Verilog语言编写的多功能数字钟
这次的闹钟电路设计和多功能数字钟有一些相似的地方,不同在于整体构思和细
节上要求的差异。
构思根据要求采用的是状态机设计方法。从一个状态进入另一个状态最适合这个
设计了。细节上和数字钟也有很大的差异。中间的控制逻辑有时候需要反馈。前
后都是有联系的,并不是独立存在的。
本次设计基本上完成的所以的要求,但是由于时间紧急,一些细节并不是很完美,
分频器的作用是对 50Mhz 的系统时钟信号进行分频,得到频率为 1hz 的信号,
作为时钟的输入信号。
2
2.控制器和计数器 控制器的作用是,调整小时和分钟的值,并能实现清零功能。计数器的
作用是实现分钟和秒钟满 60 进 1,小时则由 23 跳到 00。当到达 59 分 55 秒的时 候,LED 灯会闪烁来进行报时。
end 2:
begin state<=2; s=1;
end 3:
begin s=0; if(k1==0) //时调整
7
begin
if(nz_h_l==3)
begin
nz_h_l=0;
if(nz_h_h==2)nz_h_h=0;
else nz_h_h=nz_h_h+1;
end
else nz_h_l=nz_h_l+1;
end
else if(k3==0) finish=1;
//设置完成
else if(k4==0) spker_en=1; //停止声响
end
8
4: begin s=0; if(k4==0) begin on_off<=!on_off;state=0;end end
endcase end end endmodule 3.显示器 显示器的作用是将时:分的值在数码管上依次显示出来。从分频器输出的 1Khz 的信号作为数码管的扫描信号。SEL 表示 6 个数码管选择位,它的取值表示八个 数码管,从左至右依次是 111~000。seg 表示七段数码管,它的取值决定特定位 数上显示的数字。
Verilog 电子时钟 (分、秒)
module clock (clk,reset,seg,sel);input clk;input reset;output seg;output sel;//-----------------------------------------reg [23:0]Q; //1s reg clk_div_1;wire clk_1s;always @ (posedge clk or negedge reset)beginif (!reset) Q<=24'd0;else if (Q<24'd9999999) Q<=Q+1'b1;else Q<=24'd0;endalways @ (posedge clk or negedge reset)beginif (!reset) clk_div_1<=1'b1;else if (Q == 24'd9999999) clk_div_1<=~clk_div_1; endassign clk_1s=clk_div_1;//----------------------------------------------reg [27:0]W; //10s reg clk_div_2;wire clk_10s;always @ (posedge clk or negedge reset)beginif (!reset) W<=28'd0;else if (W<28'd9*******) W<=W+1'b1;else W<=28'd0;endalways @ (posedge clk or negedge reset)beginif (!reset) clk_div_2<=1'b1;else if (W == 28'd9*******) clk_div_2<=~clk_div_2; endassign clk_10s=clk_div_2;//-----------------------------------------------------reg [29:0]E; //60sreg clk_div_3;wire clk_60s;always @ (posedge clk or negedge reset)beginif (!reset) E<=30'd0;else if (E<30'd599999940) E<=E+1'b1;else E<=30'd0;endalways @ (posedge clk or negedge reset)beginif (!reset) clk_div_3<=1'b1;else if (E == 30'd599999940) clk_div_3<=~clk_div_3;endassign clk_60s=clk_div_3;//------------------------------------------------------reg [33:0]R; //600s reg clk_div_4;wire clk_600s;always @ (posedge clk or negedge reset)beginif (!reset) R<=34'd0;else if (R<34'd5999999400) R<=R+1'b1;else R<=34'd0;endalways @ (posedge clk or negedge reset)beginif (!reset) clk_div_4<=1'b1;else if (R == 24'd5999999400) clk_div_4<=~clk_div_4;endassign clk_600s=clk_div_4;//--------------------------------------------------------------reg [16:0]A;reg clk_div_r;wire clk_div;always @ (posedge clk or negedge reset)//freq_division 30*4=120beginif (!reset) A<=17'd0;else if (A<17'd83334) A<=A+1'b1;//20000000/2/120=83334 [0-83334]else A<=17'd0;endalways @ (posedge clk or negedge reset)beginif (!reset) clk_div_r<=1'b1;else if (A == 17'd83334) clk_div_r<=~clk_div_r;endassign clk_div=clk_div_r;//------------------------------------------------------------reg [2:0]T;always @ (posedge clk_div or negedge reset)//six circlebeginif (!reset) T<=3'd0;else if (T<3'd3) T<=T+1'b1;//[0-3]else T<=3'd0;end//-------------------------------------------------reg [3:0]sel; //scan seg,selreg [7:0]seg;always @ (T)beginif (T<=3'b000) sel<=4'b1110;else if (T<=3'b001) sel<=4'b1101;else if (T<=3'b010) sel<=4'b1011;else if (T<=3'b011) sel<=4'b0111;else sel<=4'b1110;endalways @ (T)beginif (T<=3'b000) seg<=Y1;else if (T<=3'b001) seg<=Y2;else if (T<=3'b010) seg<=Y3;else if (T<=3'b011) seg<=Y4;else seg<= Y1;end//-----------------------------------------------parameter seg0 = 8'b11000000, //seg 0-9seg1 = 8'b11001111,seg2 = 8'b10100100,seg3 = 8'b10110000,seg4 = 8'b10011001,seg5 = 8'b10010010,seg6 = 8'b10000010,seg7 = 8'b11111000,seg8 = 8'b10000000,seg9 = 8'b10011000;//----------------------------------------------reg [3:0]Q1;reg [7:0]Y1;always @ (posedge clk_1s or negedge reset)//Asy_rst beginif (!reset) Q1<=4'd0;else if (Q1<4'd9) Q1<=Q1+1'b1;//[0-9]else Q1<=4'd0;endalways @ (Q1)//circlebeginif (Q1<=4'd0) Y1<=seg0;else if (Q1<=4'd1) Y1<=seg1;else if (Q1<=4'd2) Y1<=seg2;else if (Q1<=4'd3) Y1<=seg3;else if (Q1<=4'd4) Y1<=seg4;else if (Q1<=4'd5) Y1<=seg5;else if (Q1<=4'd6) Y1<=seg6;else if (Q1<=4'd7) Y1<=seg7;else if (Q1<=4'd8) Y1<=seg8;else if (Q1<=4'd9) Y1<=seg9;else Y1<=seg0;end//--------------------------------------------------reg [2:0]Q2;reg [7:0]Y2;always @ (posedge clk_10s or negedge reset)//Asy_rst beginif (!reset) Q2<=3'd0;else if (Q2<3'd5)Q2<=Q2+1'b1; //[0-5]else Q2<=3'd0;endalways @ (Q2)//circlebeginif (Q2<=3'd0) Y2<=seg0;else if (Q2<=3'd1) Y2<=seg1;else if (Q2<=3'd2) Y2<=seg2;else if (Q2<=3'd3) Y2<=seg3;else if (Q2<=3'd4) Y2<=seg4;else if (Q2<=3'd5) Y2<=seg5;else Y2<=seg0;end//---------------------------------------------------reg [3:0]Q3;reg [7:0]Y3;always @ (posedge clk_60s or negedge reset)//Asy_rst beginif (!reset) Q3<=4'd0;else if (Q3<4'd9) Q3<=Q3+1'b1;//0-9else Q3<=4'd0;endalways @ (Q3)//circlebeginif (Q3<=4'd0) Y3<=seg0;else if (Q3<=4'd1) Y3<=seg1;else if (Q3<=4'd2) Y3<=seg2;else if (Q3<=4'd3) Y3<=seg3;else if (Q3<=4'd4) Y3<=seg4;else if (Q3<=4'd5) Y3<=seg5;else if (Q3<=4'd6) Y3<=seg6;else if (Q3<=4'd7) Y3<=seg7;else if (Q3<=4'd8) Y3<=seg8;else if (Q3<=4'd9) Y3<=seg9;else Y3<=seg0;end//----------------------------------------------reg [2:0]Q4;reg [7:0]Y4;always @ (posedge clk_600s or negedge reset)//Asy_rst beginif (!reset) Q4<=3'd0;else if (Q4<3'd5) Q4<=Q4+1'b1;//[0-5]else Q4<=3'd0;endalways @ (Q4)//circlebeginif (Q4<=3'd0) Y4<=seg0;else if (Q4<=3'd1) Y4<=seg1;else if (Q4<=3'd2) Y4<=seg2;else if (Q4<=3'd3) Y4<=seg3;else if (Q4<=3'd4) Y4<=seg4;else if (Q4<=3'd5) Y4<=seg5;else Y4<=seg0;end//--------------------------------------------------endmodule。
数字时钟的Verilog代码
数字时钟的Verilog代码一、功能说明:1.可准确计时2.可按键复位3.可模式切换是正常计数还是调整秒位,或调整分位或小时位,再按置数键可调整4.切换为调整模式时,相应的被调整位会2Hz的闪烁注:我的FPGA开发板时钟为33.8688Mhz我的主体代码里的信号都是1有效,但开发板按键按下去时是置0,所以我在主体代码的前面都使用了反相器。
代码均调试成功,没有任何问题,同学们可以放心复制粘贴。
二、模块说明1.主体代码2.按键消抖模块3.分频器模块我的主题代码中嵌入了按键消抖模块,按键消抖中又嵌入了分频器。
请阅读此文档的同学不要漏加,否则不能正常工作三、代码(1)主体代码module clock(seg7,scan,clk,clr1,mode2,inc2);output[7:0] seg7;output[5:0] scan;input clk; //时钟输入20MHzinput clr1; //清零端input mode2; //控制信号,用于选择模式input inc2; //置数信号//按键全部反逻辑wire clr,mode,inc;assign clr=~clr1;wire mode1,inc1;assign mode=~mode1;assign inc=~inc1;reg[7:0] seg7; //8段显示控制信号(abcdefg.dp)reg[5:0] scan; //数码管地址选择信号reg[1:0] state; //定义4种状态reg[3:0] qhh,qhl,qmh,qml,qsh,qsl; //小时、分、秒的高位和低位reg[3:0] data;reg[2:0] cnt; //扫描数码管的计数器reg clk1khz,clk1hz,clk2hz; //1kHz、1Hz、2Hz的分频信号reg[2:0] blink; //闪烁信号reg inc_reg;//按键置数寄存器reg[7:0] sec,min;//定义按键置数时的时分秒寄存器reg[7:0] hour;parameter state0=2'b00,state1=2'b01,state2=2'b10,state3=2'b11;//状态0-3定义reg[14:0] n1;reg[24:0] n2;reg[23:0] n3;//----------------------按键消抖-----------------------------IP_ButtonDebounce m1(.clk(clk),.rst(clr),.BTN0(mode2),.BTN_DEB(mode1));IP_ButtonDebounce m2(.clk(clk),.rst(clr),.BTN0(inc2),.BTN_DEB(inc1));assign mode=~mode1;assign inc=~inc1;//-----------------------------800Hz分频,用于扫描数码管地址--------always@(posedge clk or posedge clr)beginif(clr) beginclk1khz<=0;n1<=0;endelse if(n1==42336/2-1) beginclk1khz<=~clk1khz;n1<=0;endelse n1<=n1+1;end//---------------------- 1Hz分频,用于计时-----------------------------always@(posedge clk or posedge clr)beginif(clr) beginclk1hz<=0;n2<=0;endelse if(n2==33868800/2-1) beginclk1hz<=~clk1hz;n2<=0;endelse n2<=n2+1;end//---------------------- 2Hz分频,用于闪烁----------------------------- always@(posedge clk or posedge clr)beginif(clr) beginclk2hz<=0;n3<=0;endelse if(n3==16934400/2-1) beginclk2hz<=~clk2hz;n3<=0;endelse n3<=n3+1;end//-------------------------模式转换-------------------------always @(posedge mode or posedge clr)beginif(clr) beginstate<=2'b00;endelse beginif(state==2'b11) beginstate<=2'b00;endelse beginstate<=state+1;endendend//-------------------------状态控制-----------------------------always @(posedge clk1hz or posedge clr)beginif(clr) beginhour<=7'b0000000;min<=7'b0000000;sec<=7'b0000000;inc_reg<=0;endelse begincase(state)state0:begin //模式0,正常计时if(sec==8'd59)beginsec<=8'd0;if(min==8'd59) beginmin<=8'd0;if(hour==8'd23) beginhour<=8'd0;endelse beginhour<=hour+1;endendelse beginmin<=min+1;endendelse beginsec<=sec+1;endendstate1:begin //模式1,设定小时时间if(inc)b egin//如果置数键按下if(!inc_reg) begin //如果置数寄存器值为0inc_reg<=1;//置数寄存器值置1if(hour==8'd23) beginhour<=8'd0;endelse beginhour<=hour+1;endendendelse begin//如果置数键未按下inc_reg<=0; //置数寄存器还是为0endendstate2:begin //模式2,设定分钟时间if(inc) beginif(!inc_reg) begininc_reg<=1;if(min==8'd59) beginmin<=8'd0;endelse beginmin<=min+1;endendendelse begininc_reg<=0;endendstate3:begin //模式3,设定秒钟时间if(inc) beginif(!inc_reg) begininc_reg<=1;if(sec==8'd59) beginsec<=8'd0;endelse beginsec<=sec+1;endendendelse begininc_reg<=0;endendendcaseendend//--------------------------------当进行时间设定时,令数码管闪烁----------------------- always @(state,clk2hz,clr) beginif(clr) beginblink[2:0]<=3'b111;endelse begincase(state)state0:blink[2:0]<=3'b111;//正常计数时,闪烁信号全为1state1:blink[2]<=clk2hz;state2:blink[1]<=clk2hz;state3:blink[0]<=clk2hz;default:blink[2:0]<=3'b111;//默认为1endcaseendend//--------------------------秒计数的十进制转BCD码---------------------------always @(sec,clr) beginif(clr) beginqsh[3:0]<=4'b0000;qsl[3:0]<=4'b0000;endelse begincase(sec[7:0])8'd0:begin qsh[3:0]<='b0000;qsl[3:0]<='b0000; end 8'd1:begin qsh[3:0]<='b0000;qsl[3:0]<='b0001; end 8'd2:begin qsh[3:0]<='b0000;qsl[3:0]<='b0010; end 8'd3:begin qsh[3:0]<='b0000;qsl[3:0]<='b0011; end 8'd4:begin qsh[3:0]<='b0000;qsl[3:0]<='b0100; end 8'd5:begin qsh[3:0]<='b0000;qsl[3:0]<='b0101; end 8'd6:begin qsh[3:0]<='b0000;qsl[3:0]<='b0110; end 8'd7:begin qsh[3:0]<='b0000;qsl[3:0]<='b0111; end 8'd8:begin qsh[3:0]<='b0000;qsl[3:0]<='b1000; end 8'd9:begin qsh[3:0]<='b0000;qsl[3:0]<='b1001; end 8'd10:begin qsh[3:0]<='b0001;qsl[3:0]<='b0000; end 8'd11:begin qsh[3:0]<='b0001;qsl[3:0]<='b0001; end 8'd12:begin qsh[3:0]<='b0001;qsl[3:0]<='b0010; end 8'd13:begin qsh[3:0]<='b0001;qsl[3:0]<='b0011; end 8'd14:begin qsh[3:0]<='b0001;qsl[3:0]<='b0100; end 8'd15:begin qsh[3:0]<='b0001;qsl[3:0]<='b0101; end 8'd16:begin qsh[3:0]<='b0001;qsl[3:0]<='b0110; end 8'd17:begin qsh[3:0]<='b0001;qsl[3:0]<='b0111; end 8'd18:begin qsh[3:0]<='b0001;qsl[3:0]<='b1000; end 8'd19:begin qsh[3:0]<='b0001;qsl[3:0]<='b1001; end 8'd20:begin qsh[3:0]<='b0010;qsl[3:0]<='b0000; end 8'd21:begin qsh[3:0]<='b0010;qsl[3:0]<='b0001; end 8'd22:begin qsh[3:0]<='b0010;qsl[3:0]<='b0010; end 8'd23:begin qsh[3:0]<='b0010;qsl[3:0]<='b0011; end 8'd24:begin qsh[3:0]<='b0010;qsl[3:0]<='b0100; end 8'd25:begin qsh[3:0]<='b0010;qsl[3:0]<='b0101; end 8'd26:begin qsh[3:0]<='b0010;qsl[3:0]<='b0110; end 8'd27:begin qsh[3:0]<='b0010;qsl[3:0]<='b0111; end 8'd28:begin qsh[3:0]<='b0010;qsl[3:0]<='b1000; end 8'd29:begin qsh[3:0]<='b0010;qsl[3:0]<='b1001; end 8'd30:begin qsh[3:0]<='b0011;qsl[3:0]<='b0000; end 8'd31:begin qsh[3:0]<='b0011;qsl[3:0]<='b0001; end 8'd32:begin qsh[3:0]<='b0011;qsl[3:0]<='b0010; end 8'd33:begin qsh[3:0]<='b0011;qsl[3:0]<='b0011; end 8'd34:begin qsh[3:0]<='b0011;qsl[3:0]<='b0100; end 8'd35:begin qsh[3:0]<='b0011;qsl[3:0]<='b0101; end 8'd36:begin qsh[3:0]<='b0011;qsl[3:0]<='b0110; end 8'd37:begin qsh[3:0]<='b0011;qsl[3:0]<='b0111; end 8'd38:begin qsh[3:0]<='b0011;qsl[3:0]<='b1000; end 8'd39:begin qsh[3:0]<='b0011;qsl[3:0]<='b1001; end 8'd40:begin qsh[3:0]<='b0100;qsl[3:0]<='b0000; end 8'd41:begin qsh[3:0]<='b0100;qsl[3:0]<='b0001; end 8'd42:begin qsh[3:0]<='b0100;qsl[3:0]<='b0010; end8'd44:begin qsh[3:0]<='b0100;qsl[3:0]<='b0100; end8'd45:begin qsh[3:0]<='b0100;qsl[3:0]<='b0101; end8'd46:begin qsh[3:0]<='b0100;qsl[3:0]<='b0110; end8'd47:begin qsh[3:0]<='b0100;qsl[3:0]<='b0111; end8'd48:begin qsh[3:0]<='b0100;qsl[3:0]<='b1000; end8'd49:begin qsh[3:0]<='b0100;qsl[3:0]<='b1001; end8'd50:begin qsh[3:0]<='b0101;qsl[3:0]<='b0000; end8'd51:begin qsh[3:0]<='b0101;qsl[3:0]<='b0001; end8'd52:begin qsh[3:0]<='b0101;qsl[3:0]<='b0010; end8'd53:begin qsh[3:0]<='b0101;qsl[3:0]<='b0011; end8'd54:begin qsh[3:0]<='b0101;qsl[3:0]<='b0100; end8'd55:begin qsh[3:0]<='b0101;qsl[3:0]<='b0101; end8'd56:begin qsh[3:0]<='b0101;qsl[3:0]<='b0110; end8'd57:begin qsh[3:0]<='b0101;qsl[3:0]<='b0111; end8'd58:begin qsh[3:0]<='b0101;qsl[3:0]<='b1000; end8'd59:begin qsh[3:0]<='b0101;qsl[3:0]<='b1001; enddefault: begin qsh[3:0]<=4'b0000;qsl[3:0]<='b0; endendcaseendend//---------------------------分计数的十进制转BCD码-------------------- always @(min,clr)beginif(clr) beginqmh[3:0]<='b0000;qml[3:0]<='b0000;endelse begincase(min[7:0])8'd0:begin qmh[3:0]<='b0000;qml[3:0]<='b0000; end8'd1:begin qmh[3:0]<='b0000;qml[3:0]<='b0001; end8'd2:begin qmh[3:0]<='b0000;qml[3:0]<='b0010; end8'd3:begin qmh[3:0]<='b0000;qml[3:0]<='b0011; end8'd4:begin qmh[3:0]<='b0000;qml[3:0]<='b0100; end8'd5:begin qmh[3:0]<='b0000;qml[3:0]<='b0101; end8'd6:begin qmh[3:0]<='b0000;qml[3:0]<='b0110; end8'd7:begin qmh[3:0]<='b0000;qml[3:0]<='b0111; end8'd8:begin qmh[3:0]<='b0000;qml[3:0]<='b1000; end8'd9:begin qmh[3:0]<='b0000;qml[3:0]<='b1001; end8'd10:begin qmh[3:0]<='b0001;qml[3:0]<='b0000; end8'd11:begin qmh[3:0]<='b0001;qml[3:0]<='b0001; end8'd12:begin qmh[3:0]<='b0001;qml[3:0]<='b0010; end8'd13:begin qmh[3:0]<='b0001;qml[3:0]<='b0011; end8'd15:begin qmh[3:0]<='b0001;qml[3:0]<='b0101; end 8'd16:begin qmh[3:0]<='b0001;qml[3:0]<='b0110; end 8'd17:begin qmh[3:0]<='b0001;qml[3:0]<='b0111; end 8'd18:begin qmh[3:0]<='b0001;qml[3:0]<='b1000; end 8'd19:begin qmh[3:0]<='b0001;qml[3:0]<='b1001; end 8'd20:begin qmh[3:0]<='b0010;qml[3:0]<='b0000; end 8'd21:begin qmh[3:0]<='b0010;qml[3:0]<='b0001; end 8'd22:begin qmh[3:0]<='b0010;qml[3:0]<='b0010; end 8'd23:begin qmh[3:0]<='b0010;qml[3:0]<='b0011; end 8'd24:begin qmh[3:0]<='b0010;qml[3:0]<='b0100; end 8'd25:begin qmh[3:0]<='b0010;qml[3:0]<='b0101; end 8'd26:begin qmh[3:0]<='b0010;qml[3:0]<='b0110; end 8'd27:begin qmh[3:0]<='b0010;qml[3:0]<='b0111; end 8'd28:begin qmh[3:0]<='b0010;qml[3:0]<='b1000; end 8'd29:begin qmh[3:0]<='b0010;qml[3:0]<='b1001; end 8'd30:begin qmh[3:0]<='b0011;qml[3:0]<='b0000; end 8'd31:begin qmh[3:0]<='b0011;qml[3:0]<='b0001; end 8'd32:begin qmh[3:0]<='b0011;qml[3:0]<='b0010; end 8'd33:begin qmh[3:0]<='b0011;qml[3:0]<='b0011; end 8'd34:begin qmh[3:0]<='b0011;qml[3:0]<='b0100; end 8'd35:begin qmh[3:0]<='b0011;qml[3:0]<='b0101; end 8'd36:begin qmh[3:0]<='b0011;qml[3:0]<='b0110; end 8'd37:begin qmh[3:0]<='b0011;qml[3:0]<='b0111; end 8'd38:begin qmh[3:0]<='b0011;qml[3:0]<='b1000; end 8'd39:begin qmh[3:0]<='b0011;qml[3:0]<='b1001; end 8'd40:begin qmh[3:0]<='b0100;qml[3:0]<='b0000; end 8'd41:begin qmh[3:0]<='b0100;qml[3:0]<='b0001; end 8'd42:begin qmh[3:0]<='b0100;qml[3:0]<='b0010; end 8'd43:begin qmh[3:0]<='b0100;qml[3:0]<='b0011; end 8'd44:begin qmh[3:0]<='b0100;qml[3:0]<='b0100; end 8'd45:begin qmh[3:0]<='b0100;qml[3:0]<='b0101; end 8'd46:begin qmh[3:0]<='b0100;qml[3:0]<='b0110; end 8'd47:begin qmh[3:0]<='b0100;qml[3:0]<='b0111; end 8'd48:begin qmh[3:0]<='b0100;qml[3:0]<='b1000; end 8'd49:begin qmh[3:0]<='b0100;qml[3:0]<='b1001; end 8'd50:begin qmh[3:0]<='b0101;qml[3:0]<='b0000; end 8'd51:begin qmh[3:0]<='b0101;qml[3:0]<='b0001; end 8'd52:begin qmh[3:0]<='b0101;qml[3:0]<='b0010; end 8'd53:begin qmh[3:0]<='b0101;qml[3:0]<='b0011; end 8'd54:begin qmh[3:0]<='b0101;qml[3:0]<='b0100; end 8'd55:begin qmh[3:0]<='b0101;qml[3:0]<='b0101; end 8'd56:begin qmh[3:0]<='b0101;qml[3:0]<='b0110; end 8'd57:begin qmh[3:0]<='b0101;qml[3:0]<='b0111; end8'd59:begin qmh[3:0]<='b0101;qml[3:0]<='b1001; enddefault:begin qmh[3:0]<='b0;qml[3:0]<='b0; endendcaseendend//----------------------------小时计数的十进制转BCD码------------------------ always @(hour,clr)beginif(clr) beginqhh[3:0]<='b0000;qhl[3:0]<='b0000;endelse begincase(hour)8'd0:begin qhh[3:0]<='b0000;qhl[3:0]<='b0000; end8'd1:begin qhh[3:0]<='b0000;qhl[3:0]<='b0001; end8'd2:begin qhh[3:0]<='b0000;qhl[3:0]<='b0010; end8'd3:begin qhh[3:0]<='b0000;qhl[3:0]<='b0011; end8'd4:begin qhh[3:0]<='b0000;qhl[3:0]<='b0100; end8'd5:begin qhh[3:0]<='b0000;qhl[3:0]<='b0101; end8'd6:begin qhh[3:0]<='b0000;qhl[3:0]<='b0110; end8'd7:begin qhh[3:0]<='b0000;qhl[3:0]<='b0111; end8'd8:begin qhh[3:0]<='b0000;qhl[3:0]<='b1000; end8'd9:begin qhh[3:0]<='b0000;qhl[3:0]<='b1001; end8'd10:begin qhh[3:0]<='b0001;qhl[3:0]<='b0000; end8'd11:begin qhh[3:0]<='b0001;qhl[3:0]<='b0001; end8'd12:begin qhh[3:0]<='b0001;qhl[3:0]<='b0010; end8'd13:begin qhh[3:0]<='b0001;qhl[3:0]<='b0011; end8'd14:begin qhh[3:0]<='b0001;qhl[3:0]<='b0100; end8'd15:begin qhh[3:0]<='b0001;qhl[3:0]<='b0101; end8'd16:begin qhh[3:0]<='b0001;qhl[3:0]<='b0110; end8'd17:begin qhh[3:0]<='b0001;qhl[3:0]<='b0111; end8'd18:begin qhh[3:0]<='b0001;qhl[3:0]<='b1000; end8'd19:begin qhh[3:0]<='b0001;qhl[3:0]<='b1001; end8'd20:begin qhh[3:0]<='b0010;qhl[3:0]<='b0000; end8'd21:begin qhh[3:0]<='b0010;qhl[3:0]<='b0001; end8'd22:begin qhh[3:0]<='b0010;qhl[3:0]<='b0010; end8'd23:begin qhh[3:0]<='b0010;qhl[3:0]<='b0011; enddefault:begin qhh[3:0]<='b0;qhl[3:0]<='b0; endendcaseendend//------------------------------数码管动态扫描-------------------------------------always @(posedge clk1khz or posedge clr) beginif(clr) begincnt<=3'b000;scan<=6'b111111;data<=4'b0000;endelse if(clk1khz) beginif(cnt==3'b101) cnt<=3'b000;else cnt<=cnt+1;case(cnt)3'b000:begin data[3:0]<=qsl[3:0];scan[5:0]<=6'b000001&{6{blink[0]}}; end3'b001:begin data[3:0]<=qsh[3:0];scan[5:0]<=6'b000010&{6{blink[0]}}; end3'b010:begin data[3:0]<=qml[3:0];scan[5:0]<=6'b000100&{6{blink[1]}}; end3'b011:begin data[3:0]<=qmh[3:0];scan[5:0]<=6'b001000&{6{blink[1]}}; end3'b100:begin data[3:0]<=qhl[3:0];scan[5:0]<=6'b010000&{6{blink[2]}}; end3'b101:begin data[3:0]<=qhh[3:0];scan[5:0]<=6'b100000&{6{blink[2]}}; endendcaseendend//-----------------------------------7段译码----------------------------------------always @(data)begincase(data[3:0])4'b0000:seg7[7:0]=8'b00111111; //04'b0001:seg7[7:0]=8'b00000110; //14'b0010:seg7[7:0]=8'b01011011; //24'b0011:seg7[7:0]=8'b01001111; //34'b0100:seg7[7:0]=8'b01100110; //44'b0101:seg7[7:0]=8'b01101101; //54'b0110:seg7[7:0]=8'b01111101; //64'b0111:seg7[7:0]=8'b00000111; //74'b1000:seg7[7:0]=8'b01111111; //84'b1001:seg7[7:0]=8'b01101111; //9default:seg7[7:0]=8'b00111111; //0endcaseendendmodule(2)按键消抖模块module IP_ButtonDebounce( clk,rst,BTN0,BTN_DEB );input clk;input rst;input BTN0;output BTN_DEB;//分频得200HZ,5ms时钟wire clk_169344;IP_1Hz #(169344) U1(.clk(clk),.rst(rst),.clk_N(clk_169344));reg BTN_r,BTN_rr,BTN_rrr;always@(posedge rst,posedge clk_169344 ) beginif(rst) beginBTN_rrr<=1'b1;BTN_rr<=1'b1;BTN_r<=1'b1;endelse beginBTN_rrr<=BTN_rr;BTN_rr<=BTN_r;BTN_r<=BTN0;endendassign BTN_DEB=BTN_r&BTN_rr&BTN_rrr;endmodule(3)分频器模块module IP_1Hz(clk,rst,clk_N); //clk=33.8688MHz,N分频模块input clk;input rst;output reg clk_N;parameter N=4;integer count;always@(posedge clk or posedge rst)beginif(rst) beginclk_N<=0;count<=0;endelse if(count==N/2-1) beginclk_N<= ~clk_N;count<=0;end。
电子钟(FPGA设计verilog代码)
电子钟(FPGA设计verilog代码)//*****************************************//电子钟:24小时制时分秒////作者:yotain////clk 50M时钟 CP 1Hz输出可接LED指示灯//nCR 清零(必须接低电平异步清零)//Adj_Min (分校正低电平计时必须接)//Adj_Hour (时校正低电平计时必须接)//dataout (数码管输出)//en (数码管使能端)//(Hour Minute Second 可以不接也可以单独接数码管一位的) //修改bcd_decoder 即可修改显示////*****************************************//************ timeclock top block*************module top_clock ( Hour, Minute, Second, CP, nCR, EN, Adj_Min, Adj_Hour,clk,dataout,en) ;input clk, nCR, EN, Adj_Min, Adj_Hour;output CP;output [7:0] Hour, Minute, Second,dataout;output [3:0] en;wire [7:0] Hour, Minute, Second, dataout;supply1 Vdd;wire MinL_EN, MinH_EN, Hour_EN;//**************Hour, Minute, Second counter************counter10 U1 ( Second[3:0], nCR, EN, CP);counter6 U2 ( Second[7:4], nCR, ( Second[3:0]==4'h9), CP);assign MinL_EN = Adj_Min? Vdd : (Second==8'h59);assign MinH_EN = ( Adj_Min &&( Minute [3:0] ==4'h59))|| ( Minute[3:0]==4'h9)&& (Second == 8'h59);counter10 U3 ( Minute[3:0], nCR, MinL_EN,CP);counter6 U4 ( Minute[7:4], nCR, MinH_EN,CP);assign Hour_EN = Adj_Hour ? Vdd: ((Minute == 8'h59)&&(Second == 8'h59));counter24 U5 ( Hour[7:4], Hour[3:0], nCR, Hour_EN,CP);bcd_decoder U6 (clk,nCR,Hour[7:4],Hour[3:0],Minute[7:4],Minute[3:0],dataout,en);PULSE U7(clk,CP);endmodule//**************counter10 ( BCD 0~9 )*************module counter10 ( Q, nCR, EN, CP);input CP, nCR, EN;output [3 : 0] Q;reg [3 : 0] Q;always @ (posedge CP or negedge nCR)beginif( !nCR ) Q<=4'b0000;else if ( !EN ) Q<=Q;else if ( Q ==4'b1001) Q <= 4'b0000;else Q <= Q+1'b1;endendmodule//**************counter6 ( BCD 0~5 )************ module counter6 ( Q, nCR, EN, CP);input CP, nCR, EN;output [3:0] Q;reg [3:0] Q;always @ (posedge CP or negedge nCR ) beginif(!nCR) Q<= 4'b0000;else if (!EN) Q<=Q;else if (Q == 4'b0101) Q<=4'b0000;else Q <= Q + 1'b1;endendmodule//***************counter24 ( 0~23 )************** module counter24 ( CntH, CntL, nCR, EN, CP); input CP, nCR, EN;output[3:0] CntH,CntL;reg [3:0] CntH,CntL;reg CO;always @ (posedge CP or negedge nCR)if(!nCR) {CntH,CntL} <=8'h00;else if(!EN) {CntH,CntL} <= {CntH,CntL};else if ( (CntH>2)||(CntL>9) || ( (CntH==2)&&(CntL>=3) ) ) {CntH,CntL} <=8'h00;else if((CntH==2)&&(CntL<3))beginCntH<=CntH;CntL<=CntL+1'b1;endelse if (CntL==9)beginCntH=CntH+1'b1;CntL=4'b0000;endelse beginCntH<=CntH;CntL<=CntL+1'b1;endendendmodule//*************cnt_1Hz*****************module PULSE ( clk, clk_1Hz);input clk;output clk_1Hz;reg [24:0] cnt_1Hz;reg R_clk=0;assign clk_1Hz=R_clk;always @ (posedge clk)if (cnt_1Hz==50000000) cnt_1Hz<=0;else cnt_1Hz<=cnt_1Hz+1;endalways @ (posedge clk)beginif(cnt_1Hz<=25000000) R_clk<=1;else R_clk<=0;endendmodule//*************bcd_decoder*************module bcd_decoder (clk,nCR,A,B,C,D,dataout,en);input clk; //system clockinput nCR; //system reset,low is activeinput [3:0] A,B,C,D;output[7:0] dataout;output[3:0] en; //enable high is activereg[7:0] dataout;reg[4:0] en;reg[15:0] cnt_scan;reg[3:0] dataout_buf;always@(posedge clk or negedge nCR)beginif(!nCR) begincnt_scan<=0;endelse begincnt_scan<=cnt_scan+1; endendalways@(cnt_scan) begincase(cnt_scan[15:14]) 2'b00:en=4'b0001;2'b01:en=4'b0010;2'b10:en=4'b0100;2'b11:en=4'b1000; default:en=4'b1111; endcaseendalways@(en)begincase(en)4'b0001:dataout_buf=A;4'b0010:dataout_buf=B;4'b0100:dataout_buf=C;dataout_buf=D; default:dataout_buf=4'b0000; endcaseendalways@(dataout_buf) begincase(dataout_buf)4'b0000:dataout=8'b1111_1100; 4'b0001:dataout=8'b0110_0000; 4'b0010:dataout=8'b1101_1010; 4'b0011:dataout=8'b1111_0010; 4'b0100:dataout=8'b0110_0110; 4'b0101:dataout=8'b1011_0110; 4'b0110:dataout=8'b1011_1110; 4'b0111:dataout=8'b1110_0000; 4'b1000:dataout=8'b1111_1110; 4'b1001:dataout=8'b1110_0110;dataout=8'b1110_1110; 4'b1011:dataout=8'b0011_1110; 4'b1100:dataout=8'b1001_1100; 4'b1101:dataout=8'b0111_1010; 4'b1110:dataout=8'b1001_1110; 4'b1111:dataout=8'b1000_1110; default :dataout=8'b0000_0010; endcaseendendmodule//End of RTL code。
简单的数字时钟(verilog设计)
设计目标与要求
设计一个简单的数字 时钟,能够显示时、 分、秒。
时钟应具有可靠性、 稳定性和可扩展性。
要求使用Verilog语 言实现,并能够在 FPGA或ASIC上实现。
设计思路及流程
• 设计思路:采用模块化设计方法,将数字时钟划分为不同的模 块,如计数器模块、显示模块等。每个模块负责实现特定的功 能,并通过接口与其他模块进行通信。
设计思路及流程
设计流程 1. 确定设计需求和目标。 2. 制定设计方案和计划。
设计思路及流程
3. 编写Verilog代码,实现各个模块的功能。 5. 根据测试结果进行调试和优化。
未来改进方向探讨
提高计时精度
通过改进算法或采用更高 性能的硬件平台,提高数
字时钟的计时精度。
降低资源占用
优化代码结构,减少不 必要的资源占用,提高 时钟系统的运行效率。
增加实用功能
拓展应用领域
考虑增加闹钟、定时器 等实用功能,使数字时 钟更加符合用户需求。
探索将数字时钟应用于 更多领域,如智能家居、
数据类型与运算符
Verilog中的数据类型包括
整型、实型、时间型、数组、结构体等。
Verilog中的运算符包括
算术运算符、关系运算符、逻辑运算符、位运算符等。
顺序语句与并行语句
Verilog中的顺序语句包括
赋值语句、条件语句、循环语句等,用于描述电路的时序行为。
Verilog中的并行语句包括
模块实例化、连续赋值语句、门级电路描述等,用于描述电路的并行行为。
用verilog-HDL多功能数字钟
用verilog-HDL多功能数字钟Verilog HDL实验报告基于Verilog HDL语言的多功能数字钟设计一、试验目的设计一个有如下功能的数字钟:(1)计时功能:包括时、分、秒。
(2)定时与闹钟功能:能在所设定的时间发出铃音。
(3)校时功能:对小时、分钟和秒钟进行手动校时。
(4)整点报时功能:每到整点能够发出“嘀嘀嘀嘀嘟”四短一长的报时。
二、试验原理ALERT HOUR[7..0]MIN[7..0]SEC[7..0]LD_ALERT LD_HOUR LD_MINCLK CLK_1K MODE TURN CHANGEclockCLK CLK_1K MODE TURN CHANGEALERTHOUR[7..0]MIN[7..0]SEC[7..0]LD_ALERT LD_HOUR LD_MIN多功能数字钟端口示意图数字钟设有五个输入端,分别为时钟输入(CLK )、模式(MODE )、产生声音的时钟信号(CLK_1K )、切换(TURN )和调时(CHANGE )键。
输出共七个,其中HOUR[7..0]、MIN[7..0]和SEC[7..0]采用BCD 计数方式,分别驱动2个数码管。
硬件电路原理图如下:三、试验内容1. 代码/*信号定义:clk: 标准时钟信号,其频率为4Hz;clk_1k:产生闹铃声、报时音的时钟信号,其频率为1024Hz;mode:功能控制信号;为0:计时功能;为1:闹钟功能;为2:手动校时功能;turn:接按键,在手动校时功能时,选择是调整小时还是分钟;若长时间按住改建,还可使秒信号清零,用于精确调时;change: 接按键,手动调整时,每按一次,计数器加1;如果长按,则连续快速加1,用于快速调时和定时;hour,min,sec:此三信号分别输出并显示时、分、秒信号,皆采用BCD码计数,分别驱动6个数码管显示时间;alert:输出到扬声器的信号,用于产生闹铃音和报时音;闹铃音为持续20秒的急促的“嘀嘀嘀”音,若按住“change”键,则可屏蔽该音;整点报时音为“嘀嘀嘀嘀嘟”四短一长音;LD_alert:接发光二极管,指示是否设置了闹钟功能;LD_hour:接发光二极管,指示当前调整的是小时信号;LD_min:接发光二极管,指示当前调整的是分钟信号*/moduleclock(clk,clk_1k,mode,change,turn,alert,hour,min,sec,LD_alert,LD_hour,LD_mi n);input clk,clk_1k,mode,change,turn;output alert,LD_alert,LD_hour,LD_min;output[7:0] hour,min,sec;reg[7:0] hour,min,sec,hour1,min1,sec1,ahour,amin;reg[1:0] m,fm,num1,num2,num3,num4;reg[1:0] loop1,loop2,loop3,loop4,sound;reg LD_hour,LD_min;reg clk_1Hz,clk_2Hz,minclk,hclk;reg alert1,alert2,ear;reg count1,count2,counta,countb;wire ct1,ct2,cta,ctb,m_clk,h_clk;always @(posedge clk)beginclk_2Hz<=~clk_2Hz;if(sound==3) begin sound<=0; ear<=1; end //ear信号用于产生或屏蔽声音else begin sound<=sound+1; ear<=0; endendalways @(posedge clk_2Hz) //由4Hz的输入时钟产生1Hz的时基信号clk_1Hz<=~clk_1Hz;always @(posedge mode) //mode信号控制系统在三种功能间转换begin if(m==2) m<=0; else m<=m+1; endalways @(posedge turn)fm<=~fm;always //产生count1,count2,counta,countb四个信号begincase(m)2:begin if(fm)begin count1<=change; {LD_min,LD_hour}<=2; endelsebegin counta<=change; {LD_min,LD_hour}<=1; end{count2,countb}<=0;end1:begin if(fm)begin count2<=change; {LD_min,LD_hour}<=2; endelsebegin countb<=change; {LD_min,LD_hour}<=1; end{count1,counta}<=2'b00;enddefault:{count1,count2,counta,countb,LD_min,LD_hour}<=0;endcaseendalways @(negedge clk) //如果长时间按下“change”键,则生成“num1”信号用于连续快速加1if(count2) beginif(loop2==3) num2<=1;elsebegin loop2<=loop2+1; num2<=0;endendelse begin loop2<=0; num2<=0; endalways @(negedge clk) //产生num2信号if(count1) beginif(loop3==3) num3<=1;elsebegin loop3<=loop3+1; num3<=0; endendelse begin loop3<=0; num3<=0; endalways @(negedge clk)if(counta) beginif(loop4==3) num4<=1;elsebegin loop4<=loop4+1; num4<=0; endendelse begin loop4<=0; num4<=0; endassign ct1=(num3&clk)|(!num3&m_clk); //ct1用于计时、校时中的分钟计数assign ct2=(num1&clk)|(!num1&count2); //ct2用于在定时状态下调整分钟信号assign cta=(num4&clk)|(!num4&h_clk); //cta用于计时、校时中的小时计数assign ctb=(num2&clk)|(!num2&countb); //ctb用于在定时状态下调整小时信号always @(posedge clk_1Hz) //秒计时和秒调整进程if(!(sec1^8'h59)|turn&(!m))beginsec1<=0;if(!(turn&(!m))) minclk<=1;end//按住“turn”按键一段时间,秒信号可清零,该功能用于手动精确调时else beginif(sec1[3:0]==4'b1001)begin sec1[3:0]<=4'b0000; sec1[7:4]<=sec1[7:4]+1; endelse sec1[3:0]<=sec1[3:0]+1; minclk<=0;endassign m_clk=minclk||count1;always @(posedge ct1) //分计时和分调整进程beginif(min1==8'h59) begin min1<=0; hclk<=1; endelse beginif(min1[3:0]==9)begin min1[3:0]<=0; min1[7:4]<=min1[7:4]+1; endelse min1[3:0]<=min1[3:0]+1; hclk<=0;endendassign h_clk=hclk||counta;always @(posedge cta) //小时计时和小时调整进程if(hour1==8'h23) hour1<=0;else if(hour1[3:0]==9)begin hour1[7:0]<=hour1[7:4]+1; hour1[3:0]<=0; endelse hour1[3:0]<=hour1[3:0]+1;always @(posedge ct2) //闹钟定时功能中的分钟调节进程if(amin==8'h59) amin<=0;else if(amin[3:0]==9)begin amin[3:0]<=0; amin[7:4]<=amin[7:4]+1; endelse amin[3:0]<=amin[3:0]+1;always @(posedge ctb) //闹钟定时功能中的小时调节进程if(ahour==8'h23) ahour<=0;else if(ahour[3:0]==9)begin ahour[3:0]<=0; ahour[7:4]<=ahour[7:4]+1; endelse ahour[3:0]<=ahour[3:0]+1;always //闹铃功能if((min1==amin)&&(hour1==ahour)&&(amin|ahour)&&(!change))//若按住“change”键不放,可屏蔽闹铃音if(sec1<8'h20) alert1<=1; //控制闹铃的时间长短else alert1<=0;else alert1<=0;always //时、分、秒的现实控制case(m)3'b00: begin hour<=hour1; min<=min1; sec<=sec1; end//计时状态下的时、分、秒显示3'b01: begin hour<=ahour; min<=amin; sec<=8'hzz; end//定时状态下的时、分、秒显示3'b10: begin hour<=hour1; min<=min1; sec<=8'hzz; end//校时状态下的时、分、秒显示endcaseassign LD_alert=(ahour|amin)?1:0; //指示是否进行了闹铃定时assign alert=((alert1)?clk_1k&clk:0)|alert2; //产生闹铃音或整点报时音always //产生整点报时信号alert2beginif((min1==8'h59)&&(sec1>8'h54)||(!(min1|sec1)))if(sec1>8'h54) alert2<=ear&clk_1k; //产生短音else alert2<=!ear&clk_1k; //产生长音else alert2<=0;endendmodule2. 仿真图四、小结及体会为了做多功能数字钟,我借了多本关于Verilog HDL的程序设计书。
verilog实验分秒电子钟
module top(clkh,clkl,rst,sel,out);input clkh;input clkl;input rst;output [2:0] sel;output [7:0] out;reg [2:0] sel;reg [3:0] cnt1;reg [3:0] cnt2;reg [3:0] cnt3;reg [3:0] cnt4;reg [7:0] out1;reg [7:0] out2;reg [7:0] out3;reg [7:0] out4;reg [7:0] out;always @(posedge clkh or negedge rst)beginif (!rst) sel<=3'd7;else if (sel==3'd7) sel <=3'd4;else sel<=sel+3'd1;endalways @(posedge clkl or negedge rst)beginif (!rst) cnt1<=4'b0;else if (cnt1==4'd9) cnt1<=4'b0;else cnt1<=cnt1+4'b1;endalways @(posedge clkl or negedge rst)beginif (!rst) cnt2<=4'b0;else if ((cnt2==4'd5)&&(cnt1==4'd9)) cnt2<=4'b0;else if (cnt1==4'd9) cnt2<=cnt2+4'b1;else cnt2<=cnt2;endalways @(posedge clkl or negedge rst)beginif (!rst) cnt3<=4'b0;else if ((cnt3==4'd9)&&(cnt2==4'd5)&&(cnt1==4'd9)) cnt3<=4'b0; else if ((cnt2== 4'd5)&&(cnt1==4'd9)) cnt3<=cnt3+4'b1;else cnt3<=cnt3;endalways @(posedge clkl or negedge rst)beginif (!rst) cnt4<=4'b0;else if ((cnt4==4'd5)&&(cnt3==4'd9)&&(cnt2==4'd5)&&(cnt1==4'd9)) cnt4<=4'b0; else if ((cnt3==4'd9)&&(cnt2==4'd5)&&(cnt1==4'd9)) cnt4<=cnt4+4'b1;else cnt4<=cnt4;endalways @(cnt1)begincase(cnt1)4'd0:out1=8'b0011_1111;//04'd1:out1=8'b0000_0110;//14'd2:out1=8'b0101_1011;//24'd3:out1=8'b0100_1111;//34'd4:out1=8'b0110_0110;//44'd5:out1=8'b0110_1101;//54'd6:out1=8'b0111_1101;//64'd7:out1=8'b0000_0111;//74'd8:out1=8'b0111_1111;//84'd9:out1=8'b0110_1111;//9default:out1=8'b0011_1111;//0endcaseendalways @(cnt2)begincase(cnt2)4'd0:out2=8'b0011_1111;//04'd1:out2=8'b0000_0110;//14'd2:out2=8'b0101_1011;//24'd3:out2=8'b0100_1111;//34'd4:out2=8'b0110_0110;//44'd5:out2=8'b0110_1101;//5default:out2=8'b0011_1111;//0endcaseendalways @(cnt3)begincase(cnt3)4'd0:out3=8'b1011_1111;//0.4'd1:out3=8'b1000_0110;//1. 4'd2:out3=8'b1101_1011;//2. 4'd3:out3=8'b1100_1111;//3.4'd4:out3=8'b1110_0110;//4. 4'd5:out3=8'b1110_1101;//5. 4'd6:out3=8'b1111_1101;//6.4'd7:out3=8'b1000_0111;//7. 4'd8:out3=8'b1111_1111;//8.4'd9:out3=8'b1110_1111;//9. default:out3=8'b1011_1111;//0. endcaseendalways @(cnt4)begincase(cnt4)4'd0:out4=8'b0011_1111;//04'd1:out4=8'b0000_0110;//14'd2:out4=8'b0101_1011;//24'd3:out4=8'b0100_1111;//34'd4:out4=8'b0110_0110;//44'd5:out4=8'b0110_1101;//5 default:out4=8'b0011_1111;//0 endcaseendalways @(sel)begincase(sel)3'd7:out=out1;3'd6:out=out2;3'd5:out=out3;3'd4:out=out4;default:out=8'b0000_0000; endcaseendendmodule`timescale 1ns/1nsmodule test();reg clkl;reg clkh;reg rst;wire [2:0] sel;wire [7:0] out;initialbeginclkl=0;clkh=0;rst=1;#20 rst=0;#50 rst=1;endalways #40 clkl=~clkl;always #4 clkh=~clkh;top m0(.clkl(clkl),.clkh(clkh),.rst(rst),.sel(sel),.out(out)); endmodule。
数字电路时钟设计verilog语言编写-
数字电路时钟设计verilog语言编写-电子线路设计与测试实验报告一、实验名称多功能数字钟设计二、实验目的1.掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程;2.熟悉一种EDA软件使用;3.掌握Verilog设计方法;4.掌握分模块分层次的设计方法;5.用Verilog完成一个多功能数字钟设计。
三、设计内容及要求1.基本功能具有“秒”、“分”、“时”计时功能,小时按24小时制计时。
具有校时功能,能对“分”和“小时”进行调整。
2.扩展功能仿广播电台正点报时。
在59分51秒、53秒、55秒、57秒发出低音512Hz 信号,在59分59秒时发出一次高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。
定时控制,其时间为23时58分。
3.选做内容任意时刻闹钟(闹钟时间可设置)。
自动报整点时数。
四.系统框图与说明数字钟框图1.数字钟电路系统由主体电路和扩展电路两大部分所组成。
2.秒计数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器按照“24进制”规律计数。
3.计数器的输出经译码器送显示器。
五.设计步骤1.列写多功能数字钟设计--层次结构图多功能数字钟顶层模块(clock_main.v)小时计数器(counter24.v)分钟计数器(counter60.v)秒钟计数器(counter60.v)6进制计数器(counter6.v)10进制计数器(counter10.v)6进制计数器(counter6.v)10进制计数器(counter10.v)分频模块(fre_divider.v)固定时刻闹钟设定校时模块任意时刻闹钟(setclock.v)整点报时模块(baoshi.v)2.拟定数字钟的组成框图,在Max+Plus II软件中,使用Verilog 语言输入,采用分层次分模块的方法设计电路;3.设计各单元电路并进行仿真;4.对数字钟的整体逻辑电路图,选择器件,分配引脚,进行逻辑综合;5.下载到Cyclone II FPGA实验平台上,实际测试数字钟的逻辑功能。
verilog 时钟概念
verilog 时钟概念
在Verilog中,时钟是数字逻辑设计中的核心概念,它是系统中的基本定时信号,具有周期性和边沿触发特性。
时钟信号一般表现为连续、稳定的脉冲波形,常用作触发逻辑门电路和其他元件同步更新状态的基准。
在Verilog中,时钟信号通常被声明为输入,并通过`posedge`或`negedge`敏感列表来捕捉时钟上升沿或下降沿触发的事件。
时钟信号驱动状态机切换、存储器读写以及其他需要同步操作的逻辑模块。
设计者还会考虑时钟树综合、时钟偏移、时钟域跨越等问题,确保设计的时序正确性与稳定性。
Verilog数字钟设计实验报告
基于FPGA实现多功能数字钟——电子系071180094王丛屹摘要本文利用Verilog HDL语言自顶向下的设计方法设计多功能数字钟,并通过ISE完成综合、仿真。
此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中,实现了基本的计时显示和设置,调整时间,闹钟设置的功能。
[关键词] FPGA;Verilog HDL;数字钟一、多功能数字钟的设计设计一个多功能数字时钟,具有时分、秒计数显示、闹钟功能。
能够利用按键实现对闹钟时间的设定并在当前显示时间到时后能够进行闹钟提示。
能够利用按键实现“较时”、“较分”功能,随时对数码管的显示进行校正和校对。
数字中系统主要由系统时钟,三个功能按键(mode ,turn ,change ),FPGA ,数码管和蜂鸣器部分组成。
图: 多功能数字钟总体设计模块以下就各个模块说明其功能1. 分频模块由于FPGA内部提供的时钟信号频率大约为50MHz,在这需要将它转化成1Hz的标准时钟信号供数字钟的计时显示;在此我采用了级联分频法。
RTL图如下:代码如下:最终输出的是1Hz,100Hz,1kHz的标准时钟信号clk_1Hz ,clk_100Hz,clk_1k。
2、计时模块原理:m是模式按键,当m=0时,进入计时模式,在计时模式下可以进行时间调整。
num3,num4产生加速调整时间,当其值为1时,可以快速调整时间,该调整时间的频率由clk提供。
counta,count1是手动调节时间。
Turn接按键,可以改变当前调节的是小时还是分钟,长按turn键还可以使秒钟信号清零。
sec1,min1,hour1输出的是计时的秒,分,时。
RTL图如下:代码如下:input count1,counta;output [7:0] sec1,min1;output [7:0] hour1;wire clk_1Hz,ct1,cta,turn,num3,num4;reg [7:0] sec1=0,min1=0;reg [7:0] hour1=0;reg [1:0] m;wire count1,counta;reg minclk,hclk;always @(posedge mode) //mode 信号控制系统在三种功能间转换beginif(m==4) m<=0;else m<=m+1;end/////秒钟计时模块//////always @(posedge clk_1Hz)if((sec1==8'h59)|turn&(!m))///////若长时间按住该键,还可使秒信号清零,用于精确调时。
简单的数字时钟(verilog设计)
3、计时
if (second0<4'b1001) second0<=second0+4'b1; else second0<=4'b0; if (second1<4'b0101) second1<=second1+4'b1; else second1<=4'b0; if (minute0<4'b1001) minute0<=minute0+4'b1; else minute0<=4'b0; if (minute1<4'b0101) minute1<=minute1+4'b1; else minute1<=4'b0; if (hour1<2'b10) if (hour0<4'b1001) hour0<=hour0+4'b1; else hour0<=4'b0; hour1<=hour1+2'b1; if (hour1==2'b10) if (hour0<4'b0011) hour0<=hour0+4'b1; else hour0<=4'b0; hour1<=2'b0;
谢谢!
2、确认
if (miao==1) nz1<=1;
3、闹铃
if (nz1==1) begin lednz[1]<=1; if((hour_1==hour1)&&(hour_0==hour0)&&(minute_1==minute1)&&(m inute_0==minute0)) lednz[0]<=lednz[0]+1; end
用Verilog语言编写的多功能数字钟
《数字电子技术课程设计》报告专业班级:姓名:学号:设计日期:一.设计题目多功能数字钟电路设计二.设计任务及要求多功能数字钟应该具有的功能有:显示时—分—秒、整点报时、小时和分钟可调等基本功能。
整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,小时的范围为0~23时。
在实验中为了显示的方便,由于分钟和秒钟显示的范围都是从0~59,所以可以用一个3位的二进制码显示十位,用一个四位的二进制码(BCD 码)显示个位,对于小时因为他的范围是从0~23,所以可以用一个2位的二进制码显示十位,用一个4位的二进制码(BCD码)显示个位。
实验中由于七段码管是扫描的方式显示,所以虽然时钟需要的是1Hz 时钟信号,但是扫描需要一个比较高频率的信号,因此为了得到准确的1Hz 信号,必须对输入的系统时钟50Mhz进行分频。
对于整点报时功能,本实验设计的是当进行正点的倒计时5秒时,让LED来闪烁进行整点报时的提示。
调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时;S2调整分钟,每按下一次,分钟增加一分钟。
另外用S8按键作为系统时钟复位,复位后全部显示00—00—00。
管脚分配如下表:三.基于Verilog HDL语言的电路设计、仿真与综合(一)顶层模块本程序采用结构化设计方法,将其分为彼此独立又有一定联系的三个模块,如图1所示:LocationPIN_R16Option Value VCC S1INPUT Location PIN_P14Option Value VCC S2INPUT Location PIN_J3Option Value VCCCPINPUT Location PIN_M4Location PIN_F3Location PIN_F4Option Value SEL[2..0]OUTPUT Location PIN_L14Option Value LEDOUTPUTLocation PIN_N4Location PIN_G4Location PIN_H4Location PIN_L5Location PIN_L4Location PIN_K4Location PIN_K5Option Value LEDAG[6..0]OUTPUTCP CPoutf enpininst1CPoutS1S2RETHour[5..0]Minute[5..0]Second[5..0]LEDkongzhiqi inst2VCCRETINPUT CPout Hour[5..0]Minute[5..0]Second[5..0]SEL[2..0]LEDAG[6..0]xianshi inst图1:顶层结构框图(二)子模块 1.分频器分频器的作用是对50Mhz 的系统时钟信号进行分频,得到频率为1000hz 的信号,作为显示器的输入信号。
多功能数字钟的Verilog描述
●多功能数字钟的Verilog描述●●信号定义:clk:标准时钟信号,本例中,其频率为4Hz;clk_1k:产生闹铃音、报时音的时钟信号,本例中其频率为1024Hz;mode:功能控制信号;为0:计时功能;为1:闹钟功能;为2:手动校时功能;turn:接按键,在手动校时功能时,选择是调整小时,还是分钟;若长时间按住该键,还可使秒信号清零,用于精确调时;change:接按键,手动调整时,每按一次,计数器加1;如果长按,则连续快速加1,用于快速调时和定时;hour,min,sec:此三信号分别输出并显示时、分、秒信号,皆采用BCD 码计数,分别驱动6 个数码管显示时间;alert:输出到扬声器的信号,用于产生闹铃音和报时音;闹铃音为持续20 秒的急促的“嘀嘀嘀”音,若按住“change”键,则可屏蔽该音;整点报时音为“嘀嘀嘀嘀—嘟”四短一长音;LD_alert:接发光二极管,指示是否设置了闹钟功能;LD_hour:接发光二极管,指示当前调整的是小时信号;LD_min:接发光二极管,指示当前调整的是分钟信号。
*/module clock(clk,clk_1k,mode,change,turn,alert,hour,min,sec,LD_alert,LD_hour,LD_min);input clk,clk_1k,mode,change,turn;output alert,LD_alert,LD_hour,LD_min;output[7:0] hour,min,sec;reg[7:0] hour,min,sec,hour1,min1,sec1,ahour,amin;reg[1:0] m,fm,num1,num2,num3,num4;reg[1:0] loop1,loop2,loop3,loop4,sound;王金明:《Verilog HDL 程序设计教程》- 65 -reg LD_hour,LD_min;reg clk_1Hz,clk_2Hz,minclk,hclk;reg alert1,alert2,ear;reg count1,count2,counta,countb;wire ct1,ct2,cta,ctb,m_clk,h_clk;always @(posedge clk)beginclk_2Hz<=~clk_2Hz;if(sound==3) begin sound<=0; ear<=1; end//ear 信号用于产生或屏蔽声音else begin sound<=sound+1; ear<=0; endendalways @(posedge clk_2Hz) //由4Hz 的输入时钟产生1Hz 的时基信号clk_1Hz<=~clk_1Hz;always @(posedge mode) //mode 信号控制系统在三种功能间转换begin if(m==2) m<=0; else m<=m+1; endalways @(posedge turn)fm<=~fm;always //该进程产生count1,count2,counta,countb 四个信号begincase(m)2: begin if(fm)begin count1<=change; {LD_min,LD_hour}<=2; endelsebegin counta<=change; {LD_min,LD_hour}<=1; end{count2,countb}<=0;end1: begin if(fm)begin count2<=change; {LD_min,LD_hour}<=2; endelsebegin countb<=change; {LD_min,LD_hour}<=1; end{count1,counta}<=2'b00;enddefault: {count1,count2,counta,countb,LD_min,LD_hour}<=0; endcaseend程序文本- 66 -always @(negedge clk)//如果长时间按下“change”键,则生成“num1”信号用于连续快速加1 if(count2) beginif(loop1==3) num1<=1;elsebegin loop1<=loop1+1; num1<=0; endendelse begin loop1<=0; num1<=0; endalways @(negedge clk) //产生num2 信号if(countb) beginif(loop2==3) num2<=1;elsebegin loop2<=loop2+1; num2<=0; endendelse begin loop2<=0; num2<=0; endalways @(negedge clk)if(count1) beginif(loop3==3) num3<=1;elsebegin loop3<=loop3+1; num3<=0; endendelse begin loop3<=0; num3<=0; endalways @(negedge clk)if(counta) beginif(loop4==3) num4<=1;elsebegin loop4<=loop4+1; num4<=0; endendelse begin loop4<=0; num4<=0; endassign ct1=(num3&clk)|(!num3&m_clk); //ct1 用于计时、校时中的分钟计数assign ct2=(num1&clk)|(!num1&count2); //ct2 用于定时状态下调整分钟信号assign cta=(num4&clk)|(!num4&h_clk); //cta 用于计时、校时中的小时计数assign ctb=(num2&clk)|(!num2&countb); //ctb 用于定时状态下调整小时信号always @(posedge clk_1Hz) //秒计时和秒调整进程if(!(sec1^8'h59)|turn&(!m))beginsec1<=0; if(!(turn&(!m))) minclk<=1;王金明:《Verilog HDL 程序设计教程》- 67 -end//按住“turn”按键一段时间,秒信号可清零,该功能用于手动精确调时else beginif(sec1[3:0]==4'b1001)begin sec1[3:0]<=4'b0000; sec1[7:4]<=sec1[7:4]+1; endelse sec1[3:0]<=sec1[3:0]+1; minclk<=0;endassign m_clk=minclk||count1;always @(posedge ct1) //分计时和分调整进程beginif(min1==8'h59) begin min1<=0; hclk<=1; endelse beginif(min1[3:0]==9)begin min1[3:0]<=0; min1[7:4]<=min1[7:4]+1; endelse min1[3:0]<=min1[3:0]+1; hclk<=0;endendassign h_clk=hclk||counta;always @(posedge cta) //小时计时和小时调整进程if(hour1==8'h23) hour1<=0;else if(hour1[3:0]==9)begin hour1[7:4]<=hour1[7:4]+1; hour1[3:0]<=0; endelse hour1[3:0]<=hour1[3:0]+1;always @(posedge ct2) //闹钟定时功能中的分钟调节进程if(amin==8'h59) amin<=0;else if(amin[3:0]==9)begin amin[3:0]<=0; amin[7:4]<=amin[7:4]+1; endelse amin[3:0]<=amin[3:0]+1;always @(posedge ctb) //闹钟定时功能中的小时调节进程if(ahour==8'h23) ahour<=0;else if(ahour[3:0]==9)begin ahour[3:0]<=0; ahour[7:4]<=ahour[7:4]+1; endelse ahour[3:0]<=ahour[3:0]+1;always //闹铃功能if((min1==amin)&&(hour1==ahour)&&(amin|ahour)&&(!change))程序文本- 68 -//若按住“change”键不放,可屏蔽闹铃音if(sec1<8'h20) alert1<=1; //控制闹铃的时间长短else alert1<=0;else alert1<=0;always //时、分、秒的显示控制case(m)3'b00: begin hour<=hour1; min<=min1; sec<=sec1; end//计时状态下的时、分、秒显示3'b01: begin hour<=ahour; min<=amin; sec<=8'hzz; end//定时状态下的时、分、秒显示3'b10: begin hour<=hour1; min<=min1; sec<=8'hzz; end//校时状态下的时、分、秒显示endcaseassign LD_alert=(ahour|amin)?1:0; //指示是否进行了闹铃定时assign alert=((alert1)?clk_1k&clk:0)|alert2; //产生闹铃音或整点报时音always //产生整点报时信号alert2beginif((min1==8'h59)&&(sec1>8'h54)||(!(min1|sec1)))if(sec1>8'h54) alert2<=ear&clk_1k; //产生短音else alert2<=!ear&clk_1k; //产生长音else alert2<=0;endendmodule多功能数字钟的VHDL描述library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity clock isport (clk,clr,a,c,e,f,g:in std_logic;led_sel:out std_logic_vector( 2 downto 0);led:out std_logic_vector( 0 to 6);p:in std_logic_vector( 3 downto 0);b:in std_logic_vector(1 downto 0);d:out std_logic );end entity clock;architecture bhv of clock issignal m: integer range 0 to 999;signal hou1,hou0,min1,min0,sec1,sec0,s2: std_logic_vector(3 downto 0);signal rhou1,rhou0,rmin1,rmin0,rsec1,rsec0: std_logic_vector(3 downto 0);signal s1: std_logic_vector(2 downto 0);signal clk1,clk2,d1,d2:std_logic;signal n : integer range 0 to 1;beginp1:process(clk) --二分频beginif (rising_edge(clk)) thenif n=1 then n<=0;clk2<='1';else n<=n+1; clk2<='0';end if;end if ;end process;p2:process(clk)beginif (rising_edge(clk)) thenif m=999 then m<=0;clk1<='1';else m<=m+1; clk1<='0';end if;end if ;end process P2;p3: process(clk1,clr) ---时间设置beginif (clr='1') then sec0<="0000";sec1<="0000";min0<="0000";min1<="0000";hou0<="0000";hou1<="0000";elsif rising_edge(clk1) thenif a='1' then --校时if b="00" then hou1<=p;elsif b="01" then hou0<=p;elsif b="10" then min1<=p;elsif b="11" then min0<=p;end if;end if;if sec0>="1001" thensec0<="0000";if sec1>="0101" thensec1<="0000";if min0>="1001" thenmin0<="0000";if min1>="0101" thenmin1<="0000";if g='0'thenif hou1<"0010" thenif hou0="1001" then hou0<="0000";hou1<=hou1+1 ;else hou0<=hou0+1;end if;elsif hou1="0010" and hou0="0011" thenhou1<="0000";hou0<="0000";else hou0<=hou0+1;end if ;end if;if g='1'thenif hou1<"0001" thenif hou0="1001" then hou0<="0000";hou1<=hou1+1 ;else hou0<=hou0+1;end if;elsif hou1="0001" and hou0="0001" thenhou1<="0000";hou0<="0000";else hou0<=hou0+1;end if ;end if;else min1<=min1+1;end if;else min0<=min0+1;end if;else sec1<=sec1+1;else sec0<=sec0+1;end if;end if ;end process P3;p4:process(clk) --数码管选通beginif(rising_edge (clk)) thenif s1="111" thens1<="000";else s1<=s1+1;end if;end if;-- led_sel<=s1;end process;p5:process(s1,f) ---闹铃显示beginif f='0'thencase s1 iswhen "000"=>s2<=sec0;led_sel<="000";when "001"=>s2<=sec1;led_sel<="001";when "010"=>s2<=min0;led_sel<="010";when "011"=>s2<=min1;led_sel<="011";when "100"=>s2<=hou0;led_sel<="100";when "101"=>s2<=hou1;led_sel<="101";when others=>null;end case;elsif f='1' thencase s1 iswhen "010"=>s2<=rmin0;led_sel<="010";when "011"=>s2<=rmin1;led_sel<="011";when "100"=>s2<=rhou0;led_sel<="100";when "101"=>s2<=rhou1;led_sel<="101";when others=>null;end case;end if;end process;p6:process(s2) --七段译码器beginif(s1<6) thenwhen "0000"=>led<="0111111";when "0001"=>led<="0000110";when "0010"=>led<="1011011";when "0011"=>led<="1001111";when "0100"=>led<="1100110";when "0101"=>led<="1101101";when "0110"=>led<="1111101";when "0111"=>led<="0000111";when "1000"=>led<="1111111";when "1001"=>led<="1101111";when others=>null;end case ;else led<="0000000";end if;end process;p7:process(clk1,c) --整点报时beginif (rising_edge(clk))thenif c='1' thenif (min1="0101" and min0="1001" and sec1="0101") thenif(sec0="0000"or sec0="0010" or sec0="0100" or sec0="0110" or sec0="1000")thend1<='1'and clk2;else d1<='0';end if;elsif (min1="0000" and min0="0000" and sec0="0000" and sec1="0000") thend1<='1';else d1<='0';end if ;end if ;end if ;end process;p8:process(clk,e) ---闹铃设置beginif (rising_edge(clk))thenif e='1' thenif b="000"then rhou1<=p;elsif b="001"then rhou0<=p;elsif b="010"then rmin1<=p;elsif b="011"then rmin0<=p;end if;end if;end if;end process;p9:process(clk) ---闹铃比较beginif(rising_edge(clk))thenif e='1'thenif(rhou1=hou1 and rhou0=hou0 and rmin1=min1 and rmin0=min0)thenif(sec0="0001"or sec0="0010" or sec0="0011" or sec0="0011" or sec0="0100" )then d2<='1'and clk2;else d2<='0';end if;else d2<='0';end if;end if;end if;end process;d<=d1 or d2;end architecture bhv;。
verilog电子钟实验报告
深圳大学实验报告课程名称:硬件描述语言与逻辑综合实验项目名称:电子时钟Verilog HDL的设计与仿真学院:电子科学与技术学院专业:微电子科学与工程指导教师:一、实验目的1、掌握Quartus ii 软件的使用方法以及各种语句使用方法;2、学习如何运用verilog HDL 设计简单的数字电路3、掌握基本时序逻辑仿真的实现,以及上机运行的操作;4、掌握Verilog HDL 中模块运用的思想,为以后的实践打下基础。
二、实验原理数字时钟模块组织结构如图所示:数码管显示模块计时模块分频模块Clk 实验原理图如上图所示。
所谓的时钟,其实本质上就是计数器。
以开发板上的晶振时钟27MHZ 作为时间基准。
然后通过分频模块(计数器)进行分频,得到1Hz 的脉冲信号作为1秒的信号脉冲,然后用模60的计数器构成秒的计数单元。
每记60下就自动清零且产生进位信号。
将这个进位信号作为分的计数器的使能信号,其中,分计数器也是模为60的计数器。
这里的计数器都是由模10和模6组成的BCD码的计数器。
个位和十位分别是一个四位的数字。
同理,每记满60,分计数器就会产生一个进位信号,这个进位信号作为小时的使能信号。
小时的计数器就是模24的BCD计数器。
注意,这里的整个电路都是用1HZ的频率作为时间脉冲的,也就是说,这个电路是同步时序的电路。
通过使能,来控制各个部分的时序逻辑。
当在调时状态的时候,时钟每完成一个周期,无论是分钟还是小时,就向前加1。
最后,将分钟和小时通过译码器连接到数码管。
将秒直接连接到LED灯,完成整个工程的基本功能。
每个计数器要配两个译码器模块,以保证数值能正确的显示到DE2板上。
三、实验过程(附源代码)本实验需要用到四个模块,分别是27MHz的分频器模块,模为60的加法计数器模块,模为24的加法计数器模块以及七段数码管的译码器模块。
由四个模块和主函数构成整个源程序。
源程序所有代码如下:Moduleclock(reset,stop,clk,load_sec,load_min,load_hour,data,de_sec1,de_sec2,de_min1,de_min2,de_hour1,de_hour2);output[6:0]de_sec1,de_sec2,de_min1,de_min2,de_hour1,de_hour2;input reset,clk,load_sec,load_min,load_hour,stop;input[7:0]data;wire[7:0]sec,min,hour;wire one_second,sec_min,min_hour;//定义变量和数据类型等divider FP(one_second,stop,clk);//27MHZ分频成1HZ//计时部分count60miao(sec,sec_min,data,load_sec,1,reset,one_second);count60fen(min,min_hour,data,load_min,sec_min,reset,one_second);count24shi(hour,data,load_hour,min_hour,reset,one_second);//七位数码管显示部分decode4_7sec_1(de_sec1,sec[3:0]);decode4_7sec_2(de_sec2,sec[7:4]);decode4_7min_1(de_min1,min[3:0]);decode4_7min_2(de_min2,min[7:4]);decode4_7hour_1(de_hour1,hour[3:0]);decode4_7hour_2(de_hour2,hour[7:4]);endmodule//divider代码,分频器模块module divider(one_second,reset,clk);output one_second;input reset,clk;reg one_second;reg[23:0]cnt;always@(posedge clk)beginif(reset)begincnt<=0;one_second<=0;endelse if(cnt===13499999)begincnt<=0;one_second<=~one_second;endelsecnt<=cnt+1;endendmodule//代码结束//count60代码,秒、分计数模块module count60(qout,cout,data,load,cin,reset,clk); output[7:0]qout;output cout;input[7:0]data;input load,cin,clk,reset;reg[7:0]qout;always@(posedge clk)//clk上升沿时刻计数beginif(reset)qout<=0;//同步复位else if(load)qout<=data;//同步置数else if(cin)beginif(qout[3:0]==9)//低位是否为9,如果是则beginqout[3:0]<=0;//回0,并判断高位是否为5if(qout[7:4]==5)qout[7:4]<=0;elseqout[7:4]<=qout[7:4]+1;//高位不为5,则加1 endelse//低位不为9,则加1qout[3:0]<=qout[3:0]+1;endendassign cout=((qout==8'h59)&cin)?1:0;//产生进位输出信号endmodule//代码结束//count24代码,时计数模块module count24(qout,data,load,cin,reset,clk);output[7:0]qout;input[7:0]data;input load,cin,clk,reset;reg[7:0]qout;always@(posedge clk)//clk上升沿时刻计数beginif(reset)qout<=0;//同步复位else if(load)qout<=data;//同步置数else if(cin)beginif(qout[7:4]==2)beginif(qout[3:0]==3)qout<=0;elseqout[3:0]<=qout[3:0]+1;endelsebeginif(qout[3:0]==9)//低位是否为9,是则beginqout[3:0]<=0;//回0qout[7:4]<=qout[7:4]+1;//高位不为5,则加1endelse//低位不为9,则加1qout[3:0]<=qout[3:0]+1;endendendendmodule//结//decode4_7代码开始,七位数码管显示模块module decode4_7(decodeout,indec);output[6:0]decodeout;input[3:0]indec;reg[6:0]decodeout;always@(indec)begincase(indec)//用case语句进行译码,共阴4'd0:decodeout=7'b1000000;4'd1:decodeout=7'b1111001;4'd2:decodeout=7'b0100100;4'd3:decodeout=7'b0110000;4'd4:decodeout=7'b0011001;4'd5:decodeout=7'b0010010;4'd6:decodeout=7'b0000010;4'd7:decodeout=7'b1111000;4'd8:decodeout=7'b0000000;4'd9:decodeout=7'b0010000;default:decodeout=7'bz;endcaseendendmodule//结束四、时序仿真结果1、分频器时序仿真源代码:module divider(one_second,reset,clk);output one_second;input reset,clk;reg one_second;reg[23:0]cnt;always@(posedge clk)beginif(reset)begincnt<=0;one_second<=0;endelse if(cnt===5)//13499999改成5,为了使波形能够在时序仿真中顺利出现begincnt<=0;one_second<=~one_second;endelsecnt<=cnt+1;endendmodule2、模为60的加法计数器模块仿真源程序:module count60(qout,cout,data,load,cin,reset,clk);output[7:0]qout;output cout;input[7:0]data;input load,cin,clk,reset;reg[7:0]qout;always@(posedge clk)//clk上升沿时刻计数beginif(reset)qout<=0;//同步复位else if(load)qout<=data;//同步置数else if(cin)beginif(qout[3:0]==9)//低位是否为9,是则beginqout[3:0]<=0;//回0,并判断高位是否为5if(qout[7:4]==5)qout[7:4]<=0;elseqout[7:4]<=qout[7:4]+1;//高位不为5,则加1endelse//低位不为9,则加1qout[3:0]<=qout[3:0]+1;endendassign cout=((qout==8'h59)&cin)?1:0;//产生进位输出信号endmodule3、模为24的加法计数器模块仿真源程序:module count24(qout,data,load,cin,reset,clk);output[7:0]qout;input[7:0]data;input load,cin,clk,reset;reg[7:0]qout;always@(posedge clk)//clk上升沿时刻计数beginif(reset)qout<=0;//同步复位else if(load)qout<=data;//同步置数else if(cin)beginif(qout[7:4]==2)beginif(qout[3:0]==3)qout<=0;elseqout[3:0]<=qout[3:0]+1;endelsebeginif(qout[3:0]==9)//低位是否为9,是则beginqout[3:0]<=0;//回0qout[7:4]<=qout[7:4]+1;//高位不为5,则加1endelse//低位不为9,则加1qout[3:0]<=qout[3:0]+1;endendendendmodule4、七段数码管译码器模块源程序:module decode4_7(decodeout,indec);output[6:0]decodeout;input[3:0]indec;reg[6:0]decodeout;always@(indec)begincase(indec)//用case语句进行译码4'd0:decodeout=7'b1000000;4'd1:decodeout=7'b1111001;4'd2:decodeout=7'b0100100;4'd3:decodeout=7'b0110000;4'd4:decodeout=7'b0011001;4'd5:decodeout=7'b0010010;4'd6:decodeout=7'b0000010;4'd7:decodeout=7'b1111000;4'd8:decodeout=7'b0000000;4'd9:decodeout=7'b0010000;default:decodeout=7'bz;endcaseendendmodule五、上机测试结果程序烧录到DE2板上后,由13个拨码开关控制整个程序的进行,SW17是置0功能,SW13是暂停功能,SW14到SW16则分别是三个计数器模块的置数开关,置数数据由SW0到SW7输入。