数字闹钟的FPGA实现(Verilog)

合集下载

数字时钟的Verilog代码

数字时钟的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实现

多功能数字钟FPGA实现

实验报告:多功能数字钟081180008 陈家伟一、设计任务本实验使用verilog HDL语言在FPGA平台上实现了一个简单的多功能数字钟,它主要包含一下几个主要功能:(1)实现基本计时功能,并以24小时显示。

(2)实现校时功能。

(3)实现闹钟功能:设定闹钟时间,采用蜂鸣器提示,并且实现了自动关闭。

(4)实现跑表功能:具有启动、停止、继续、复位功能。

在本实验中,最大的问题便是多个功能并行时的干扰问题,需要在设计时对功能切换过程可能产生的干扰充分把握,实现多个功能的并存。

二、输入输出界面的设计在实验中,输入输出界面需要首先考虑,以保证整个系统设计的统一性。

在输入界面的设计上,由于按键资源的限制,必须考虑各个功能键的复用;在输出界面的设计上,由于显示资源的限制,必须考虑数码管显示界面的复用。

输入界面设计如下:(1)KEY1(PIN_122)为模式切换键。

整个系统具有4种功能模式:计时(mode0)、校时(mode1)、闹钟(mode2)、跑表(mode3)。

由KEY1负责模式的切换。

(2)KEY2(PIN_121)为复用键。

mode0(计时)下,KEY2键不起作用;mode1(校时)下,KEY2键使时间增加;mode2(闹钟)下,KEY2键使闹钟设置对应位增加;mode3(跑表)下,KEY2键控制跑表的开始、暂停、继续。

(3)KEY3(PIN_123)为复用键。

mode0(计时)下,KEY3键不起作用;mode1(校时)下,KEY3键负责时位、分位的切换;mode2(闹钟)下,KEY3键负责闹钟设置时位、分位的切换;mode3(跑表)下,KEY3控制跑表的复位。

输入界面设计时主要考虑的是尽量将不同模式下相近的功能归并到同一个按键上来,一方面方便用户的操作,另一方面也使得设计简洁明了,减少的错误的出现。

输出界面(四位数码管显示器)设计如下:(1)mode0(计时)下,四位数码管显示的是24小时计时:左边两个数码管显示小时;右边两个数码管显示分钟;最右边数码管的dp以闪动显示秒。

简单的数字时钟(verilog设计)

简单的数字时钟(verilog设计)
Verilog作为一种硬件描述语言,可用于设计和实现数字系统,包括数字时钟。 通过Verilog设计数字时钟,可以加深对数字系统和Verilog语言的理解,并提高 设计能力。
设计目标与要求
设计一个简单的数字 时钟,能够显示时、 分、秒。
时钟应具有可靠性、 稳定性和可扩展性。
要求使用Verilog语 言实现,并能够在 FPGA或ASIC上实现。
设计思路及流程
• 设计思路:采用模块化设计方法,将数字时钟划分为不同的模 块,如计数器模块、显示模块等。每个模块负责实现特定的功 能,并通过接口与其他模块进行通信。
设计思路及流程
设计流程 1. 确定设计需求和目标。 2. 制定设计方案和计划。
设计思路及流程
3. 编写Verilog代码,实现各个模块的功能。 5. 根据测试结果进行调试和优化。
未来改进方向探讨
提高计时精度
通过改进算法或采用更高 性能的硬件平台,提高数
字时钟的计时精度。
降低资源占用
优化代码结构,减少不 必要的资源占用,提高 时钟系统的运行效率。
增加实用功能
拓展应用领域
考虑增加闹钟、定时器 等实用功能,使数字时 钟更加符合用户需求。
探索将数字时钟应用于 更多领域,如智能家居、
数据类型与运算符
Verilog中的数据类型包括
整型、实型、时间型、数组、结构体等。
Verilog中的运算符包括
算术运算符、关系运算符、逻辑运算符、位运算符等。
顺序语句与并行语句
Verilog中的顺序语句包括
赋值语句、条件语句、循环语句等,用于描述电路的时序行为。
Verilog中的并行语句包括
模块实例化、连续赋值语句、门级电路描述等,用于描述电路的并行行为。

fpga数字钟实验流程

fpga数字钟实验流程

fpga数字钟实验流程FPGA(可编程逻辑门阵列)数字钟是一种基于可编程逻辑器件的数字时钟实验,通过编程和硬件设计的方式,实现数字时钟的功能。

本文将详细介绍FPGA数字钟实验的流程。

第一部分:实验准备1.硬件准备:需要准备一块FPGA开发板、显示器、键盘等硬件设备,以及一些连接线。

2.软件准备:需要安装好FPGA开发软件,例如Xilinx ISE,以及相应的驱动程序。

第二部分:FPGA数字钟的原理和设计1.了解数字时钟的结构和工作原理,数字时钟一般由时钟控制模块、时钟显示模块和按键控制模块组成。

2.设计时钟控制模块,该模块用来控制时钟的频率和计时功能。

3.设计时钟显示模块,该模块用来将时钟的计时结果以数字的形式显示在显示器上。

4.设计按键控制模块,该模块用来实现时钟的设置功能,包括设置时间和闹钟等。

第三部分:FPGA数字钟的硬件连接1.将FPGA开发板和显示器通过连接线连接起来,确保能够正常显示。

