基于Verilog HDL设计的数字时钟
基于FPGA的数字钟设计
基于FPGA的数字钟设计摘要:现实生活中经常会出现需要用时间测定参数数值的情况,服务日常生活和生产。
基于FPGA设计数字电路产品已经成为当前的重要设计方法。
本文设计选用了Quartus软件环境,运用描述逻辑Verilog HDL,由上至下的模式,基于FPGA完成了数字时钟的设计方案。
本次设计成果采用按键对闹钟的起止点进行控制,能够显示时,分,秒等并且能够实现整点报时。
其中的FPGA技术就是本次试验的亮点之一,其设计易于学习,各个模块分工清晰,在模拟软件上很容易运行,还能够适配于许多种环境,因此总体的系统性能指标还是相当有保证的。
关键词:数字钟;FPGA;Verilog HDL;Quartus1.1 课题研究背景在现代社会,数据集成电路已广泛运用于日常日常生活的各行各业。
数据集成电路也在不停拆换。
从起初的整流管、电子管、大中小型集成电路发展趋势为具备特大型集成电路和独特作用的各类专用型集成电路。
可是,因为微电子技术科技进步的迅猛发展,集成电路设计方案和生产制造工作中再也不会由半导体生产商独立担负。
系统软件室内设计师更喜欢立即设计方案专用型集成电路(ASIC)处理芯片,并马上资金投入具体运用,因而发生了当场可编程逻辑机器设备(FPLD),在其中应用最普遍的是当场可编门阵列(FPGA)。
数字钟是一种选用数字电路设计技术性完成时、分、秒计时的装置,在完成数据与此同时表明时、分、秒的准确时间和精确校正时,体积小、重量轻、抗干扰能力强、对自然环境需要高、高精密、易于开发设计等与在办公系统系统软件等众多行业运用非常普遍的传统式表壳式机械手表对比,数字表更精确、形象化,因为沒有机械设备装置,使用期限长。
1.2 国内外研究现状近些年来已经有许多技术人员针对电子器件以及时钟等技术进行了研究,但真正意义上的数字钟表起源于50年代或60年代。
伴随着在我国数字钟表电源电路销售市场的迅速发展趋势,尤其是十二五阶段经济发展方法这一领土主权主旋律早已明确,与之有关的关键生产制造技术运用和产品研发将变成领域公司关心的焦点。
简单的数字时钟(verilog设计)
设计目标与要求
设计一个简单的数字 时钟,能够显示时、 分、秒。
时钟应具有可靠性、 稳定性和可扩展性。
要求使用Verilog语 言实现,并能够在 FPGA或ASIC上实现。
设计思路及流程
• 设计思路:采用模块化设计方法,将数字时钟划分为不同的模 块,如计数器模块、显示模块等。每个模块负责实现特定的功 能,并通过接口与其他模块进行通信。
设计思路及流程
设计流程 1. 确定设计需求和目标。 2. 制定设计方案和计划。
设计思路及流程
3. 编写Verilog代码,实现各个模块的功能。 5. 根据测试结果进行调试和优化。
未来改进方向探讨
提高计时精度
通过改进算法或采用更高 性能的硬件平台,提高数
字时钟的计时精度。
降低资源占用
优化代码结构,减少不 必要的资源占用,提高 时钟系统的运行效率。
增加实用功能
拓展应用领域
考虑增加闹钟、定时器 等实用功能,使数字时 钟更加符合用户需求。
探索将数字时钟应用于 更多领域,如智能家居、
数据类型与运算符
Verilog中的数据类型包括
整型、实型、时间型、数组、结构体等。
Verilog中的运算符包括
算术运算符、关系运算符、逻辑运算符、位运算符等。
顺序语句与并行语句
Verilog中的顺序语句包括
赋值语句、条件语句、循环语句等,用于描述电路的时序行为。
Verilog中的并行语句包括
模块实例化、连续赋值语句、门级电路描述等,用于描述电路的并行行为。
EDA技术及应用—基于FPGA的电子系统设计:基于Verilog hdl的数字电路设计
10100
1111
15
10101
8421BC 余三码 D码
0000
0011
0001
0100
0010
0101
0011
0110
0100
0111
0101
1000
0110
1001
0111
1010
1000
1011
1001
1100
-
-
-
-
-
-
-
-
-
-
-
-
4位格雷码
0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000
4'b0011:a_to_g=7'b1111001; //显示3
4'b0100:a_to_g=7'b0110011; //显示4
4'b0101:a_to_g=7'b1011011; //显示5
4'b0110:a_to_g=7'b1011111; //显示6
4'b0111:a_to_g=7'b1110000; //显示7
4: y= {d[2:0],d[3]}; // rol
5: y= {d[3],d[3:1]}; // asr
6: y= {d[1:0],d[3:2]}; // ror2
7: y= d;
// noshift
default: y = d;
图6-2 基本门电路仿真结果
综合结果如图6-3所示。
图6-3 基本门电路综合结果
2、 三态逻辑电路
用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的程序设计书。
EDA课程设计 多功能数字钟设计程序清单 数字系统设计与verilog HDL(第四版) 王金明
EDA课程设计多功能数字钟设计程序清单数字系统设计与verilog HDL(第四版)王金明/*引脚锁定基于DE2一70,芯片为EP2C70F896,信号定义如下: Clk50m: 50MHz 时钟输,mode:模式选择0:计时模式1:设置闹钟模式mcheck:手动调整时间turn:手动调整时间,在时、分之间选择change:对选中的数据调整led hourl,led_hour0,led_minul,led_minu0,led_secl,led sec0;alert: 闹钟输出ld_alert: 是否设置了闹钟ld_hour,id_min,ld_sec:在调整时,指示选中了时,分还是秒*/moduleclock(clk50m,mode,turn,change,mreset,led_hour1,led_hour0,led_minu1,led_minu0, led_sec1,led_sec0, alert,ld_alert,ld_check,ld_hour,ld_min,ld_sec);input clk50m;input mode; // key0键input turn; //keyl键input change; // key2 键input mreset; //switch0复位,低电平有效output alert; //gpioO->IOAOoutput ld_alert; //ledgO-led19output ld_check; //ledgl-led22output ld_hour; //ledr3-led13output ld_min; //ledr9-led9output ld_sec; //ledr7-led7output[6:0] led_hour1;output[6:0] led_hour0;output[6:0] led_minu1;output[6:0] led_minu0;output[6:0]led_sec1;output[6:0]led_sec0;reg [1:0] modestate;//00: 计时模式10:闹钟模式; 01:手动调整模式;11:非法模式wire nowmode;//记录当前模式,0:计时模式;1: 设置闹钟模式wire ischecking; //是否在手动调整时间assign {nowmode, ischecking}=modestate;always@(negedge mode)//两个按钮都是低电平有效begincase (modestate)2'b00 : modestate<=2'b10; //设置闹钟模式优先2'b10: modestate<=2'b01; //手动调整模式2'b01: modestate<=2'b00;default :modestate<=2'b00;endcaseendwire reset, clk_1hz;switch #(8) rmjitter(clk50m,mresetr,reset);clk50mtol genlhz (clk50m, clk_1hz) ; //生成1Hz的时钟wire [2 : 0] selcode; //对turn信号在不同模式bitsel seldecoder (nowmode, ischecking, turn, selcode, reset);wire [3:0] clocktime0,clocktimel,clocktime2,clocktime3,clocktime4,clockthre5;//计时输出的时钟数值wire clockalarmon; //整点报时的闹钟输出wire [2 : 0] counterselcode;assign counterselcode=(modestate==2'b01)?selcode:3'b000;counter_time clock_time (clk_1hz,counterselcode,~change,clocktime5,clocktime4,clocktime3,clocktime2,clock time1,clocktime0,clockalarmon,reset);wire[3:0] alarmtime0,alarmtime1,alarmtime2,alarmtime3;wire alarmon;alarm_time alarm_time ( clk_1hz , nowmode , selcode [ 2 : 1] , change ,{clocktime5, clocktime4, clocktime3, clocktime2, clocktime1},{alarmtime3, alarmtime2, alarmtime1, alarmtime0} , alarmon, reset) ;wire voiceout ;alarm alarmvoice (clk50m,{clockalarmon, alarmon} ,voiceout, raset) ;//显示输出部分assign {ld_hour,ld_min,ld_sec}=(ischecking||nowmode)?selcode:3'b000; assign alert=voiceout;reg[3:0] showout2,showout3,showout4,showout5;led led5 (showout5,led_hour1) ; //led译码显示led led4 (showout4,led_hour0) ;led led3 (showout3,led_minu1) ;led led2 (showout2,led_minu0) ;led led1 (clocktime1,led_sec1) ;led led0 (clocktime0,led_sec0) ;alwaysbegin if ( nowmode)begin showout5=alarmtime3 ; showout4=alarmtime2 ;showout3=alarmtime1; showout2=alarmtime0 ; end else beginshowout5=clocktime5; showout4=clocktime4 ;showout3=clocktime3 ; showout2=clocktime2 ; end endassign ld_alert=nowmode; assign ld_check=ischecking;endmodule/*alarm.V:闹铃模块Clk50m: 50MHz输入时钟alarmon:闹铃是否打开,2'b00:不打开:2'b01:闹钟;2'b10:整点报时ala rmoUt:闹铃声音输出*/module alarm(clk50m,alarmon,alarmout,reset);input[1:0] alarmon;input clk50m,reset;output reg alarmout;reg[15:0] counter_1k;wire clk_1k;assign clk_1k=counter_1k[4];always@(posedge clk50m)begin if (counter_1k==20) counter_1k<=0;else counter_1k<=counter_1k+1'b1; endwire ddd_du_out,ddd_out;sound_ddd_du ddd_du (clk_1k,alarmon[1] ,ddd_du_out) ;sound_ddd ddd(clk_1k,alarmon[0],ddd_out);alwaysbegin if (!reset)begin if (alarmon [0]==1'b1) //ddd,闹钟的响铃优先级更高alarmout=ddd_out ;else if (alarmon==2'b10) alarmout=ddd_du_out;else alarmout=0 ;end else alarmout=0 ;endendmodule/*alarm_time.V:闹钟时间设定模块enable:使能信号Sel:在时、分之间切换选择10:时;01:分inc:对选中的信号自增basetime:基准时钟*/module alarm_time (clk_1hz , enable, sel, inc, basetime, alarmouttime, alarm_on, reset) ;input clk_1hz,enable, inc,reset;input[1:0] sel;input[4*5-1:0] basetime;output reg alarm_on;output [4*4-1: 0] alarmouttime;reg [ 3 : 0] hour1, hour0 , minu1, minu0 ; //存储的设定时间always@ (posedge inc or posedge reset)begin if (reset) //reset=1时复位begin { hour1, hour0,minu1, minu0 } <=16'h0 ; endelse beginif (enable) beginif (sel==2'b10) //设置时begin if({hour1,hour0}==8'h23) {hour1,hour0}<=8'h00;else if (hour0==9)begin hour0<=0;hour1<=hour1+1'b1; endelse hour0<=hour0+1'b1;endelse if(sel===2'b01)//设置分begin if({minu1,minu0}==8'h59) {minu1,minu0}<=8'h00;else if (minu0==4'h9)begin minu0<=4'h0;minu1<=minu1+4'h1;endelse minu0<=minu0+4'h1; endelse {hour1,hour0,minu1,minu0}<=16'h0;end endendalways //闹钟开始条件beginif(({hour1,hour0,minu1,minu0}==basetime[ (4*5-1) :4]) && (basetime[3:0]<2)) alarm_on=1'b1;else alarm_on=1'b0; endassign alarmouttime={ hour1,hour0,minu1,minu0};endmodule/*counter time,v:计时模块,并留有调整接;check:调整信号,3位,分别调整时、分、秒,调整方法:将计数输出给加法器,把调整信息转换成异步置数信息,将加法器的输出作为置数值;hour1,hour0,minul, minu0, sec1,sec0:输出的计时时钟;alarmout:整点报时输出*/modulecounter_time(clk_1hz,check,inc,hour1,hour0,minu1,minu0,sec1,sec0,alarmout,reset); input clk_1hz,inc,reset;input[2:0] check;output[3:0] hour1,hour0,minu1,minu0,sec1,sec0;output reg alarmout;reg clk_1hz_md;wire [6: 0] carryclk;reg[5:0] incplus;//自增脉冲wire [5 : 0] carry; //进位时钟wire [3 : 0] adderout0,adderout1,adderout2,adderout3,adderout4,adderout5;wire [3 : 0] timerout0,timerout1,timerout2,timerout3,timerout4,timerout5; hexcounter counter_sec0(carryclk[0],reset,4'd9,4'b0,timerout0,carry[0]); hexcounter counter_sec1(carryclk[1],reset,4'd5,4'b0,timerout1,carry[1]); hexcounter counter_minu0(carryclk[2],reset,4'd9,4'b0,timerout2,carry[2]); hexcounter counter_minu1(carryclk[3],reset,4'd5,4'b0,timerout3,carry[3]);wire [3:0] hour0max;assign hour0max=(timerout5==4'h2)?(4'h3) : (4'h9);hexcounter counter_hour0(carryclk[4],reset,hour0max,4'b0,timerout4,carry[4]); hexcounter counter_hour1(carryclk[5],reset,4'd2,4'b0,timerout5,carry[5]);//每个计时器的时钟,由前级进位和自堦脉冲相加得到assign carryclk[0]=(check==4'h0) ? clk_1hz_md:incplus[0];assign carryclk[1]=carry[0]|incplus[1];assign carryclk[2]=(check==4'h0) ? carry[1]:incplus[2];assign carryclk[3]=carry[2]|incplus[3];assign carryclk[4]=(check==4'h0) ? carry[3]:incplus[4];assign carryclk[5]=carry[4]|incplus[5];always //对异步置位信号进行解码begin case (check)3 'b001: begin clk_1hz_md=0;incplus={5 'b00000, inc} ;end3 'b010 : begin clk_1hz_md=0;incplus={3'b000,inc,2'b00};end3 'b100 : begin //在正常的调节状态中clk_1hz_md=0;incplus={1'b0, inc, 4'b000};enddefault:begin incplus=6'b000000;clk_1hz_md=clk_1hz ;endendcaseendalways begin if (((reset|check)==0)&&(timerout3==0) && (timerout2==0) && (timerout1<2)) alarmout=1;//时间小于20秒的时间内else alarmout=0;endassign hour1=timerout5;assign hour0=timerout4;assign minu1=timerout3;assign minu0=timerout2;assign sec1=timerout1;assign sec0=timerout0;endmodule/*Clk50mtol.v: 50mhz 时钟分频到lhz */module clk50mtol(clk50m,clk1hz);input clk50m;output clk1hz;reg [25:0]counter_1hz;//从50mhz 分频到lhz 的计数器assign clk1hz=counter_1hz[14];//assign clk1hz=counter_1hz[25];always@ (posedge clk50m)beginif(counter_1hz==20000) counter_1hz<=0;else counter_1hz<=counter_1hz+1'b1;endendmodule/*led.v:7段数码管(led)译码显示模块datain:4位,10进制数输入ledout:7位,数码管的7段*/module led(datain,ledout);parameter INWIDTH=4;parameter OUTWIDTH=7;input[INWIDTH-1: 0] datain;output [OUTWIDTH-1:0] ledout;reg[OUTWIDTH-1:0] dataout;assign ledout=dataout;always begincase (datain)0 : dataout<=7'b1000000;1 : dataout<=7'b1111001;2 : dataout<=7'b0100100;3 : dataout<=7'b0110000;4 : dataout<=7'b0011001;5 : dataout<=7'b0010010;6 : dataout<=7'b0000010;7 : dataout<=7'b1111000;8 : dataout<=7'b0000000;9 : dataout<=7'b0010000;default : dataout<=7'b1000000;endcaseendendmodule/*switch-v:对按键开关的消抖电路,采用一个频率较低的时钟,对输入进行采样,消除抖动*/module switch(clk,keyin,keyout);parameter COUNTWIDTH=8;input clk, keyin;output reg keyout;reg [COUNTWIDTH-1: 0] counter;wire clk_use; //频率较低的时钟assign clk_use=counter [COUNTWIDTH-1];always@ (posedge clk)counter<=counter+1'b1;always@ (posedge clk_use)keyout<=keyin;endmodule/*bitsel-v:将输出解码成对时、分、秒的选择(并且分闹钟设置模式还是计时模式)Alarmmode:是否是在设置闹钟模式checkmode:是否是在调整时间模式*/module bitsel(alarmmode, checkmode, sel, selcode, reset) ;input alarmmode, checkmode, sel, reset;output reg [2:0] selcode;reg [2:0] check_code ;reg [1:0] alarm_code ;always@ (negedge sel or posedge reset)begin if (reset) check_code<=3'b000; //reset=1 复位else begincase (check_code)3 'b000: check_code<=3 'b001;3 'b001: check_code<=3 'b010;3 'b010: check_code<=3 'b100;3 'b100: check_code<=3 'b001;default: check_code<=3 'b000;endcaseendendalways@ (negedge sel or posedge reset)begin if (reset) alarm_code<=2 'b00; //低电平复位else begincase (alarm_code)2'b00 : alarm_code<=2'b01;2 'b01 : alarm_code<=2 'b10 ;2 'b10 : alarm_code<=2 'b01;default : alarm_code<=2 'b00;endcaseendendalwaysbegin if (alarmmode^checkmode) //两个当中只有1个为1 begin if (checkmode) selcode=check_code;else selcode={alarm_code,1'b0}; endelse selcode=3 'b000 ;endendmodule/*adder.v:加法器*/module adder(in1, in2, out);parameter in1width=8;parameter in2width=8;parameter outwidth=8;input [in1width-1: 0] in1;input [in2width-1: 0] in2;output[outwidth-1: 0] out;assign out=in1+in2;endmodule/*excounter-v:16进制计数的一个计数器*/module hexcounter (clk, set, max, setdata, dataout, carryout) ; input clk,set;input[3:0] max,setdata;output carryout;output[3:0] dataout;reg[3:0] counter;reg carrybit;assign carryout=carrybit;assign dataout=counter;always@ (posedge clk or posedge set)begin if (set) //set是高电平有效begin counter<=setdata;carrybit<=0 ;endelse begin if( (counter==max)||(counter>max) )begin counter<=0 ;carrybit<=1;endelse begin counter<=counter+1'b1;carrybit<=0 ;endendendendmodule/*sound_ddd.V:发出嘀嘀嘀闹铃声模块*/module sound_ddd(clk_1k, on, out);parameter soundspace=30;parameter shotstopspace=20; //20ms,两个嘀声的时间距离parameter longstopspace=50;//50ms,连续三个嘀后的时间距离input clk_1k,on;output reg out;reg sound;always@ (posedge clk_1k)begin sound<=~sound; endreg[10:0] mscount;always@ (posedge clk_1k)begin if (mscount== (soundspace*3+shotstopspace*2+longstopspace-1) )mscount<=0;else mscount<=mscount+1'b1;endalways@ (negedge clk_1k)begin if (on)begin if ( (mscount>=0) && (mscount<soundspace) ) out<=sound;else if ( (mscount>=soundspace) && (mscount< (soundspace+shotstopspace) ) )out<=0;else if ( (mscount>= (soundspace+shotstopspace) ) && (mscount< (soundspace+shotstopspace) +soundspace) )out<=sound;else if ( (mscount>= (soundspace+shotstopspace) +soundspace) && (mscount< (soundspace+shotstopspace) *2) )out<=0;else if ( (mscount>= (soundspace+shotstopspace) *2)&&(mscount< ((soundspace+shotstopspace) *2+soundspace) ) )out<=sound;else out<=0;endelse out<=0 ;endendmodule/* sound ddd du,v:发出声音嘀嘀嘀一嘟声音模块*/module sound_ddd_du (clk_1k, on, out) ;parameter SOUNDSPACE=30;parameter shotstopspace=20;//20ms,两个嘀声的时间距离parameter longsoundspace=60; //嘟的长度input clk_1k, on;output reg out;reg sound_di, sound_du;always@ (posedge clk_1k) sound_di<=~sound_di;always@ (posedge sound_di) sound_du<=~sound_du;reg [ 11 : 0 ] mscount ;always@ (posedge clk_1k)begin if (on)begin if (mscount< (SOUNDSPACE+shotstopspace) *3+longsoundspace+10)mscount<=mscount+1'b1;endelse mscount<=0 ;endalways@ (negedge clk_1k)begin if (on)begin if ( (mscount>=0) && (mscount<SOUNDSPACE) ) out<=sound_di;else if ( (mscount>=SOUNDSPACE) && (mscount< (SOUNDSPACE+shotstopspace) ) )out<=0 ;else if ( (mscount>= (SOUNDSPACE+shotstopspace) ) && (mscount< (SOUNDSPACE+shotstopspace) +SOUNDSPACE) )out<=sound_di ;else if ( (mscount>= (SOUNDSPACE+shotstopspace) +SOUNDSPACE) && (mscount< (SOUNDSPACE+shotstopspace) *2) )out<=0;else if ( (mscount>= (SOUNDSPACE+shotstopspace) *2) && (mscount< ( (SOUNDSPACE+shotstopspace) *2+SOUNDSPACE) ) )out<=sound_di;else if ( (mscount>= (SOUNDSPACE+shotstopspace) *2+SOUNDSPACE) && (mscount< (SOUNDSPACE+shotstopspace) *3) )out<=0;else if ( (mscount>= (SOUNDSPACE+shotstopspace) *3) && (mscount< ( (SOUNDSPACE+shotstopspace) *3+longsoundspace) ) )out<=sound_du;else out<=0;endendendmodule。
数字系统设计hdl课后答案
数字系统设计hdl课后答案【篇一:数字系统设计与verilog hdl】ss=txt>(复习)eda(electronic design automation)就是以计算机为工作平台,以eda软件工具为开发环境,以pld器件或者asic专用集成电路为目标器件设计实现电路系统的一种技术。
1.电子cad(computer aided design)2.电子cae(computer aided engineering)3.eda(electronic design automation)eda技术及其发展p2eda技术的应用范畴1.3 数字系统设计的流程基于fpga/cpld的数字系统设计流程1. 原理图输入(schematic diagrams )2、硬件描述语言 (hdl文本输入)设计输入硬件描述语言与软件编程语言有本质的区别综合(synthesis)将较高层次的设计描述自动转化为较低层次描述的过程◆行为综合:从算法表示、行为描述转换到寄存器传输级(rtl)◆逻辑综合:rtl级描述转换到逻辑门级(包括触发器)◆版图综合或结构综合:从逻辑门表示转换到版图表示,或转换到pld器件的配置网表表示综合器是能自动实现上述转换的软件工具,是能将原理图或hdl语言描述的电路功能转化为具体电路网表的工具适配适配器也称为结构综合器,它的功能是将由综合器产生的网表文件配置于指定的目标器件中,并产生最终的可下载文件对cpld器件而言,产生熔丝图文件,即jedec文件;对fpga器件则产生bitstream位流数据文件p8仿真(simulation)功能仿真(function simulation)时序仿真(timing simulation)仿真是对所设计电路的功能的验证p9编程(program)把适配后生成的编程文件装入到pld器件中的过程,或称为下载。
通常将对基于eeprom工艺的非易失结构pld器件的下载称为编程(program),将基于sram工艺结构的pld器件的下载称为配置(configure)。
基于verilog HDL计时器和倒计时的系统设计
实验报告2019 -2020 学年第2学期开课单位电子信息学院适用年级、专业2017级电子信息科学与技术Z 课程名称FPGA技术及应用-课内实验主讲教师课程序号BS6222003X3-03课程代码BS6222003X3实验名称计时器和倒计时的系统设计实验学时2学时学号姓名实验五计时器和倒计时的系统设计①掌握用Verilog HDL文本输入法设计计时电路的方法,并通过电路仿真和硬件验证,进一步了解计时器的功能和特性。
②掌握用Verilog HDL文本输入法设计倒计时电路的方法,并通过电路仿真和硬件验证,进一步了解倒计时电路的功能和特性。
二、实验原理1.计时器24小时计时器的电路框图如图8.1所示。
图8.1 24小时计时器的电路框图24小时计时器由2个60进制加计数器和1个24进制加计数器构成,输入CLK为1HZ(秒)的时钟,经过60进制加计数后产生1分钟的进位时钟信号,再经过60进制加计数后产生1小时的进位时钟信号送给24进制加计数器进行加计数,当加计数到达23:59:59后,再来-一个秒脉冲,产生时的进位输出。
将两个60进制加计数器和一个24进制加计数器的输出送数码管显示,得到计时器的显示结果。
其中,秒脉冲由EDA实调仪上的20MHz晶振分频得到。
2.倒计时器24小时倒计时器的电路框图如图8.2所示。
图8.2 24 小时倒计时器的电路框图24小时倒计时器由2个60进制减计故器和1个24进制减计数器构成,输入CLK为1Hz(秒)的时钟,经过60进制减计数后产生1分钟的借位时钟信号,再经过60进制减计数后产生I小时的借位时钟信号送给24进制减计数器进行减计数,当减计数到达00:00:00后,产生时的借位输出,同时24小时倒计时器停止倒计时,并发出提醒信号。
将两个60进制减计数器和一个24进制减计数器的输出送数码管显示,得到倒计时的显示结果。
其中,秒脉冲由EDA实训仪上的20MHz晶振分频得到。
三、实验设备①EDA实调仪1台。
基于verilog的数字秒表的设计实现
数字秒表的设计实现团队成员:董婷詹磊胡鹏一、测试要求1. 有源晶振频率:24MHZ2. 测试计时范围:00’00”00 ~ 59’59”99,显示的最长时间为59分59 秒3. 数字秒表的计时精度是10ms4. 显示工作方式:a、用八位数码管显示读数b、用两个按钮开关(一个按钮使秒表复位,另一个按钮控制秒表的启动/暂停)二、设计要求1. 设计出符合设计要求的解决方案2. 利用软件对各单元电路及整体电路进行仿真3. 在开发板上实现设计5. 撰写设计报告三、秒表功能键1、power:秒表电源键2、Reset:秒表复位清零键3、run/stop:秒表启动/停止键四、实验原理1 .实验设计原理(1)秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、分频器、数据选择器、和显示译码器等组成。
在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。
(2)秒表有共有8个输出显示,其中6个显示输出数据,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应;另外两个为间隔符,显示‘-’。
8个计数器的输出全都为BCD码输出,这样便与同显示译码器连接。
(3)可定义一个24位二进制的寄存器hour用于存放8个计数器的输出,寄存器从高位到低位每连续4位为一组,分别存放百分之一秒、十分之一秒、间隔符、秒、十秒、间隔符、分、十分。
由频率信号输出端输出频率为100HZ的时钟信号,输入到百分之一秒模块的时钟端clk,百分之一秒模块为100进制的计数器,当计数到“1001”时,百分之一秒模块清零,同时十分之一秒模块加1;十分之一秒模块也为100进制的计数器,当计数到“1001”时,十分之一秒模块清零,同时秒模块加1;以此类推。
直到分模块计数到59进59。
(4)为了消除按键消抖问题,定义寄存器key-inner来存储按键key的输入信号,key-flag作为启动/暂停的转换标志,key-inner[0]出现一个下降沿时,key-flag取反一次,当key-flag为0时计数器启动,1时计数器暂停,当key-flag 为1同时key-inner[1]为9时,计数器清零。
verilog 时钟概念
verilog 时钟概念
在Verilog中,时钟是数字逻辑设计中的核心概念,它是系统中的基本定时信号,具有周期性和边沿触发特性。
时钟信号一般表现为连续、稳定的脉冲波形,常用作触发逻辑门电路和其他元件同步更新状态的基准。
在Verilog中,时钟信号通常被声明为输入,并通过`posedge`或`negedge`敏感列表来捕捉时钟上升沿或下降沿触发的事件。
时钟信号驱动状态机切换、存储器读写以及其他需要同步操作的逻辑模块。
设计者还会考虑时钟树综合、时钟偏移、时钟域跨越等问题,确保设计的时序正确性与稳定性。
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语言实现
一、实验目的(1)熟练掌握分频器、各种进制的同步计数器的设计。
(2)熟练掌握同步计数器的级联方法。
(3)掌握数码管的动态显示驱动方式。
(4)掌握计数器的功能和应用。
(5)理解开关防颤动的必要性。
(6)掌握简单控制器的设计方法。
二、实验内容和原理1、实验设计要求:(1)计时范围0’0’.0’’~59’59’.9’’,分辨率为0.1s,用数码管显示计时值。
(2)秒表有一个按键开关:当电路处于“初始”状态时,第一次按键,计时开始(“计时”状态);再次按键。
计时停止(“停止”状态);第三次按键,计时器复位为0’0’.0’’,且电路恢复到“初始”状态。
2、根据设计要求,可画出秒表电路的原理框图,如图1-2所示,秒表电路由时钟管理模块(DCM)、分频器模块、按键处理模块、控制器、计时模块和显示模块组成。
图1-2 秒表电路的原理框图(1)DCM模块由于数字钟为低速电路,而XUP Virtex-II Pro 开发系统只提供100MHz主时钟,因此需插入DCM分频模块以降低系统的工作时钟,从而提高系统的可靠性。
DCM可采用16分频,输出6.25MHz的sys_clk信号作为系统的主时钟。
ISE生成DCM内核的Verilog HDL 代码:VgaDCM DCMInst(.CLKIN_IN(clk),.CLKDV_OUT(sys_clk),.CLKIN_IBUFG_OUT(),.CLK0_OUT(), .LOCKED_OUT());(2)分频器模块产生用于计时的1/10秒脉冲信号pulse10,频率为10Hz ; 产生用于显示模块的扫描脉冲信号pulse400,频率为400Hz 。
1/10秒脉冲信号pulse10和扫描脉冲信号pulse400的脉冲宽度为一个系统主时钟信号sys_clk 的周期。
分频器模块原理框图如图1-3所示,先设计一个15625分频器,产生400Hz 的扫描信号pulse400,再由pulse400控制40分频器产生1/10秒脉冲信号pulse10。
基于Verilog-HDL的现代数字系统设计
—
…
能够在多个层次上对所设计的系统加 以描述. 从开关级、 、 门级 寄存器卿 到功能级和系统级 , 都可以描述。设计的规模可以是任意的 , 语言不对 设计的规模施加任何 限制。并且具有混合建模能 力。 即在—个设计中各个模块可以在不同设计层次 E 建模和描述 。 基本逻辑门, 例如 ado 和 nn n 、r ad等都内置在 语言中; 开关级结构模型 , p o 和 n o 等也 例如 m s m s 被内置在语言 中, 用户可以直接调用。用户定义原 语 D 泡 建的灵活性。用户定义的原语既可 以是 P0 组合逻辑原语 , 也可以是时序逻辑原语。 V ro D 的基本设计单元是’ 抉 ( o 。 el H L ig 喂- b c l 个模块是由两部分组成的一 部分描述接口; 另一 部分描述逻辑功能 ,即定义输入是如何影响输出 的。 2 Q ats I ur I简介 u Q ats I Ahr 公 司 推 出 的 F G /P D ur 是 uI ea P AC L 的开发工具 , 其具有功能强大 , 使用灵活方便等优
i u  ̄1 m>)
in m [. = ) fu a  ̄ O ( 3
b sn  ̄ i
工具 , E A计术的发展, 随着 D 为现代数字系统 的 设 计提供了 灵活 , 快捷的途径。E A以计算机为工作 D 平台, 了 融合 应用 电子技术、 计算机技术和智能化 技术 的最新成果 而开发 出的电子 C D A 通用 软件 包 。它根据硬件描述语言( D ) H L 完成设计文件 , 自 动完成逻辑编译 、 化简、 、 、 、 分割 综合 优化 布局布线 及仿真, 直至可实现对于特定 目 标芯片的适配编译 、 逻辑映射和编程下载等工作。本文通过介绍 V e ig H L l o D 语言和 Q a u 工具来对现代数字系 ur s I t I 最后通过设计—个 交通灯控制器对现代数字系统的设计进行详细的
基于verilogHDL的数字时钟
*****顶层模块信号定义:clk : 基准时钟信号输入;keysel : 校时状态/正常计时状态选择键输入;key_s : 校秒信号选择键输入;key_m : 校分信号选择键输入;key_h : 校时信号选择键输入;keyclr : 计时清零键;keyen : 计时开始键;buzzout : 声响输出;sled : 4位数码管段码输出;sl : 4位数码管位码输出;seg : 单个数码管输出;********************************************************* ******/moduleclock(clk,keysel,key_s,key_m,key_h,keyen,keyclr,sled,sl,seg,buzzout);output[7:0] sled;output[3:0] sl;output[7:0] seg;output buzzout;input clk;input keysel,key_s,key_m,key_h,keyen,keyclr;reg[24:0] count;wire[23:0] min;wire sec;wire sec_s,sec_m,sec_h,sec_narmal;divclk Q1(clk,sec_narmal,sec_s,sec_m,sec_h);modifyQ2(clk,keysel,key_s,key_m,key_h,sec,sec_narmal,sec_s,sec_m,sec_h);counttime Q3(sec,keyclr,keyen,min);display Q4(clk,sec,min,sled,sl,seg);music Q5(clk,min,buzzout,sec_narmal);endmodule*****分频模块信号定义:clk : 基准时钟信号输入;sec_narmal : 周期为1的信号输出;sec_s : 周期为0.5s的信号输出;sec_m : 周期为0.05s的信号输出;sec_h : 周期为0.0005s的信号输出;********************************************************* ******/module divclk(clk,sec_narmal,sec_s,sec_m,sec_h);input clk;output sec_narmal,sec_s,sec_m,sec_h;reg[23:0] count1;reg[22:0] count2;reg[19:0] count3;reg[12:0] count4;reg sec_narmal,sec_s,sec_m,sec_h;always@(negedge clk)begincount1=count1+1'b1;if(count1==24'd1*******)begincount1=24'h0;sec_narmal=~sec_narmal;endendalways@(negedge clk)begincount2=count2+1'b1;if(count2==23'd6000000)begincount2=23'h0;sec_s=~sec_s;endendalways@(negedge clk)begincount3=count3+1'b1;if(count3==20'd600000)begincount3=20'h0;sec_m=~sec_m;endendalways@(negedge clk)begincount4=count4+1'b1;if(count4==13'd6000)begincount4=13'h0;sec_h=~sec_h;endendendmodule/********************************************************* *****计时处理模块信号定义:sec : 计时信号输入;keyclr : 计时清零键;keyen : 计时开始键;min : 计时结果输出;********************************************************* ******/module counttime(sec,keyclr,keyen,min);input sec;input keyclr,keyen;output[23:0] min;reg[23:0] min;always@(posedge sec)beginif(!keyclr)beginmin=24'h0;endelseif(!keyen)beginmin=min+1'b1;if(min[3:0]==4'ha)beginmin[3:0]=4'h0;min[7:4]=min[7:4]+1'b1;if(min[7:4]==4'h6)beginmin[7:4]=4'h0;min[11:8]=min[11:8]+1'b1;if(min[11:8]==4'ha)beginmin[11:8]=4'h0;min[15:12]=min[15:12]+1'b1;if(min[15:12]==4'h6)beginmin[15:12]=4'h0;min[19:16]=min[19:16]+1'b1;if(min[19:16]==4'ha)beginmin[19:16]=4'h0;min[23:20]=min[23:20]+1'b1;endif(min[23:16]==8'h24)min[23:16]=0;endendendendendendendmodule/********************************************************* *****校时模块信号定义:clk : 基准时钟信号输入;keysel : 校时状态/正常计时状态选择键输入key_s : 校秒信号选择键输入key_m : 校分信号选择键输入key_h : 校时信号选择键输入sec_narmal : 周期为1的信号输出;sec_s : 周期为0.5s的信号输出;sec_m : 周期为0.05s的信号输出;sec_h : 周期为0.0005s的信号输出;sec : 计时信号输出;********************************************************* ******/modulemodify(clk,keysel,key_s,key_m,key_h,sec,sec_narmal,sec_s,sec_m,sec _h);input clk;input keysel;input key_s,key_m,key_h;input sec_narmal,sec_s,sec_m,sec_h;output sec;reg sec;always@(negedge clk)beginif(!keysel)beginif(!key_s)sec=sec_s;if(!key_m)sec=sec_m;if(!key_h)sec=sec_h;endelsesec=sec_narmal;endendmodule/********************************************************* *****报时模块信号定义:clk : 基准时钟信号输入;min : 当前计时结果输入;buzzout : 声响输出;********************************************************* ******/module music(clk,min,buzzout,sec_narmal);input clk,sec_narmal;input[23:0] min;output buzzout;reg[3:0] high,med,low;reg buzzout_reg;reg[24:0] count1,count2;reg[15:0] count_end,count_now;reg[7:0] counter;reg clk_4HZ;always@(posedge clk)beginif(count1<22'd3000000)count1=count1+1'b1;elsebegincount1=0;clk_4HZ=~clk_4HZ;endendalways@(posedge clk)beginif(count_now!=count_end)begincount2=25'h0;count_now=count_end;endcount2=count2+1'b1;if((min[15:0]>=16'h5945)&&(min[15:0]<=16'h5959))beginif((count2==count_end)&&(min[23:16]==8'h11))begincount2=25'h0;buzzout_reg=!buzzout_reg;endendif((min[15:0]>=16'h5950)&&(min[15:0]<=16'h5959)) beginif(min[23:16]!=8'h11)beginbuzzout_reg=!(count2[10]&sec_narmal);endendendalways@(posedge clk_4HZ)begincase({high,med,low})9'b000000001:count_end=16'hbb9a;9'b000000010:count_end=16'ha72f;9'b000000011:count_end=16'h94f2;9'b000000100:count_end=16'h8e78;9'b000000101:count_end=16'h7d63;9'b000000110:count_end=16'h6fb5;9'b000000111:count_end=16'h637f;9'b000001000:count_end=16'h5dfb;9'b000010000:count_end=16'h53bb;9'b000011000:count_end=16'h4a95;9'b000100000:count_end=16'h4651;9'b000101000:count_end=16'h3eb1;9'b000110000:count_end=16'h37da;9'b000111000:count_end=16'h31bf;9'b001000000:count_end=16'h2ef2;9'b010000000:count_end=16'h29d4;9'b011000000:count_end=16'h2543;9'b100000000:count_end=16'h232f;9'b101000000:count_end=16'h1f58;9'b110000000:count_end=16'h1bed;9'b111000000:count_end=16'h18df;endcaseendalways@(posedge clk_4HZ)beginif(counter==57)counter=0;elsecounter=counter+1'b1;case(counter)0:{high,med,low}=9'b000001000;1:{high,med,low}=9'b000001000;2:{high,med,low}=9'b000001000;3:{high,med,low}=9'b000001000;4:{high,med,low}=9'b000010000;5:{high,med,low}=9'b000010000;6:{high,med,low}=9'b000010000;7:{high,med,low}=9'b000010000;8:{high,med,low}=9'b000011000;9:{high,med,low}=9'b000011000;10:{high,med,low}=9'b000011000;11:{high,med,low}=9'b000011000;12:{high,med,low}=9'b000001000;13:{high,med,low}=9'b000001000;14:{high,med,low}=9'b000001000;15:{high,med,low}=9'b000001000;16:{high,med,low}=9'b000001000;17:{high,med,low}=9'b000001000;19:{high,med,low}=9'b000001000; 20:{high,med,low}=9'b000010000; 21:{high,med,low}=9'b000010000; 22:{high,med,low}=9'b000010000; 23:{high,med,low}=9'b000010000; 24:{high,med,low}=9'b000011000; 25:{high,med,low}=9'b000011000; 26:{high,med,low}=9'b000011000; 27:{high,med,low}=9'b000011000; 28:{high,med,low}=9'b000001000; 29:{high,med,low}=9'b000001000; 30:{high,med,low}=9'b000001000; 31:{high,med,low}=9'b000001000; 32:{high,med,low}=9'b000011000; 33:{high,med,low}=9'b000011000; 34:{high,med,low}=9'b000011000; 35:{high,med,low}=9'b000011000; 36:{high,med,low}=9'b000100000; 37:{high,med,low}=9'b000100000; 38:{high,med,low}=9'b000100000; 39:{high,med,low}=9'b000100000; 40:{high,med,low}=9'b000101000; 41:{high,med,low}=9'b000101000; 42:{high,med,low}=9'b000101000; 43:{high,med,low}=9'b000101000; 44:{high,med,low}=9'b000001000; 45:{high,med,low}=9'b000001000; 46:{high,med,low}=9'b000001000; 47:{high,med,low}=9'b000011000; 48:{high,med,low}=9'b000011000; 49:{high,med,low}=9'b000011000; 50:{high,med,low}=9'b000011000; 51:{high,med,low}=9'b000100000; 52:{high,med,low}=9'b000100000; 53:{high,med,low}=9'b000100000; 54:{high,med,low}=9'b000100000;56:{high,med,low}=9'b000101000;57:{high,med,low}=9'b000101000;endcaseendassign buzzout=buzzout_reg;endmodule/********************************************************* *****显示模块信号定义:clk : 基准时钟信号输入;min : 当前计时结果输入;sec : 计时的秒信号输入;sled_reg : 数码管短码输出;sl_reg : 数码管位码输出;seg_reg : 单个数码管输出;********************************************************* ******/module display(clk,sec,min,sled_reg,sl_reg,seg_reg);input clk;input sec;input[23:0] min;output[7:0] sled_reg;output[3:0] sl_reg;output[7:0] seg_reg;reg[7:0] sled_reg;reg[3:0] sl_reg;reg[7:0] seg_reg;reg[15:0] count;reg[3:0] ledbuf;always@(negedge clk)begincount=count+1'b1;endalways@(count[11:10])begincase(count[11:10])2'h0:ledbuf=min[3:0];2'h1:ledbuf=min[7:4];2'h2:ledbuf=min[11:8];2'h3:ledbuf=min[15:12];endcasecase(count[11:10])2'h0:sl_reg=4'b0111;2'h1:sl_reg=4'b1011;2'h2:sl_reg=4'b1101;2'h3:sl_reg=4'b1110;endcaseendalways@(ledbuf)begincase(ledbuf)4'h0:sled_reg=8'hc0;4'h1:sled_reg=8'hf9;4'h2:sled_reg=8'ha4;4'h3:sled_reg=8'hb0;4'h4:sled_reg=8'h99;4'h5:sled_reg=8'h92;4'h6:sled_reg=8'h82;4'h7:sled_reg=8'hf8;4'h8:sled_reg=8'h80;4'h9:sled_reg=8'h90;4'ha:sled_reg=8'h88;4'hb:sled_reg=8'h83;4'hc:sled_reg=8'hc6;4'hd:sled_reg=8'ha1;4'he:sled_reg=8'h86;4'hf:sled_reg=8'h8e;endcaseif((count[11:10]==2'b10)&sec)sled_reg=sled_reg&8'h7f; endalways@(min[23:16])begincase(min[23:16])8'h0:seg_reg=8'h3f;8'h1:seg_reg=8'h06;8'h2:seg_reg=8'h5b;8'h3:seg_reg=8'h4f;8'h4:seg_reg=8'h66;8'h5:seg_reg=8'h6d;8'h6:seg_reg=8'h7d;8'h7:seg_reg=8'h07;8'h8:seg_reg=8'h7f;8'h9:seg_reg=8'h6f;8'h10:seg_reg=8'h77;8'h11:seg_reg=8'h7c;8'h12:seg_reg=8'hbf;8'h13:seg_reg=8'h86;8'h14:seg_reg=8'hdb;8'h15:seg_reg=8'hcf;8'h16:seg_reg=8'he6;8'h17:seg_reg=8'hed;8'h18:seg_reg=8'hfd;8'h19:seg_reg=8'h87;8'h20:seg_reg=8'hff;8'h21:seg_reg=8'hef;8'h22:seg_reg=8'hf7;8'h23:seg_reg=8'hfc;endcaseendendmodule。
实验六-数字频率计的Verilog-HDL语言实现
五邑大学实验报告实验课程名称)数字频率计的Verilog HDL语言实现院系名称:信息工程学院专业名称:通信工程(物联网工程)实验项目名称:EDA实验班级: 110711学号:。
报告人:冯剑波实验六 数字频率计的Verilog HDL 语言实现一、实验目的:1、掌握较复杂数字电路或系统的纯Verilog HDL 实现方法;2、体会纯Verilog HDL 语言输入设计与原理图输入设计的差别。
二、实验原理:【数字频率计是用来测量输入信号的频率并显示测量结果的系统。
一般基准时钟的高电平的持续时间为s T 10 ,若在这0T 内被测信号的周期数为N 则被测信号的频率就是N ,选择不同的0T ,可以得到不同的测量精度。
一般0T 越大,测量精度越高,但一次的测量时间及频率计所需的硬件资源也增加。
三、设计任务与要求:1、设计一个6位频率计,测量范围从1Hz 到99 99 99Hz ,测量结果用6个数码管显示,基准时钟频率为1Hz ;2、只显示测量结果,中间计数过程不显示;结果更新时间2秒一次;3、频率计只设一个复位键,按下该键(reset=0)系统复位,释放该键(reset=1)系统工作,测量并显示结果。
4、显示用静态方式;5、用Verilog HDL 实现上述要求的频率计。
四、设计源程序及注释与仿真结果设计源程序:module pinlvji(oHEX0,oHEX1,oHEX2,oHEX3,oHEX4,oHEX5,clk_50M,clk_1Hz,reset,signal_out); @input clk_50M,reset; //50MHz 时钟输入、复位output[6:0] oHEX0,oHEX1,oHEX2,oHEX3,oHEX4,oHEX5; //数码管0-5,分别显示个、十、百、千、万、十万位的数字output reg clk_1Hz;output reg signal_out; reg signal_in; reg[29:0] cnt;reg[29:0] cnt1; reg count_en; //计数允许,count_en=1时计数,下降沿到来时锁存reg load; reg[3:0] ge,shi,bai,qian,wan,shiwan; reg cout1,cout2,cout3,cout4,cout5;reg[3:0] q0,q1,q2,q3,q4,q5;wire clr; always @(posedge clk_50M) //改变Hz 的范围,自己设定的频率1Hz-999999Hzbegincnt1=cnt1+1;if(cnt1<=25_000_0) begin signal_out=0;signal_in=0;endelse if(cnt1==50_000_0) cnt1=0;【else begin signal_out=1;signal_in=0;endendalways @(posedge clk_50M) //50M分频产生1Hz时钟begincnt=cnt+1;if(cnt<=25_000_000) clk_1Hz=0;else if(cnt==50_000_000) cnt=0;else clk_1Hz=1;end/*被测信号signal_in作为个位的输入,,signal_in上升沿到来时ge位+1;进位输出是cout1,作为十位的输入*/always @(posedge signal_out or posedge reset or posedge clr)~begin if(reset) ge=0;else if(clr) ge=0;else begin if(count_en) begin if(ge==9) begin ge=0;cout1=1;endelse begin ge=ge+1;cout1=0;endendendend/*cout1作为十位的输入,cout1上升沿到来时shi位+1;进位输出是cout2,作为百位的输入*/always @(posedge cout1 or posedge reset or posedge clr)begin if(reset) shi=0;else if(clr) shi=0;¥else begin if(count_en) begin if(shi==9) begin shi=0;cout2=1;endelse begin shi=shi+1;cout2=0;endendendend/*cout2作为百位的输入,cout2上升沿到来时bai位+1;进位输出是cout3,作为千位的输入*/always @(posedge cout2 or posedge reset or posedge clr)begin if(reset) bai=0;else if(clr) bai=0;else begin if(count_en) begin if(bai==9) begin bai=0;cout3=1;endelse begin bai=bai+1;cout3=0;end…endendend/*cout3作为千位的输入,cout3上升沿到来时qian位+1;进位输出是cout4,作为万位的输入*/ always @(posedge cout3 or posedge reset or posedge clr)begin if(reset) qian=0;else if(clr) qian=0;else begin if(count_en) begin if(qian==9) begin qian=0;cout4=1;endelse begin qian=qian+1;cout4=0;endendend;endalways @(posedge cout4 or posedge reset or posedge clr)begin if(reset) wan=0;else if(clr) wan=0;else begin if(count_en) begin if(wan==9) begin wan=0;cout5=1;endelse begin wan=wan+1;cout5=0;endendendendalways @(posedge cout5 or posedge reset or posedge clr)begin if(reset) shiwan=0;<else if(clr) shiwan=0;else begin if(count_en) begin if(bai==9) begin shiwan=9;endelse begin shiwan=shiwan+1;endendendend/*****count_en=1时计数,count_en=0不允许计数********/always @(posedge clk_1Hz or posedge reset)begin if(reset) begin count_en=0;endelse begin count_en=~count_en;load=~count_en;endend//*****count_en下降沿到来时锁存数据****/ always @(negedge count_en)begin q0=ge; q1=shi;q2=bai; q3=qian;q4=wan; q5=shiwan;endassign clr=~clk_1Hz&load;/****调用数码管显示*****/led7s u0(q0,oHEX0);led7s u1(q1,oHEX1);led7s u2(q2,oHEX2);]led7s u3(q3,oHEX3);led7s u4(q4,oHEX4);led7s u5(q5,oHEX5);endmodulemodule led7s(datain,ledout);input[3:0] datain; output reg[6:0] ledout; always begin case(datain)0: ledout<=7'b1000000;1: ledout<=7'b1111001;2: ledout<=7'b0100100;3: ledout<=7'b0110000;)4: ledout<=7'b0011001;5: ledout<=7'b0010010;6: ledout<=7'b0000010;7: ledout<=7'b1111000;8: ledout<=7'b0000000;9: ledout<=7'b0010000;default:ledout<=7'b1000000;endcase endendmodule仿真波型:·五、心得体会虽然我以前上了Verilog HDL语言,但是这都实习中还是碰到了一些问题,通过向老师,向同学寻求帮助和在网上,在图书馆查找相关的资料来一点点解决遇到的问题,从中感觉自己对VHDL语言的理解又进了一步!对硬件描述语言和纯元件语言,如c语言之间的差别又有了更深一层次的理解,不过自我感觉想要对VHDL 语言要很熟练的掌握的话,还需要多多的联系才行的。
(完整word版)数字钟verilog(word文档良心出品)
目录1 设计任务及要求 (1)2 总体设计分析 (1)3 各模块设计 (2)3.1 数字钟主体部分 (2)3.1.1小时计数器 (2)3.1.2 分、秒计数器 (3)3.2 分频部分 (4)3.3 秒表模块 (5)3.4 闹钟模块 (5)3.5 时间设置模块 (7)3.6 报时模块 (7)3.7 控制显示模块 (8)3.8 顶层模块 (11)4 总结 (11)4.1 本次作业遇到的问题 (11)4.2 建议和总结 (12)附件 (13)1 设计任务及要求本次大作业的要求为设计一个多功能数字钟,其具体要求如下:1.有基础的实时数字钟显示功能,即时、分、秒的正常显示模式,并且在此基础上增加上,下午显示。
2.手动校准。
按动方式键,将电路置于校时状态,则计时电路可用手动方式校准,每按一下校时键,时计数器加1;按动方式键,将电路置于校分状态,以同样方式手动校分。
3.整点报时,仿中央人民广播电台整点报时信号,从59分50秒起每隔2秒发出一次低音“嘟”信号(信号鸣叫持续时间1S,间隙时间1S)连续5次,到达整点(00分00秒时),发一次高音“哒”信号(信号持续时间1S)。
4.闹时功能,按动方式键,使电路工作于预置状态,此时显示器与时钟脱开,而与预置计数器相连,利用前面手动校时,校分方式进行预置,预置后回到正常模式。
当计时计至预置的时间时,扬声器发出闹铃信号,时间为半分钟,闹铃信号可以用开关“止闹”,按下此开关后,闹铃声立刻中止,正常情况下应将此开关释放,否则无闹时作用。
5.秒表功能。
按start键开始计秒,按stop键停止计秒并保持显示数不变,直到复位信号加入。
2 总体设计分析设计的总体部分按照要求可以分为基本的数字时钟显示、手动校准、整点报时、闹钟功能和秒表功能5大部分。
其总体设计框图如下:图1 总体设计框图其中整点报时跟闹钟部分要求不同频率的声响,所以需要加入分频器模块将输入的1kHZ的分频产生500HZ及1HZ的方波信号,其中1HZ的信号对应1S 的周期,可以用作时钟秒的显示及秒表部分。
基于FPGA的数字时钟设计设计
基于FPGA的数字时钟设计设计设计(论文)题目:基于FPGA的数字时钟设计毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日摘要随着科学技术的飞速发展,系统向着高速度、低功耗、低电压和网络化、移动化方向发展,各个领域对电路的要求越来越高,传统单一功能的电路很难满足发展的要求,而可编程逻辑器件(CPLD/FPGA)可以很方便地通过对逻辑结构的修改和配置,完成对系统和设备的升级。
基于FPGA的数字时钟设计毕业设计论文
摘要之阿布丰王创作本设计为一个多功能的数字时钟,具有时、分、秒计数显示功能,以24小时循环计数;具有校对功能. 本设计采纳EDA技术,以硬件描述语言Verilog HDL为系统逻辑描述语言设计文件,在QUARTUSII工具软件环境下,采纳自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟.系统由时钟模块、控制模块、计时模块、数据译码模块、显示以及组成.经编译和仿真所设计的法式,在可编程逻辑器件上下载验证,本系统能够完成时、分、秒的分别显示,按键进行校准,整点报时,闹钟功能.关键词:数字时钟,硬件描述语言,Verilog HDL,FPGAAbstractThe design for a multi-functional digital clock, with hours, minutes and seconds count display to a 24-hour cycle count; have proof functions function. The use of EDA design technology, hardware-description language VHDL description logic means for the system design documents, in QUAETUSII tools environment, a top-down design, by the various modules together build a FPGA-based digital clock. The main system make up of the clock module, control module, time module, data decoding module, display and broadcast module. After compiling the design and simulation procedures, the programmable logic device to download verification, the system can complete the hours, minutes and seconds respectively, using keys to cleared , to calibrating time. And on time alarm and clock for digital clock.Keywords:digital clock,hardware description language,Verilog HDL,FPGA目录第一章绪论1.1.选题意义与研究现状在这个时间就是金钱的年代里,数字电子钟已成为人们生活中的必需品.目前应用的数字钟不单可以实现对年、月、日、时、分、秒的数字显示,还能实现对电子钟所在地址的温度显示和智能闹钟功能,广泛应用于车站、医院、机场、码头、茅厕等公共场所的时间显示.随着现场可编程门阵列( field program-mable gate array ,FPGA) 的呈现,电子系统向集成化、年夜规模和高速度等方向发展的趋势更加明显, 作为可编程的集成度较高的ASIC,可在芯片级实现任意数字逻辑电路,从而可以简化硬件电路,提高系统工作速度,缩短产物研发周期.故利用 FPGA这一新的技术手段来研究电子钟有重要的现实意义.设计采纳FPGA现场可编程技术,运用自顶向下的设计思想设计电子钟.防止了硬件电路的焊接与调试,而且由于FPGA的 I /O 端口丰富,内部逻辑可随意更改,使得数字电子钟的实现较为方便.本课题使用Cyclone EP1C6Q240的FPGA器件,完成实现一个可以计时的数字时钟.该系统具有显示时、分、秒,智能闹钟,按键实现校准时钟,整点报时等功能.满足人们获得精确时间以及时间提醒的需求,方便人们生活.1.2.国内外研究及趋势随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多.二十一世纪的今天,最具代表性的计时产物就是电子时钟,它是近代世界钟表业界的第三次革命.第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产物就是带有摆或摆轮游丝的机械钟或表.第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级.第三次革命就是单片机数码计时技术的应用,使计时产物的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期的显示功能,它更符合消费者的生活需求!因此,电子时钟的呈现带来了钟表计时业界跨跃性的进步.我国生产的电子时钟有很多种,总体上来说以研究多功能电子时钟为主,使电子时钟除原有的显示时间基本功能外,还具有闹铃,报警等功能.商家生产的电子时钟更从质量,价格,实用上考虑,不竭的改进电子时钟的设计,使其更加的具有市场.1.3.论文结构第一章详细论述了近些年来,数字化时钟系统研究领域的静态及整个数字化时钟系统的发展状况,同时分析了所面临的问题与解决方案,从而提出了本论文的研究任务.第二章从研究任务着手,选择符合设计要求的经常使用芯片及其它元器件,详细论述了各接口电路的设计与连接,以模块化的形式,整合数字化时钟硬件的设计从小到年夜,从局部到整体,循序渐进,最终实现一个功能齐全的数字化时钟系统.第三章根据系统设计要求,着手对数字化时钟系统软件进行功能的实现,将各功能模块有机结合,实现时钟走时,实现闹铃、整点报时附加功能.第四章依照设计思路,在联机调试过程中,对时钟系统的缺乏和缺点进行分析,将调试过程作重点的记录.第五章对全文的总结,对本系统功能实现以及制作过程中需要注意的方面,及整个系统软件编写中所吸取的经验教训进行论述,同时,也对整个研究应用进行展望.第二章编程软件及语言介绍2.1Quarters II编程环境介绍运行环境设计采纳quartus II软件实现,因此针对软件需要用到的一些功能在这里进行描述.Quartus II软件界面简单易把持,如下图2.1:图2.1Quartus II软件界面图2.1.1菜单栏1)【File】菜单Quartus II的【 File】菜单除具有文件管理的功能外,还有许多其他选项图2.2Quartus II菜单栏图(1)【New 】选项:新建工程或文件,其下还有子菜单【New Quartus II Project】选项:新建工程.【Design File】选项:新建设计文件,经常使用的有:AHDL文本文件、VHDL文本文件、Verilog HDL文本文件、原理图文件等.【Vector Waveform Five】选项:矢量波形文件.(2)【Open】选项:翻开一个文件.(3)【New Project Wizard 】选项:创立新工程.点击后弹出对话框.单击对话框最上第一栏右侧的“…”按钮,找到文件夹已存盘的文件,再单击翻开按钮,既呈现如图所示的设置情况.对话框中第一行暗示工程所在的工作库文件夹,第二行暗示此项工程的工程名,第三行暗示顶层文件的实体名,一般与工程名相同.图2.3Quartus II新建工程图(4)【creat /update】选项:生成元件符号.可以将设计的电路封装成一个元件符号,供以后在原理图编纂器下进行条理设计时调用.2)【View】菜单:进行全屏显示或对窗口进行切换,包括条理窗口、状态窗口、消息窗口等.图2.4Quartus II菜单栏全屏切换图3)【Assignments】菜单(1)【Device】选项:为以后设计选择器件.(2)【Pin】选项:为以后条理树的一个或多个逻辑功能块分配芯片引脚或芯片内的位置.(3)【Timing Ananlysis Setting】选项:为以后设计的 tpd、tco、tsu、fmax 等时间参数设按时序要求.(4)【EDA tool setting】选项:EDA 设置工具.使用此工具可以对工程进行综合、仿真、时序分析,等等.EDA 设置工具属于第三方工具.(5)【Setting】选项:设置控制.可以使用它对工程、文件、参数等进行修改,还可以设置编译器、仿真器、时序分析、功耗分析等.(6)【assignment editor】选项:任务编纂器.(7)【pin planner 】选项:可以使用它将所设计电路的 I/O 引脚合理的分配到已设定器件的引脚上.图2.5Quartus II菜单栏设定引脚下拉图4)【processing】菜单【processing】菜单的功能是对所设计的电路进行编译和检查设计的正确性. (1)【Stop process】选项:停止编译设计项目.(2)【Start Compilation】选项:开始完全编译过程,这里包括分析与综合、适配、装配文件、按时分析、网表文件提取等过程.(3)【analyze current file】选项:分析以后的设计文件,主要是对以后设计文件的语法、语序进行检查.(4)【compilation report】选项:适配信息陈说,通过它可以检查详细的适配信息,包括设置和适配结果等.(5)【start simulation】选项:开始功能仿真.(6)【simulation report】选项:生胜利能仿真陈说.(7)【compiler tool】选项:它是一个编译工具,可以有选择对项目中的各个文件进行分别编译.(8)【simulation tool】选项:对编译过电路进行功能仿真和时序仿真. (9)【classic timing analyzer tool】选项:classic时序仿真工具.(10)【powerplay power analyzer tool】选项:PowerPlay 功耗分析工具.图2.6Quartus II菜单栏运行下拉图5)【tools】菜单【tools 】菜单的功能是(1)【run EDA simulation tool 】选项:运行EDA仿真工具,EDA是第三方仿真工具.(2)【run EDA timing analyzer tool 】选项:运行EDA时序分析工具,EDA 是第三方仿真工具.(3)【Programmer 】选项:翻开编程器窗口,以便对Altera 的器件进行下载编程.图2.7Quartus II仿真菜单下拉图2.1.2工具栏工具栏紧邻菜单栏下方,它其实是各菜单功能的快捷按钮组合区.2.8Quartus II菜单栏图图2.9Quartus II菜单栏按键功能图2.1.3功能仿真流程1、新建仿真文件图2.10Quartus II菜单栏新建文件夹图2、功能方正把持在菜单上点processing在下拉菜单中,如下图:图2.11Quartus II菜单栏processing下拉图2.2Verilog HDL语言介2.2.1什么是verilog HDL语言Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种笼统设计条理的数字系统建模.被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间.数字系统能够按条理描述,并可在相同描述中显式地进行时序建模.Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包括响应监控和设计验证方面的时延和波形发生机制.所有这些都使用同一种建模语言.另外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行.Verilog HDL语言不单界说了语法,而且对每个语法结构都界说了清晰的模拟、仿真语义.因此,用这种语言编写的模型能够使用Ve rilog仿真器进行验证.语言从C编程语言中继承了多种把持符和结构.Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解.可是,Verilog HDL语言的核心子集非常易于学习和使用,这对年夜大都建模应用来说已经足够.固然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述.2.2.2主要功能下面列出的是Verilog硬件描述语言的主要能力:●基本逻辑门,例如and、or和nan d等都内置在语言中.●用户界说原语(UP)创立的灵活性.用户界说的原语既可以是组合逻辑原语,也可以是时序逻辑原语.●开关级基本结构模型,例如pmos和nmos等也被内置在语言中.●提供显式语言结构指定设计中的端口到端口的时延及路径时延和设计的时序检查.●可采纳三种分歧方式或混合方式对设计建模.这些方式包括:行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模.●Verilog HDL中有两类数据类型:线网数据类型和寄存器数据类型.线网类型暗示构件间的物理连线,而寄存器类型暗示笼统的数据存储元件.●能够描述条理设计,可使用模块实例结构描述任何条理.●设计的规模可以是任意的;语言分歧毛病设计的规模(年夜小)施加任何限制.●Verilog HDL不再是某些公司的专有语言而是IEEE标准.●人和机器都可阅读Verilog语言,因此它可作为EDA的工具和设计者之间的交互语言.●Verilog HDL语言的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展.PLI是允许外部函数访问Verilog模块内信息、允许设计者与模拟器交互的例程集合.●设计能够在多个条理上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级,包括进程和队列级.●能够使用内置开关级原语在开关级对设计完整建模.●同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定.●Verilog HDL能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示.这些值也能够用于与期望值比力,在不匹配的情况下,打印陈说消息.●在行为级描述中,Verilog HDL不单能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述.●能够使用门和模块实例化语句在结构级进行结构描述.●如图显示了Verilog HDL的混合方式建模能力,即在一个设计中每个模块均可以在分歧设计条理上建模.●Verilog HDL还具有内置逻辑函数,例如&(按位与)和|(按位或).●对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用.●可以显式地对并发和按时进行建模.●提供强有力的文件读写能力.●语言在特定情况下是非确定性的,即在分歧的模拟器上模型可以发生分歧的结果;例如,事件队列上的事件顺序在标准中没有界说.图2.12混合设计条理图第三章数字化时钟系统硬件设计3.1系统核心板电路分析本系统采纳的开发平台标配的核心板是QuickSOPC,可以实现EDA、SOP 和DSP的实验及研发.本系统采纳QuickSOPC标准配置为Altera公司的EP1C6Q240C8芯片.(1)核心板的硬件资源核心板采纳4层板精心设计,采纳120针接口.QuickSOPC核心板的硬件原图3.1QuickSOPC硬件方块图(2)FPGA电路核心板QuickSOPC上所用的FPGA为Altera公司Cyclone系列的EP1C6Q240.EP1C6Q240包括有5980个逻辑单位和92Kbit的片上RAM.EP1C6Q240有185个用户I/O口,封装为240-Pin PQFP.核心板EP1C6Q240器件特性如表2-1.表3-1核心EP1C6Q240器件特性:特性核心板EP1C6Q240器件逻辑单位(LE)5980M4K RAM 块20RAM总量(bit)92160PLL(个) 2185最年夜用户I/O数(个)1167216配置二进制文件(.rbf)年夜小(bit)可选串行主动配置器件EPCS1/ EPCS4/ EPCS16(3)配置电路Cyclone FPGA的配置方式包括:主动配置模式、主动配置模式以及JTAG配置模式.本系统采纳的是JTAG配置模式下载配置数据到FPGA.通过JTAG结果,利用Quartus II软件可以直接对FPGA进行独自的硬件重新配置.Quartus II软件在编译时会自动生成用于JTAG配置的.sof文件.Cyclone FPGA设计成的JTAG指令比其他任何器件把持模式的优先级都高,因此JTAG配置可随时进行而不用等候其他配置模式完成.JTAG模式使用4个专门的信号引脚:TDI、TDO、TMS以及TCK.JTAG的3个输入脚TDI、TMS 和TCK具有内部弱上拉,上拉电阻年夜约为25kΩ.在JGTA进行配置的时候,所有用户I/O扣都为高阻态.(4)时钟电路FPGA内部没振荡电路,使用有源晶振是比力理想的选择.EP1C6Q240C8的输入的时钟频率范围为15.625~387MHz,经过内部的PLL电路后可输出15.625~275MHz的系统时钟.当输入时钟频率较低时,可以使用FPGA的内部PLL 调整FPGA所需的系统时钟,使系统运行速度更快.核心板包括一个48MHz的有源晶振作为系统的时钟源.如图2-2所示.为了获得一个稳定、精确的时钟频率,有源晶振的供电电源经过了LC滤波.本系统硬件整体设计框图如图2-3所示:图3.2数字时钟系统硬件电路总体框图3.2系统主板电路分析3.2.1时钟模块电路FPGA内部没振荡电路,使用有源晶振是比力理想的选择.EP1C6Q240C8的输入的时钟频率范围为15.625~387MHz,经过内部的PLL电路后可输出15.625~275MHz的系统时钟.当输入时钟频率较低时,可以使用FPGA的内部PLL 调整FPGA所需的系统时钟,使系统运行速度更快.核心板包括一个50MHz的有源晶振作为系统的时钟源.为了获得一个稳定、精确的时钟频率,有源晶振的供电电源经过了LC滤波.图3.3系统时钟电路图3.2.2显示电路由于本设计需要显示时间信息包括:时、分、秒,显所以采纳主板上七段数码管显示电路与系统连接实现显示模块的功能.主板上七段数码管显示电路如图2-4 所示,RP4和 RP6 是段码上的限流电阻,位码由于电流较年夜,采纳了三极管驱动.图3.4七段数码管显示电路图数码管 LED显示是工程项目中使用较广的一种输出显示器件.罕见的数管有共阴和共阳 2 种.共阴数码管是将 8 个发光二极管的阴极连接在一起作为公共端,而共阳数码管是将 8 个发光二极管的阳极连接在一起作为公共端.公共端常被称作位码,而将其他的 8 位称作段码.如图 2-5所示为共阳数码管及其电路,数码管有 8 个段分别为:h、g、f、e、d、c、b 和a(h 为小数点) ,只要公共端为高电平“1” ,某个段输出低电平“0”则相应的段就亮.图3.5七段数码管显示电路图从电路可以看出,数码管是共阳的,当位码驱动信号为 0时,对应的数码管才华把持;当段码驱动信号为 0 时,对应的段码点亮.3.2.3键盘控制电路键盘控制电路要实现时钟系统调时的功能和闹铃开关的功能.本设计采纳主板上的自力键盘来实现这两个功能.当键盘被按下是为“0”,未被按下是为“1”.电路连接图如图2-6所示.电路中为了防止FPGA的I/O设为输出且为高电平在按键下直接对地短路,电阻RP9、RP10对此都能起到呵护作用.图3.6 键盘电路图3.2.4蜂鸣电路设计如图2-7所示,蜂鸣器使用 PNP三极管进行驱动控制,蜂鸣器使用的是交流蜂鸣器.当在BEEP输入一定频率的脉冲时,蜂鸣器蜂鸣,改变输入频率可以改变蜂鸣器的响声.因此可以利用一个PWM 来控制BEEP,通过改变PWM 的频率来获得分歧的声响,也可以用来播放音乐.若把 JP7断开,Q4 截止,蜂鸣器停止蜂鸣.图3.7蜂鸣电路图第四章数字化时钟系统软件设计4.1整体方案介绍4.1.1整体设计描述设计中的数字时钟,带有按键校准,定点报时,数码管显示等功能.因此数字时钟所包括的模块可分为,分频模块,按键模块,计时校准模块,闹钟模块,LED显示模块,模块之间的关系下图:图4.1整体模块框图针对框图流程,设定出各个模块的需求:1、分频电路:针对计时器模块与闹钟设定模块的需求,可以知道分频模块需要生成一个1Hz的频率信号,确保计时模块可以正常计数.2、计时器模块:计数模块的作用是收到分频模块1Hz频率的信号线,能进行正确计时,而且可以通过按键进行时间的修改,且当整点时,给蜂鸣器发生使能信号,进行整点报时,播放音乐.3、闹钟设定模块:可根据按键的设定闹钟的时间,当计时模块的时间与闹钟设定模块的时间相等的时候,给蜂鸣器一个使能信号,蜂鸣器闹铃..4、蜂鸣器模块:根据计时模块,闹钟模块给出的使能信号,判定蜂鸣器是整点报时,还是闹钟响铃.整点报时会播放音乐,闹钟时嘀嘀嘀报警.5、LED显示模块:根据实际的需求显示计时模块的时间,还是闹钟设定模块的时间,8个七段码LED数码管,进行扫描方式显示数据.4.1.2整体信号界说对整个模块进行信号界说.接口及寄存器界说module clock(clk,key,dig,seg,beep);// 模块名 clockinput clk; // 输入时钟input [4:0] key; //输入按键,key[3:0]分别为秒,分钟,小时的增加按键.Key[4]为闹钟设置按键,key[5]为校准设置按键.output [7:0] dig; // 数码管选择输出引脚 aoutput [7:0] seg; // 数码管段输出引脚output beep; //蜂鸣器输出端reg [7:0] seg_r = 8'h0; //界说数码管输出寄存器reg [7:0] dig_r; //界说数码管选择输出寄存器reg [3:0] disp_dat; // 界说显示数据寄存器reg [8:0] count1; //界说计数寄存器reg [14:0] count; //界说计数中间寄存器reg [23:0] hour = 24'h235956; // 界说现在时刻寄存器reg [23:0] clktime = 24'h000000; //界说设定闹钟reg [1:0] keyen = 2'b11; // 界说标识表记标帜位reg [4:0] dout1 = 5'b11111;reg [4:0] dout2 = 5'b11111;reg [4:0] dout3 = 5'b11111; // 寄存器wire [4:0] key_done; // 按键消抖输出reg [15:0] beep_count = 16'h0; //蜂鸣器寄存器reg [15:0] beep_count_end = 16'hffff; //蜂鸣器截止寄存器reg clktime_en = 1'b1; //闹钟使能寄存器reg sec ; //1秒时钟reg clk1; //1ms时钟reg beep_r; //寄存器wire beepen; //闹钟使能信号4.1.3模块框图通过quartus II的creat symble for current file功能生成框图如下:图4.2生成的符号图分频模块实现,计数电路所需时钟信号为1HZ,而系统时钟为48MHZ,所以要对系统时钟进行分频以来满足电路的需要.4.2分频模块实现4.2.1分频模块描述对分频模块,关键是生成个1Hz的时钟信号.考虑到仿真的需要,模块中间生成1个1kHz的时钟信号.1Hz的信号的发生用来发生时钟的秒脉冲,框图如下图4.2:图4.3分频模块图4.2.2分频模块设计本系统法式设计时钟的准确与否主要取决于秒脉冲的精确度.为了保证计时准确,我们对系统时钟48MHz进行了48000分频生成1kHz信号clk1,在通过1kHz信号,生成1Hz信号clk.//1ms信号发生部份always @(posedge clk) // 界说 clock 上升沿触发begincount = count + 1'b1;if(count == 15'd24000) //0.5mS到了吗?begincount = 15'd0; //计数器清零clk1 = ~clk1; //置位秒标识表记标帜endend//秒信号发生部份always @(posedge clk1) // 界说 clock 上升沿触发begincount1 = count1 + 1'b1;if(count1 == 9'd500) //0.5S到了吗?begincount1 = 9'd0; //计数器清零sec = ~sec; //置位秒标识表记标帜endEnd4.2.3分频模块仿真通过设置功能仿真,检查代码的正确性5仿真结果图4.4分频模块波形仿真图右上图可以知道,计数寄存器count累加到23999时,重新酿成0,共计数了24000个值.触发clk1跳变,使得count1加一,count1累加到499的时候,下一个数据为0,共技术500个值.所以,sec信号的频率为1Hz,满足设计要求.5.1计时模块实现5.1.1计时模块描述与实现计时模块是采纳16进制来实现的,将hour[23,0]界说为其时分秒,其中hour[3,0]为其秒钟上的个位数值,hour[4,7]为其秒钟上的十位数值,以此类推分钟、时钟的个位和十位.当clk脉冲过来时,秒个位hour[3,0]便开始加1,当加到9时,秒十位加1,与此同时秒个位清零,继续加1.当秒十位hour[7,4]为5秒个位为9时(即59秒),分个位hour[11,8]加1,与此同时秒个位和秒十位都清零.以此类推,当分十位hour[15,12]为5和分个位为9时(即59分),时个位加1,与此同时分个位hour[19,16]和分十位都清零.那时分十位[23,20]为2和分个位为4,全部清零,开始重新计时.从功能上讲分别为模60计数器,模60计数器和模24计数器.//时间计算及校准部份always @(negedge sec)//计时处置beginhour[3:0] = hour[3:0] + 1'b1;//秒加 1if(hour[3:0] >= 4'ha)//加到10,复位beginhour[3:0] = 4'h0;hour[7:4] = hour[7:4] + 1'b1;// 秒的十位加一if(hour[7:4] >= 4'h6)//加到6,复位beginhour[7:4] = 4'h0;hour[11:8] = hour[11:8] + 1'b1;//分个位加一if(hour[11:8] >= 4'ha)//加到10,复位beginhour[11:8] = 4'h0;hour[15:12] = hour[15:12] + 1'b1;//分十位加一if(hour[15:12] >= 4'h6)//加到6,复位beginhour[15:12] = 4'h0;hour[19:16] = hour[19:16] + 1'b1;//时个位加一if(hour[19:16] >= 4'ha)//加到10,复位beginhour[19:16] = 4'h0;hour[23:20] = hour[23:20] + 1'b1;//时十位加一endif(hour[23:16] >= 8'h24)//加到24,复位hour[23:16] = 8'h0;endendendendendend5.1.2计时模块仿真对计时模块进行仿真,记录仿真波形图4.5计时模块仿真图由上图可见,当sec信号下降沿跳变时,hour寄出去会加1,也就相当于跳了一秒钟时间.当hour的时间为235959是,下一个计数器的值为000000,hour寄存器归零,相当于三更0点的时刻.仿真的结果达到预期,通过.5.2按键处置模块实现5.2.1按键处置模块描述框图如下图4.4:图4.6按键控制功能图模块讲计时部份和时间调整部份整合到一起,正常态的时候,时间正常运行,当key[5]被按下时,进入时间校准,可以通过key[2:0]三个键,分别对秒,分,时进行加1把持,从而进行时间校准.当key[3]被按下时,进入闹钟设定,可以通过key[2:0]三个键,分别对秒,分,时进行加1把持,从而进行闹钟的设定.图4.7按键模块仿真图通过按键key进行仿真控制,可以发现clktime会随着按键的按下,分别有时钟,分钟秒钟加1,仿真结果满足设计要求.5.2.2按键去抖处置模块设计按键模块实现去抖处置,及乒乓按键设计,确保后面的计时模块与闹钟模块的功能实现.assign key_done = key|dout3; // 按键消抖输出always @(posedge count1[5]) //按键去噪声begindout1 <= key;dout2 <= dout1;dout3 <= dout2; //连续赋值endalways @(negedge key_done[4])beginkeyen[1] = ~keyen[1]; //校准按键转换乒乓按键endalways @(negedge key_done[3])beginkeyen[0] = ~keyen[0]; //按时按键转换乒乓按键End5.2.3按键模块去抖仿真对按键去颤动仿真,同样才用功能仿真方式,这里不再重复设置与把持,如同上面的分频模块进行设置并进行仿真.Key寄存器为输入按键,初始化电路为高电平,当有按键按下去的时候,酿成低电平.因此改变key的值,观察仿真结果是否正确.功能仿真,记录仿真结果,如下图:图4.8按键模块仿真图通过上图可以知道,key_done会随着key的变动而发生相应的变动,并有消除噪声的作用,功能仿真正确,达到设计目的.5.3闹钟模块实现5.3.1闹钟模块设计本设计中,判断闹铃时间到,是通过判按时钟系统实时时间的时钟与分钟是否分别即是设定的闹铃时间的时钟、分钟、秒钟.那时间(hour[23:0])即是设定的闹钟时间(clktime[23:0])时,闹钟触发时,播放嘀嘀嘀报警声,闹钟会响10秒的时间(clktime[23:0]+10 >=hour[23:0]).正常情况下,闹铃时间到会进行为时1分钟的蜂鸣报时,可以通过按下闹钟按键key[3]使其停止.当闹铃设置为整点是,会先进行整点报时,然后进入闹铃.图4.9闹钟控制键功能图5.3.2闹钟设定模块仿真图4.10闹钟模块仿真图通过按键key进行仿真控制,可以发现clktime会随着按键的按下,分别有时钟,分钟秒钟加1,仿真结果满足设计要求.5.4蜂鸣器模块实现5.4.1蜂鸣器模块描述蜂鸣器模块负责整点报时,和闹铃的时候进行作声的作用.整点报时的时候,播放音乐,10秒音乐播报完后停止整点报时.闹钟触发时,播放嘀嘀嘀报警声.当闹铃设置为整点是,会先进行整点报时,然后进入闹铃.当闹钟设定键被按下,响起的蜂鸣声会被屏蔽.模块框图如下图4.9:5.4.2蜂鸣器模块实现//蜂鸣器的计数按时器always@(posedge clk)。
veriloghdl rnmos用法
veriloghdl rnmos用法在Verilog HDL中,rnmos(或称为"resistor-connected NMOS")是一种常见的电子元件,它表示一个NMOS晶体管,其栅极通过电阻与外部电压源相连。
这种元件通常用于模拟电路和数字电路的设计中。
在Verilog HDL中,rnmos的用法可以通过以下方式描述:verilogmodule rnmos (input wire gate, // 栅极输入input wire drain, // 漏极输入output wire source // 源极输出);// 定义内部电阻值parameter RESISTOR_VALUE = 1000; // 假设电阻值为1000欧姆// 内部电路模型NMOS transistor (.gate(gate), // 栅极连接.drain(drain), // 漏极连接.source(source) // 源极连接);endmodule上述代码定义了一个名为rnmos的模块,它具有一个栅极输入(gate),一个漏极输入(drain),以及一个源极输出(source)。
模块内部使用了一个NMOS晶体管来模拟rnmos的行为。
通过调整参数RESISTOR_VALUE,可以设置内部电阻的值。
在实际使用中,可以将这个模块实例化并连接到其他电路中。
例如:verilogmodule my_circuit (input wire clk, // 时钟输入input wire rst_n, // 复位输入(低电平有效)output reg out // 输出信号);// 实例化 rnmos 模块rnmos rnmos1 (.gate(clk), // 时钟信号作为栅极输入.drain(out), // 输出信号作为漏极输入.source(0) // 将源极直接连接到地(0));// 其他电路代码...endmodule。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学考试答题纸(以论文、报告等形式考核专用)二○18 ~二○19 学年度第一学期课程编1602080001 评分刘春平课程名称主讲教师硬件描述语言与逻辑综合号学电子科学与技术16级1班姓名李思豪专业年级号设计的数字时钟Verilog HDL基于题目:摘要:本文利用V erilog HDL语言自顶向下的设计方法设计多功能数字钟,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过Altera QuartusⅡ6.0和cyclnoe IIEP2C35F672C6完成综合、仿真。
此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中关键词:Verilog HDL;硬件描述语言;FPGA1目录一、实验任务 (3)实验目的 (3)实验要求 (3)二、设计思路 (3)三、实验结果 (10)四、总结与收获 (14)2一、实验任务实验目的1.深入了解基于quartus ii工具的复杂时序逻辑电路的设计。
理解并熟练利用EDA工具进行综合设计。
2.熟练掌握芯片烧录的流程及步骤。
3.掌握Verilog HDL 语言的语法规范及时序电路描述方法。
4.实验要求设计一个带秒表功能的24 小时数字钟,它包括以下几个组成部分:①显示屏,由6 个七段数码管组成,用于显示当前时间(时:分,秒)或设置的秒表时间;②复位键复位所有显示和计数③设置键,用于确定新的时间设置,三个消抖按键分别用于时分秒的设置④秒表键,用于切换成秒表功能基本要求(1) 计时功能:这是本计时器设计的基本功能,每隔一秒计时一次,并在显示屏上显示当前时间。
(2) 秒表功能:设置时间,进行倒计时功能(3) 设置新的计时器时间:按下设置键后,用户能通过时分秒三个消抖按键对时间进行设置。
二、设计思路、总原理框图:13原理如上图所示,时钟由分频器模块,数码管显示模块,计时器模块三个模块构成,每个模块实现如下的不同功能,最后通过在顶层模块的调用,来实现时钟功能。
2.顶层模块:顶层模块调用三个字模块,并且定义输入输出口,代码输入所示:modulemyclock2(daojishi,stop,clk,reset,shi,fen,miao,miaoout1,miaoout2,fenout1,fenout2,shiout1,shiout2); input clk,reset,stop,shi,fen,miao,daojishi;output[6:0] miaoout1,miaoout2,fenout1,fenout2,shiout1,shiout2;wire[3:0] miao1,miao2,fen1,fen2,shi1,shi2;wire clk_1hz;divider_1HZ divider1hz(clk_1hz,reset,clk);count count1(daojishi,shi,fen,miao,stop,miao1,miao2,fen1,fen2,shi1,shi2,reset,clk_1hz);decode4_7 d0(miaoout1,miao1);decode4_7 d1(miaoout2,miao2);decode4_7 d2(fenout1,fen1);decode4_7 d3(fenout2,fen2);decode4_7 d4(shiout1,shi1);decode4_7 d5(shiout2,shi2);endmodule输入输出端口类型功能表:input秒表倒计时模input暂停按input晶振脉input复位按input小时调节按input分钟调节按input 秒调节按output秒个位数码管输output秒十位数码管输output分个位数码管输output分十位数码管输output时个位数码管输output时十位数码管输三个子模块的原理和代码:(1)分频模块:分频模块的作用主要是要获得各种频率的时钟信号。
输入信号27MHZ的信号,要想获得1HZ的信号作为秒脉冲计时,则要对27MHZ信号分频。
通过计数4的方式,当计数从0开始到13999999时,1HZ信号取反一次,计数又从0开始,如此循环,就可以得到1HZ脉冲信号。
对于其他信号也是如此,只是计数值不一样,得到的分频信号不同。
模块代码如下:module divider_1HZ(clk_1hz,reset,clk);output clk_1hz;input reset,clk;reg clk_1hz;reg[23:0] count;always @(posedge clk)beginif(reset)begincount<=0;clk_1hz<=0;endelsebeginif(count==13499999)begincount<=0;clk_1hz<=~clk_1hz;endelsecount<=count+1;//计数endendendmodule(2)译码显示模块:一、数码管显示:通过传入响应的十进制数,运用case语句转换输出相应的7位二进制显示码,送入数码管显示。
代码如下:module decode4_7(temp,indec);output[6:0] temp;input[3:0] indec;reg[6:0] temp;always @(indec)begincase(indec) //用case 语句进行译码4'd0:temp[6:0]=7'b1000000;4'd1:temp[6:0]=7'b1111001;4'd2:temp[6:0]=7'b0100100;4'd3:temp[6:0]=7'b0110000;54'd4:temp[6:0]=7'b0011001;4'd5:temp[6:0]=7'b0010010;4'd6:temp[6:0]=7'b0000010;4'd7:temp[6:0]=7'b1111000;4'd8:temp[6:0]=7'b0000000;4'd9:temp[6:0]=7'b0010000;default: temp=7'bz;endcaseendendmodule(3)、计时器模块:秒计数:在1HZ脉冲下进行秒计时,当计时达到59秒后,在下一个脉冲来临变0,并发出一个脉冲信号,可供下面分钟计数作为输入脉冲信号计时。
分钟计数:在输入脉冲下,分钟开始计时,当计时达到59后,在下一个脉冲来临变0,并发出一个脉冲,供小时计数的输入脉冲新号。
小时计数:脉冲信号来临时,计数加1,达到23后在下一个脉冲的作用下清零,从新计时。
如果有复位信号,则时分秒全部清零。
计时器模块还包含了设置时间和秒表切换的功能部分代码如下:module count(daojishi,shi,fen,miao,stop,miao1,miao2,fen1,fen2,shi1,shi2,reset,clk_1hz);input reset,clk_1hz,stop,daojishi;input shi,fen,miao;output miao1,miao2,fen1,fen2,shi1,shi2;reg[3:0] miao1,miao2,fen1,fen2,shi1,shi2;always @(posedge clk_1hz)beginif(reset)beginmiao1<=0;miao2<=0;fen1<=0;fen2<=0;shi1<=0;shi2<=0;endif(stop==1)begin //秒调节if(miao==0)beginmiao1<=miao1+1;if(miao1==9)beginmiao1<=0;miao2<=miao2+1;if(miao2==5)begin6miao2<=0;endendendif(fen==0) //分调节beginfen1<=fen1+1;if(fen1==9)beginfen1<=0;fen2<=fen2+1;if(fen2==5)beginfen2<=0;endendendif(shi==0) //时调节beginshi1<=shi1+1;if(shi1==9||((shi1==3)&&(shi2==2)))beginshi1<=0;shi2<=shi2+1;if(shi2>=2)beginshi2<=0;endendendendif((!reset)&&(stop==0))beginif(daojishi==0) //时钟程序beginmiao1<=miao1+1;if(miao1==9)begin7miao1<=0;miao2<=miao2+1;if(miao2==5)beginmiao2<=0;fen1<=fen1+1;if(fen1==9)beginfen1<=0;fen2<=fen2+1;if(fen2==5)beginfen2<=0;shi1<=shi1+1;if((shi1==9)||((shi1==3)&&(shi2==2)))beginshi1<=0;shi2<=shi2+1;if(shi2==2)beginshi2<=0;endendendendendendendelse //倒计时程序beginif(!((shi1==0)&&(shi2==0)&&(fen1==0)&&(fen2==0)&&(miao2==0)&&(miao1==0)))beginmiao1<=miao1-1;if(miao1==0)beginmiao1<=9;miao2<=miao2-1;if(miao2==0)beginmiao2<=5;fen1<=fen1-1;if(fen1==0)begin8fen1<=9;fen2<=fen2-1;if(fen2==0)beginfen2<=5;shi1<=shi1-1;if(shi1==0)beginshi1<=9;shi2<=shi2-1;if(shi2==0)beginshi2<=0;endendendendendendendendendendendmodule93.引脚排布:如下所示:引脚分布图二、实验结果)波形仿真(1 Quartus II中利用仿真波形进行功能或时序仿真的基本步骤如下:在. *.vwf)(1)创建新的矢量波形文件()添加输入、输出节点。