2.将FPGA开发板和键盘通过连接线连接起来,确保能够正常接收按键信号。

第四部分:FPGA数字钟的编程实现1.打开FPGA开发软件,创建一个新工程,并选择合适的FPGA芯片型号。

2.导入所需的模块和外设驱动程序,并将其进行连接。

3.配置FPGA芯片的引脚分配,将各个模块和硬件设备连接起来。

4.编写FPGA数字钟的软件代码,包括时钟控制模块、时钟显示模块和按键控制模块的代码。

5.进行编译和综合,生成对应的比特流文件。

6.将比特流文件下载到FPGA芯片中,实现数字时钟的功能。

第五部分:实验调试和功能测试1.将FPGA开发板连接到电源上,确保供电正常。

2.通过按键进行时间设置,并观察显示器上的时钟显示是否正确。

3.调整时钟频率,观察显示器上的时钟走动是否正常。

4.测试其他功能,例如闹钟功能、定时功能等。

第六部分:实验总结与展望1.对实验结果进行总结,分析实验中遇到的问题和解决方法。

2.展望数字时钟的进一步应用,例如可以加入温湿度传感器,实现天气预报功能等。

简单的数字时钟(verilog设计)

简单的数字时钟(verilog设计)

else begin if(ss1==1) begin if (hour_1<2'b10) begin if(hour_0<4'b1001) hour_0<=hour_0+4'b1; else begin hour_0<=4'b0; hour_1<=hour_1+2'b1;end end if(hour_1==2'b10) begin if (hour_0<4'b0011) hour_0<=hour_0+4'b1; else begin hour_0<=4'b0; hour_1<=2'b0; end end end if(ss2==1) begin if (hour_1>2'b0) begin if (hour_0>4'b0) hour_0<=hour_0-4'b1; else begin hour_0<=4'b1001; hour_1<=hour_1-2'b1;end end if (hour_1==2'b00) begin if (hour_0>4'b0) hour_0<=hour_0-4'b1; else begin hour_1<=4'b0010; hour_0<=4'b0011;end end end
三、闹钟部分
1、设置闹铃
if (sh==1) begin if (ss1==1) begin if (minute_0<4'b1001) minute_0<=minute_0+4'b1; else begin minute_0<=4'b0; if(minute_1<4'b0101) minute_1<=minute_1+4'b1; else minute_1<=4'b0; end end if (ss2==1) begin if (minute_0>4'b0000) minute_0<=minute_0-4'b1; else begin minute_0<=4'b1001; if (minute_1>4'b0000) minute_1<=minute_1-4'b1; else minute_1<=4'b0101;end end end

基于FPGA的多功能数字钟设计实现

基于FPGA的多功能数字钟设计实现

电子技术课程设计设计报告题目:基于FPGA的多功能数字钟设计实现班级:姓名:学号:指导教师:上交日期:2017.5.21摘要本设计为基于FPGA的多功能数字钟设计实现,具有计时、校对、闹钟、报整点等基础功能,以及日期、秒表、电子琴、延时闹钟、音乐闹钟等拓展功能。

本设计采用EDA技术,以硬件描述语言Verilog HDL为系统逻辑描述语言设计文件,在QUARTUSII工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟。

系统采用Alera DE0开发板,并外接了蜂鸣器电路。

系统由分频模块、计时模块、闹钟模块、控制模块、显示模块、秒表模块、音乐模块、日期模块、电子琴模块组成。

经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统能够完成需求功能。

关键词:数字时钟,硬件描述语言,Verilog HDL,FPGA目录摘要 (2)目录 (3)1 绪论 (5)1.1背景 (5)1.2项目创意 (7)2需求分析 (8)2.1任务目标 (8)2.2元件清单 (8)2.3小组分工 (9)3系统设计 (9)3.1 系统主板电路分析 (9)3.2模块化设计方案 (16)4 模块电路设计 (17)4.1顶层模块 (17)4.2分频模块 (19)4.2.1 分频模块设计 (19)4.2.2 分频模块仿真 (21)4.3 计时模块 (21)4.3.1 计时模块设计 (21)4.3.2 计时模块仿真 (23)4.4 控制模块 (24)4.4.1 控制模块设计 (24)4.4.2 控制模块仿真 (24)4.5 秒表模块 (24)4.5.1 秒表模块设计 (24)4.6 日期模块 (26)4.6.1 日期模块设计 (26)4.7 电子琴模块 (28)4.7.1 电子琴模块设计 (28)5 系统调试及结果分析 (30)5.1 硬件检查 (30)5.2 软件编译 (30)5.3 调试过程及结果 (31)5.4 调试注意事项 (32)6 总结 (33)6.1课设中出现的问题与解决方案 (33)6.2心得体会 (33)1 绪论1.1 背景现代的社会是一个信息产品广泛使用,产品的性能越来越强大,做工越来越精细,工艺越来越高,更新换代越来越迅速的社会。

fpga自动打铃器课程设计

fpga自动打铃器课程设计

fpga自动打铃器课程设计一、课程目标知识目标:1. 学生理解FPGA的基本原理和功能,掌握FPGA在数字系统设计中的应用。

2. 学生掌握Verilog HDL硬件描述语言的基本语法和编程技巧,能够编写简单的数字电路模块。

3. 学生掌握自动打铃器系统的设计原理,能够利用FPGA实现一个具有定时功能的自动打铃器。

技能目标:1. 学生能够运用所学知识,进行FPGA开发环境搭建,并完成基本的程序编写与烧录。

2. 学生能够运用Verilog HDL语言设计简单的数字电路,具备一定的硬件编程能力。

3. 学生通过实际操作,提高动手能力,培养解决实际问题的能力。

情感态度价值观目标:1. 学生通过课程学习,培养对电子信息技术领域的兴趣和热情,激发创新意识。

2. 学生在团队协作中,学会沟通与交流,培养合作精神,增强团队意识。

3. 学生在学习过程中,养成严谨、求实的科学态度,提高自主学习能力。

课程性质:本课程为电子信息类课程的实践环节,结合理论知识与实际操作,培养学生运用FPGA技术解决实际问题的能力。

学生特点:学生具备一定的数字电路基础,对硬件编程有一定了解,但实际操作能力有待提高。

教学要求:结合学生特点,注重理论与实践相结合,通过项目驱动的教学方法,引导学生主动参与,提高学生的实际操作能力。

在教学过程中,注重分层教学,关注个体差异,使每位学生都能在原有基础上得到提高。

同时,关注学生的情感态度价值观的培养,全面提高学生的综合素质。

二、教学内容1. 数字电路基础回顾:逻辑门电路、组合逻辑电路及时序逻辑电路的基本原理和设计方法。

2. FPGA基本原理:FPGA的结构、工作原理,以及FPGA在现代数字系统中的应用。

3. Verilog HDL语言:Verilog HDL的基本语法、数据类型、运算符、模块结构,以及常用语句的使用方法。

4. 自动打铃器系统设计:a. 系统需求分析:明确自动打铃器的基本功能,如定时打铃、铃声时长设定等。

verilog数字钟设计(FPGA)全新

verilog数字钟设计(FPGA)全新

一、课程设计目标1. 熟悉并掌握verilog 硬件描述语言2. 熟悉quartus 软件开发环境3.学会设计大中规模的数字电路,并领会其中的设计思想二、课程设计实现的功能(1)设计一个数码管实时显示时、分、秒的数字时钟(24小时显示模式);(2)可以调节小时,分钟。

(3)能够进行24小时和12小时的显示切换。

(4)可以设置任意时刻闹钟,并且有开关闹钟功能。

(5)有整点报时功能,几点钟LED灯闪亮几下。

(6)有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。

三、设计原理:1、总原理框图:附全部代码:总模块:moduleclock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signa l,nao_signal);input clk;//50MHzinput reset,MODE,Alarm_ctr,BT2,H12_24;//复位键,模式选择按钮,闹钟开关档,调节按钮,12—24小时切换档output [7:0]DMH,DML,DHH,DHL; //4个数码管显示输入信号output dian,bao_signal,nao_signal; //时分间隔点,报时信号,闹钟信号output [3:0]DSH,DSL; //秒钟输出信号wire [3:0] SH,SL,MH,ML,HH,HL;wire [3:0] LED_mode;wire [3:0] HH12,HL12,HH24,HL24,MH24,ML24,SH24,SL24;wire [3:0] set_HH,set_HL,set_MH,set_ML;wire _1HZ,_10ms,_250ms,_500ms;wire Keydone1;wire Keydone2;wire co1,co11,co111,co2,co22,co222,set_co2;wire [3:0]mode_flag;assign dian=1'b0;devide_f u1(_1HZ,_10ms,_250ms,_500ms,reset,clk); //分频,得到4种不同频率的时钟信号key_press u2(_10ms,MODE,Keydone1); //模式档按钮去抖动key_press u20(_10ms,BT2,Keydone2); //调节按钮去除抖动mode u3(Keydone1,mode_flag); //通过模式按钮产生不同模式second u4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1); //秒计时minute u5(co11,reset,MH24,ML24,co2); //分计时hour u6(co22,reset,HH24,HL24); //小时计时SEG7_LUT u7(DML,ML); //4个数码管显示SEG7_LUT u8(DMH,MH);SEG7_LUT u9(DHL,HL);SEG7_LUT u10(DHH,HH);display_LED u11(DSL,SL); //LED灯显示秒或模式灯display_LED u12(DSH,SH);mode_choose u13(mode_flag,Keydone2,_250ms,co1,co2,set_co2,co11,co22,co111,co222); //选择模式进行不同操作hour12_24 u14(HH24,HL24,HH12,HL12); //12--24小时切换boshi u15(HH,HL,MH,ML,SH,SL,_1HZ,bao_signal); //整点报时set_naozhong u16(co111,co222,set_HH,set_HL,set_MH,set_ML,set_co2); //设置闹钟时间Naozhongu17(Alarm_ctr,_500ms,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal);//任意闹钟响应LUT_modeu18(mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_ML, MH,ML,HH,HL);//通过模式选择数码管显示LED_mode u19(mode_flag,SH24,SL24,SH,SL); 模式选择LED灯显示Endmodule分频模块:分频模块的作用主要是要获得各种频率的时钟信号。

fpga数字钟实验总结

fpga数字钟实验总结

fpga数字钟实验总结
FPGA数字钟实验总结:
本次FPGA数字钟实验旨在设计并实现一个基于FPGA的数字时钟。

通过该实验,我掌握了以下几个方面的知识和技能。

首先,我学会了使用FPGA开发工具进行电路设计和编程。

我使用了一种特定的硬件描述语言(HDL),如Verilog或VHDL,来描述时钟电路的功能和行为。

通过学习和实践,我能够熟练地使用FPGA开发工具创建和编辑代码。

其次,我了解了数字时钟的基本原理和组成部分。

数字时钟通常由时钟芯片、计数器、显示器和控制电路组成。

我学会了如何使用FPGA来实现这些功能,并通过编程控制时钟的显示方式和计时功能。

在实验过程中,我还学会了时序设计和逻辑电路的基本概念。

由于时钟电路需要精确的时序控制,我学会了如何设计和优化时钟电路的时序路径,以确保电路的正常运行和准确计时。

此外,我还学会了如何使用开发板上的按钮和开关等外部输入
设备来控制时钟的设置和调整功能。

通过编程,我能够实现时钟的
时间调整、闹钟设置等功能,并通过显示器将相应的信息展示出来。

最后,在实验过程中,我也遇到了一些挑战和问题。

例如,时
钟的精确性和稳定性是一个重要的考虑因素,我需要注意时钟信号
的抖动和噪声问题。

此外,时钟的显示方式和格式也需要根据实际
需求进行设计和调整。

通过本次FPGA数字钟实验,我不仅巩固了对数字电路和FPGA
开发的理论知识,还提高了实际操作和问题解决能力。

这个实验为
我今后在数字电路设计和嵌入式系统开发方面的学习和工作奠定了
坚实的基础。

fpga闹钟工作原理

fpga闹钟工作原理

FPGA(Field-Programmable Gate Array,现场可编程门阵列)闹钟是一种基于FPGA芯片设计和实现的数字时钟设备。

下面是FPGA闹钟的工作原理:
1.时钟信号输入:FPGA闹钟通常会接收一个外部的时钟信号作为参考,比如晶体振荡器
产生的脉冲信号。

2.时钟分频:利用FPGA内部的时钟分频电路,将外部时钟信号分频为更低频率的时钟信
号。

例如,将1秒的脉冲信号分频为每秒钟一个时钟周期。

3.时间计数器:FPGA闹钟内部有一个时间计数器,根据分频后的时钟信号递增来记录当
前的时间。

计数器可以具体设置为年、月、日、时、分、秒等各个时间单位的计数值。

4.按键输入检测:FPGA闹钟可能还包含按键输入检测电路,用于检测用户操作的按键输
入,比如调整时间、设置闹钟、关闭闹钟等。

5.显示与输出控制:FPGA闹钟通常配备显示模块,如数码管或液晶显示屏,用于显示当
前的时间。

根据时间计数器的值,将相应的数字或字符输出到显示模块上。

6.闹钟功能:FPGA闹钟还可以具备闹钟功能,通过用户设置的时间和闹钟触发条件,当
计数器达到设定的闹钟时间时,触发闹钟功能,如蜂鸣器发出提示音或显示闹钟图标。

7.其他功能:FPGA闹钟还可以具备其他附加功能,如温度显示、日历功能、定时器功能
等,这些功能可以根据具体需求进行设计和实现。

通过FPGA芯片的灵活性和可编程性,闹钟的功能和特性可以由设计者根据需要进行自定义和扩展。

因此,FPGA闹钟具有较高的定制性和可扩展性,适用于各种不同的应用场景。

Verilog数字钟设计

Verilog数字钟设计

hclk<=0;
end
end
////////小时计时模块///
assign h_clk=hclk||counta;//////h_clk 产生进位或校正改变
assign cta=(num4&clk)|(!num4&h_clk); //cta 用于计时、校时中的小时计数
always @(posedge cta)
Hale Waihona Puke 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; end
else ahour[3:0]<=ahour[3:0]+1;
endmodule
else
begin counta<=change; {LD_min,LD_hour}<=1; end/////指示当前调整的是小时
always @(posedge clk_2) if ( cnt5 < 10/2-1) /////////////////////////////////////////10 分频,生成 1kHz 标准信号 begin cnt5<= cnt5 + 1; end
else begin cnt5<= 0; clk_1k<= ~clk_1k; end
代码如下:
//fenpin module fenpin(clk,clk_1Hz,clk_100Hz,clk_1k); output clk_1Hz,clk_100Hz,clk_1k; input clk; reg clk_1Hz=0,clk_3=0,clk_1=0,clk_2=0,clk_1k=0; reg [6:0] cnt1=0,cnt2=0,cnt3=0,cnt4=0,cnt5=0; wire clk_100Hz; always @(posedge clk) begin if ( cnt1 < 156/2-1) /////////////////////////////////////////////156 分频,生成 1MHz 信号 begin cnt1 <= cnt1 + 1; end else begin cnt1 <= 0; clk_1 <= ~clk_1; end end

verilog数字钟设计(FPGA)

verilog数字钟设计(FPGA)

、课程设计目标1.熟悉并掌握verilog硬件描述语言2.熟悉quartus软件开发环境3.学会设计大中规模的数字电路,并领会其中的设计思想、课程设计实现的功能(1) 设计一个数码管实时显示时、分、秒的数字时钟( 24小时显示模式);(2) 可以调节小时,分钟。

(3) 能够进行24小时和12小时的显示切换。

(4 )可以设置任意时刻闹钟,并且有开关闹钟功能。

(5) 有整点报时功能,几点钟LED灯闪亮几下。

(6) 有复位按键,复位后时间从零开始计时,但闹钟设置时间不变。

三、设计原理:1、总原理框图:附全部代码: 总模块:module clock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signa l,nao_signal);input clk;//50MHzinput reset,MODE,Alarm_ctr,BT2,H12_24;// 复位键,模式选择按钮,闹钟开关档,调节按钮 ,12—24 小时切换档output [7:0]DMH,DML,DHH,DHL; //4 个数码管显示输入信号output dian,bao_signal,nao_signal; // 时分间隔点,报时信号 ,闹钟信号output [3:0]DSH,DSL;// 秒钟输出信号wire [3:0] SH,SL,MH,ML,HH,HL; wire [3:0] LED_mode;wire [3:0] HH12,HL12,HH24,HL24,MH24,ML24,SH24,SL24; wire [3:0] set_HH,set_HL,set_MH,set_ML; wire _1HZ,_10ms,_250ms,_500ms; wire Keydone1; wire Keydone2;wire co1,co11,co111,co2,co22,co222,set_co2; wire [3:0]mode_flag; assign dian=1'b0;devide_f u1(_1HZ,_10ms,_250ms,_500ms,reset,clk); key_press u2(_10ms,MODE,Keydone1); key_press u20(_10ms,BT2,Keydone2); mode u3(Keydone1,mode_flag);second u4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1); //秒计时 minute u5(co11,reset,MH24,ML24,co2); // 分计时 hour u6(co22,reset,HH24,HL24); SEG7_LUT u7(DML,ML); SEG7_LUT u8(DMH,MH); SEG7_LUT u9(DHL,HL); SEG7_LUT u10(DHH,HH); display_LED u11(DSL,SL); display_LED u12(DSH,SH);mode_choose u13(mode_flag,Keydone2,_250ms,co1,co2,set_co2,co11,co22,co111,co222);// 选择模式进行不同操作hour12_24 u14(HH24,HL24,HH12,HL12); //12--24 小时切换boshi u15(HH,HL,MH,ML,SH,SL,_1HZ,bao_signal); // 整点报时 set_naozhongu16(co111,co222,set_HH,set_HL,set_MH,set_ML,set_co2); // 设置闹钟时间 Naozhong u17(Alarm_ctr,_500ms,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal); //任意闹钟响应 LUT_modeu18(mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_ML, MH,ML,HH,HL);// 通过模式选择数码管显示// 分频,得到 4 种不同频率的时钟信号 //模式档按钮去抖动 // 调节按钮去除抖动 //通过模式按钮产生不同模式 // 小时计时 //4 个数码管显示//LED 灯显示秒或模式灯LED_mode u19(mode_flag,SH24,SL24,SH,SL); 模式选择LED 灯显示Endmodule分频模块:分频模块的作用主要是要获得各种频率的时钟信号。

电子钟(FPGA设计verilog代码)

电子钟(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。

基于FPGA的数字钟设计(VerilogHDL语言实现)

基于FPGA的数字钟设计(VerilogHDL语言实现)

基于FPGA的数字钟设计摘要:本设计为一个多功能的数字钟,具有时、分、秒计数显示功能,以12小时循环计数。

本设计采用EDA技术,以硬件描述语言VerilogHDL为系统逻辑描述手段设计文件,在QUARTUS II工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟。

系统主芯片采用EP1K100QC208-3,由时钟模块、控制模块、计时模块、数据译码模块、显示以及报时模块组成。

经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统能够完成时、分、秒的分别显示,由按键输入进行数字钟的清零功能。

关键词:数字钟;硬件描述语言;VerilogHDL;FPGA;引言:现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。

支撑信息电子产品高速发展的基础就是微电子制造工艺水平的提高和电子产品设计开发技术的发展。

前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronic design automatic,EDA)技术。

本设计采用的VerilogHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述、覆盖面广、抽象能力强,因此在实际应用中越来越广泛。

ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器。

而FPGA是特殊的ASIC芯片,与其他的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。

在控制系统中,键盘是常用的人机交换接口,当所设置的功能键或数字键按下的时候,系统应该完成该键所设置的功能。

因此,键信息输入是与软件结构密切相关的过程。

根据键盘的结构不同,采用不同的编码方法。

但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。

基于FPGA的闹钟系统的设计

基于FPGA的闹钟系统的设计

基于FPGA的闹钟系统的设计摘要本文介绍了一种基于FPGA的闹钟系统的设计。

该系统由时钟模块、键盘扫描模块、数码管驱动模块、警钟模块和闹钟模块组成。

该系统具有精度高、响铃声音大、可靠性高等优点,适用于家庭、办公室等场合的使用。

引言随着人们生活水平的提高,对生活品质的要求也越来越高。

作为日常生活中不可或缺的工具之一,闹钟的质量也开始受到人们关注。

传统的机械钟表的准确度较低,电子闹钟的响铃声音较小,因此人们开始寻求一种新型的高性能、可靠性更高的闹钟。

FPGA即现场可编程门阵列(Field-Programmable Gate Array),是一种新型的集成电路芯片,具有可重构性好、功耗低、性能高等优点。

本文设计的闹钟系统就是基于FPGA芯片实现。

系统设计闹钟系统的硬件包括时钟模块、键盘扫描模块、数码管驱动模块、警钟模块和闹钟模块。

时钟模块采用基于FPGA的PLL(锁相环)电路来实现,具有较高的精度和稳定性。

通过将锁相环反馈调整至外部晶振输入的频率,从而实现时钟信号的产生。

键盘扫描模块由矩阵键盘、按键扫描电路以及键码转换电路组成。

当按下键盘上的某个键时,键盘会输出对应的按键信号,经过扫描电路和转换电路,将按键信号转换成数字信号,并送往数码管驱动模块显示。

数码管驱动模块由多位数码管以及驱动电路组成。

该模块可以以秒、分、时、日期、星期等形式在数码管上显示当前时间、日期和闹钟时间。

警钟模块主要由蜂鸣器和放大电路组成,用来产生闹钟响铃声音。

闹钟模块由设定闹钟时间的按键和开关电路组成,用来设置闹钟响铃的时间。

系统实现系统实现采用Verilog HDL语言进行编写。

时钟模块采用PLL电路产生时钟信号;键盘扫描模块采用有限状态机的设计方法实现;数码管驱动模块采用时分秒计数器和时间格式转换电路实现。

警钟模块和闹钟模块通过开关实现控制。

当按下警钟模块的开关时,蜂鸣器会开始响铃;当设定好闹钟时间后开启闹钟模块,到了设定的时间闹钟也会开始响铃。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

闹钟的FPGA实现一.设计目的及总述:本次实验选择用FPGA实现一个闹钟。

它的功能有:1.时钟2.可以用按键快慢调整时钟时间3.可以设定闹钟并在时间到达设定闹钟时间时响起卡农音乐一分钟4.整点报时,响一声来报时系统一共有五个按键,分别命名为switch_mode,switch_enter,switch_pick,switch_down,switch_up。

时钟,调时,设定闹钟通过LCD1602进行显示,整点报时声和闹钟声通过蜂鸣器发出。

其中:本次实验的闹钟用Verilog语言进行设计,由于实验在Xilinx开发板上LCD1602显示模块几经调试显示都有问题,而实验的截止日期又极其接近了故最后选择在我购买的Altera 开发板上进行实现。

由于Altera公司FPGA使用Quartus II软件进行编译下载,所以把原来在ISE软件上以schematic方式实现的顶层原理图对应自动生成的verilog代码更改后添加进Quartus工程中使用。

所需要的修改仅为将顶层原理图中的OR2例化语句改为or(输出,输入1,输入2),并把系统时钟设为50MHZ,其他各模块代码不需进行更改。

二.仿真过程在几经更改之下,更由于在两种系统下的调试,使得仿真变得难以进行,此次试验针对各模块(不包括分频模块:fre_divider)的仿真结果难以找到了而且ISE9.1i十分难用,经常报各种错,因此在这里只选择其中比较重要的控制模块(controller)和时钟模块(timer),调时(快慢)模块(time_adjust)的仿真结果以说明本实验的仿真过程。

Controller:Timer:Time_adjust:三.系统总图即各模块Verilog代码和说明(参考对代码的详细注释):1.各模块之间连线图和对应的Verilog代码:Clock.v:module clock(clk_50m, //在本次实验所用的Altera开发版上,系统时钟为50MHZ rst, //复位键switch_down, //向下调整,设定switch_enter, //确认完成调整,设定switch_mode, //选择系统出于何种模式:时钟,调时,设定闹钟switch_pick, //选择调整,设定的对象:时,分,秒// switch_up, //向上调整,设定beep, //蜂鸣器lcd_d, //lcd1602 d7-d0管脚lcd_e, //lcd1602 en管脚lcd_rs, //lcd1602 rs管脚lcd_rw); //lcd1602 rw管脚input clk_50m;input rst;input switch_down;input switch_enter;input switch_mode;input switch_pick;//input switch_up;output beep;output [7:0] lcd_d;output lcd_e;output lcd_rs;output lcd_rw;//以下声明的线型量用于连接系统各模块 wire [7:0] XLXN_4;wire [7:0] XLXN_5;wire [7:0] XLXN_6;wire [7:0] XLXN_7;wire [7:0] XLXN_8;wire [7:0] XLXN_9;wire [7:0] XLXN_10;wire [7:0] XLXN_11;wire [2:0] XLXN_14;wire XLXN_15;wire XLXN_16;wire XLXN_17;wire XLXN_19;wire [5:0] XLXN_20;wire [5:0] XLXN_21;wire [5:0] XLXN_22;wire XLXN_24;wire [5:0] XLXN_33;wire [5:0] XLXN_34;wire XLXN_36;wire [5:0] XLXN_37;wire [5:0] XLXN_39;wire [5:0] XLXN_40;wire XLXN_50;wire XLXN_51;reg clk_25m;wire switch_up;assign switch_up=1;//由于系统本身是设计在实验室的板子上(25MHZ)上,所以现在把50MHZ系统时钟//二分频得到25MHZ时钟,这样就不用更改各子模块always@(posedge clk_50m)beginif(!rst)clk_25m<=0;elseclk_25m<=~clk_25m;end//控制模块,控制系统出于三种状态之一:时钟,调时,设定闹钟。

用switch_mode按键//选择状态。

当设定闹钟或者调时完成时按下switch_enter表示完成操作。

如果系统出于调//时状态会使得输出time_adjust_enable有效,此时调时模块就可以响应调时用的按键了。

//当此时按下switch_enter按键后系统会发出持续1.5秒的time_adjust_enter信号使得时钟//模块把当年时间设定为调整的时间。

系统处于设定闹钟状态时clock_set有效,闹钟设定//模块响应设定闹钟的按键。

controller XLXI_2 (.clk_2hz(XLXN_24),.rst(rst),.switch_enter(switch_enter),.switch_mode(switch_mode),.clock_set(XLXN_15),.mode(XLXN_14[2:0]),.time_adjust_enable(XLXN_16),.time_adjust_enter(XLXN_17));//时钟模块,完成时钟功能,可根据控制模块的控制信号把时钟调整模块的输出时间设定//为时钟当前时间。

timer XLXI_3 (.clk_sec(XLXN_19),.rst(rst),.time_adjust_enter(XLXN_17),.time_adjust_hou(XLXN_22[5:0]),.time_adjust_min(XLXN_21[5:0]),.time_adjust_sec(XLXN_20[5:0]),.timer_hou(XLXN_33[5:0]),.timer_min(XLXN_34[5:0]),.timer_sec(XLXN_37[5:0]));//时钟调整模块,根据控制模块的控制进行响应调整时间。

当switch_down或switch_up长//时间按下时,调整的步幅会逐渐加大,但迫近0值时会改为1的步幅。

如果短按则每按//一下改变一个单位。

本模块输出的时间不仅输入进时钟模块而且输入进选择输出模块以//方便调整时钟时用LCD1602显示调整的时间。

time_adjust XLXI_4 (.clk_2hz(XLXN_24),.rst(rst),.switch_down(switch_down),.switch_pick(switch_pick),.switch_up(switch_up),.time_adj_enable(XLXN_16),.hour(XLXN_22[5:0]),.min(XLXN_21[5:0]),.sec(XLXN_20[5:0]));//闹钟设定模块,功能与时钟调整模块相似,只是对象时闹钟时间而不是时钟时间。

同样//输出给选择输出模块。

clock_set XLXI_5 (.clk_2hz(XLXN_24),.clock_set(XLXN_15),.rst(rst),.switch_down(switch_down),.switch_pick(switch_pick),.switch_up(switch_up),.clock_hour(XLXN_40[5:0]),.clock_min(XLXN_39[5:0]));//整点报时模块,每到整点时发出一秒的滴声。

hour_alarm发出声音。

hour_alarm XLXI_6 (.clk_sec(XLXN_19),.clk_25m(clk_25m),.rst(rst),.timer_min(XLXN_34[5:0]),.timer_sec(XLXN_37[5:0]),.hour_alarm(XLXN_51));//分频模块,输入25MHZ信号,输出1HZ,2HZ,4HZ信号fre_divider XLXI_9 (.clk_25m(clk_25m),.rst(rst),.clk_sec(XLXN_19),.clk_2hz(XLXN_24),.clk_4hz(XLXN_36));//闹钟发生模块,当时钟的输出和闹钟设定模块设定好的时间相同(时,分)时发出持//续1分钟的卡农音乐。

音乐来自于网络,把右手主旋律编程进来所得。

clock_alarm信号//和整点报时的hour_alarm信号进行或后输出给蜂鸣器。

clock_alarm XLXI_10 (.clk_sec(XLXN_19),.clk_4hz(XLXN_36),.clk_25m(clk_25m),.clock_hou(XLXN_40[5:0]),.clock_min(XLXN_39[5:0]),.rst(rst),.timer_hou(XLXN_33[5:0]),.timer_min(XLXN_34[5:0]),.clock_alarm(XLXN_50));//lcd显示模块,输入为8个字符,成00:00:00的形式。

本模块负责把输入的字符按照时//序要求输出给LCD1602器件以实时显示。

lcd XLXI_12 (.clk_25m(clk_25m),.datain0(XLXN_4[7:0]),.datain1(XLXN_5[7:0]),.datain2(XLXN_6[7:0]),.datain3(XLXN_7[7:0]),.datain4(XLXN_8[7:0]),.datain5(XLXN_9[7:0]),.datain6(XLXN_10[7:0]),.datain7(XLXN_11[7:0]),.rst(rst),.lcd_d(lcd_d[7:0]),.lcd_e(lcd_e),.lcd_rs(lcd_rs),.lcd_rw(lcd_rw));//或门,把整点报时和闹钟的声音或之后输出给蜂鸣器or XLXI_13 (beep,XLXN_50,XLXN_51);//选择输出模块,根据控制模块判定现在系统所处的状态。

如果时时钟状态则把时钟的时//间输出给LCD显示模块,如果时调整时钟状态则把调整时间输出给lcd显示模块,如果时//闹钟设定状态则把闹钟时间输出给lcd显示模块。

output_pick XLXI_15 (.clock_hour(XLXN_40[5:0]),.clock_min(XLXN_39[5:0]),.mode(XLXN_14[2:0]),.timer_hou(XLXN_33[5:0]),.timer_min(XLXN_34[5:0]),.timer_sec(XLXN_37[5:0]),.time_adjust_hour(XLXN_22[5:0]),.time_adjust_min(XLXN_21[5:0]),.time_adjust_sec(XLXN_20[5:0]),.data0(XLXN_4[7:0]),.data1(XLXN_5[7:0]),.data2(XLXN_6[7:0]),.data3(XLXN_7[7:0]),.data4(XLXN_8[7:0]),.data5(XLXN_9[7:0]),.data6(XLXN_10[7:0]),.data7(XLXN_11[7:0]));endmodule2.各模块的verilog代码(说明参考注释)1).fre_divider分频模块:module fre_divider(clk_25m,rst,clk_sec,clk_2hz,clk_4hz);input clk_25m,rst;output clk_sec,clk_2hz,clk_4hz;reg clk_sec,clk_2hz,clk_4hz;reg [23:0] counter_clk_sec;reg [22:0] counter_clk_2hz;reg [21:0] counter_clk_4hz;always@(posedge clk_25m)beginif(!rst)begincounter_clk_sec<=0;clk_sec<=0;endelsebeginif(counter_clk_sec<1249_9999)counter_clk_sec<=counter_clk_sec+1;elsebeginclk_sec<=~clk_sec;counter_clk_sec<=0;endendendalways@(posedge clk_25m)beginif(!rst)begincounter_clk_4hz<=0;clk_4hz<=0;endelsebeginif(counter_clk_4hz<312_4999)counter_clk_4hz<=counter_clk_4hz+1;elsebeginclk_4hz<=~clk_4hz;counter_clk_4hz<=0;endendendbeginif(!rst)begincounter_clk_2hz<=0;clk_2hz<=0;endelsebeginif(counter_clk_2hz<624_9999)counter_clk_2hz<=counter_clk_2hz+1;elsebeginclk_2hz<=~clk_2hz;counter_clk_2hz<=0;endendendendmodule2).controller控制模块:module controller(clk_2hz,rst,switch_mode,switch_enter,mode,time_adjust_enable,time_adjust_enter,clock_set);input clk_2hz,rst,switch_mode,switch_enter; //inputoutput [2:0] mode; //outputoutput time_adjust_enable,time_adjust_enter,clock_set;reg [2:0] mode;parameter s0=3'd0, //时钟状态s1=3'd1,//时钟调整状态s2=3'd2,//闹钟设定状态s3=3'd3,//时钟调整状态时调整完时钟,按下确认键为了使//time_adjust_enter信号高电平持续1.5秒方便timer时钟模块调整时间而设计的调整//时间确认延迟状态,三个状态即可使信号持续1.5秒s4=3'd4,//同上,下同s5=3'd5;//beginif(!rst)mode<=s0;elsebegincase(mode)s0:if({switch_mode,switch_enter}==2'b01)mode<=s1;elsemode<=s0;s1:case({switch_mode,switch_enter})2'b01:mode<=s2;2'b10:mode<=s3;default:mode<=s1;endcases2:case({switch_mode,switch_enter})2'b01,2'b10:mode<=s0;default:mode<=s2;endcases3://使time_adjust_enter持续1.5秒mode<=s4;s4://同上mode<=s5;s5: //同上,三个状态即可用时1.5秒mode<=s0;default:mode<=s0;endcaseendendassign time_adjust_enable=(mode==s1);assign time_adjust_enter=(mode==s3)||(mode==s4)||(mode==s5); assign clock_set=(mode==s2);endmodule3).timer时钟模块:module timer(clk_sec,rst,time_adjust_enter,time_adjust_hou,time_adjust_min,time_adjust_sec,timer_hou,timer_min,timer_sec);input clk_sec,rst,time_adjust_enter;input [5:0] time_adjust_hou,time_adjust_min,time_adjust_sec;output [5:0] timer_hou,timer_min,timer_sec;reg [5:0] timer_hou,timer_min,timer_sec;always@(posedge clk_sec or negedge rst) //clk_sec is too long so use rst's negedge to active reset actionbeginif(!rst)begintimer_hou<=0;timer_min<=0;timer_sec<=0;endelse if(time_adjust_enter)begintimer_hou<=time_adjust_hou;timer_min<=time_adjust_min;timer_sec<=time_adjust_sec;endelse if(timer_sec<59)timer_sec<=timer_sec+1;elsebegintimer_sec<=0;if(timer_min<59)timer_min<=timer_min+1;elsebegintimer_min<=0;if(timer_hou<23)timer_hou<=timer_hou+1;elsetimer_hou<=0;endendendendmodule4).time_adjust时钟调整模块:module time_adjust(clk_2hz,rst,time_adj_enable,switch_pick,switch_up,switch_down,hour,min,sec);input clk_2hz,rst,time_adj_enable,switch_pick,switch_up,switch_down;output [5:0] hour,min,sec;reg [5:0] hour,min,sec;reg [1:0] hour_min_sec_pick;reg [4:0] counter_switch_up,counter_switch_down;//本always语句块响应各按键,switch_pick选择时分秒,switch_up,down调整时间。

相关文档
最新文档