1课程设计基于VerilogHDL的数字秒表设计系别:物理与电气工程学院专业:微电子学班级:2班成员:2目录一、前言…………………………………………………………………………………………………………………3二、实验目的………………………………………………………………………………………………………….3三、功能设计…………………………………………………………………………………………………………3四、用Verilog描述电路……………………………………………………………………………………….44.1时钟调校及计时模块……………………………………………………………………………………44.2整数分频模块………………………………………………………………………………………………..84.3时钟信号选择模块………………………………………………………………………………………84.4七段显示设置………………………………………………………………………………………………114.4.1BCD码显示模块……………………………………………………………………………………114.4.2二位七段显示模块………………………………………………………………………………124.4.3一位七段显示模块………………………………………………………………………………124.5顶层模块实现…………………………………………………………………………………………14五、模拟与仿真…………………………………………………………………………………………………..15六、逻辑综合……………………………………………………………………………………………………….16七、下载到硬件电路……………………………………………………………………………………………16八、总结……………………………………………………………………………………………………………….18九、心得体会……………………………………………………………………………………………………….18十、参考文献……………………………………………………………………………………………………….193一、前言随着微电子技术的的飞速发展,大规模可编程器件的密度和性能不断提高,数字系统的设计方法、设计过程也发生了重大改变,传统的设计方法已经逐渐被电子设计自动化EDA(ElectronicDesignAutomation)工具所取代。可编程器件可以通过硬件描述语言(如VerilogHDL)的形式根据实际设计的需要灵活地嵌入规模化的数字单元,大大地缩短了产品的设计周期。以可编程逻辑器件为核心的设计在数字系统设计领域将占据越来越重要的作用,因此,作为硬件设计者掌握EDA设计方法和工具是必须的。二、实验目的(1)通过本次课程设计加深对Verilog语言课程的全面认识、复习和掌握。(2)掌握定时器、外部中断的设置和编程原理。(3)通过此次课程设计能够将软硬件结合起来,对程序进行编辑、调试。使其能够通过电脑下载到芯片,正常工作。(4)实际操作QuartusII软件,复习巩固以前所学知识。三、功能设计数字钟是一个常用的数字系统,其主要功能是计时和显示时间。这里通过一个数字钟表的模块化设计方法,说明自顶向下的模块化设计方法和实现一个项目的设计步骤。这里实现的电子表具有显示和调时的基本功能,可以显示时、分秒和毫秒,并通过按键进行工作模式选择,工作模式有4种,分别是正常计时模式、调时模式、调分模式、调秒模式。构成电子表的基本基本模块有四个,分别是时钟调校及计时模块myclock、整数分频模块int_div、时钟信号选择模块clkgen和七段显示模块disp_dec。4四、用Verilog实现电路4.1时钟调校及计时模块时钟调校及计时模块myclock实现的功能是根据当前的工作状态进行时、分、秒的调整或正常的计时。代码端口说明如下:输入信号:RSTn——复位信号CLK——100Hz时钟信号FLAG[1:0]——工作模式控制信号,模式定义为:00表示正常显示,01表示调时,10表示调分,11表示调秒;UP——调校模式时以加1方式调节信号;DN——调校模式时以减1方式调节信号。输出信号:H[7:0]——“时”数据(十六进制);M[7:0]——“分”数据(十六进制);S[7:0]——“秒”数据(十六进制);MS[7:0]———“百分秒”数据(十六进制)。该模块的设计思路是,当复位信号RSTn有效时,时、分、秒信号清零,否则工作模式控制信号FLAG的值决定当前的工作状态。当FLAG=2’b00时,电子表工作在正常计时状态,对输入的100Hz的时钟信号clk进行计数,修改当前的百分秒(MS)、秒(S)、分(M)和时(H)的计数值;当FLAG信号=2’b01时,电子表工作在“时”校正状态,若此时UP信号有效则H加1,若此时DN信号有效则H减1,;当FLAG信号=1’b10时,电子表工作在“分”校正状态,若此时UP信号有效则M加1,若此时DN信号有效则M减1;当FLAG=2’b11时,电子表工作在“秒”校正状态,其UP和DN的控制过程与“时”、“分”类似代码:modulemyclock(RSTn,CLK,FLAG,UP,DN,H,M,S,MS);inputRSTn,CLK,UP,DN;output[7:0]H,M,S;5output[7:0]MS;input[1:0]FLAG;reg[5:0]m_H,m_M,m_S;reg[6:0]m_MS;assignH=m_H;assignM=m_M;assignS=m_S;assignMS=m_MS;always@(posedgeCLK)if(~RSTn)//复位状态beginm_H=8'd23;m_M=8'd52;m_S=8'b0;m_MS=8'b0;endelseif(FLAG==2'b01)//调时状态beginif(UP)beginif(m_H==8'd23)m_H=8'd0;elsem_H=m_H+1'b1;endelseif(DN)6beginif(m_H==8'h00)m_H=8'd23;elsem_H=m_H-1'b1;endendelseif(FLAG==2'b10)//调分状态beginif(UP)if(m_M==8'd59)m_M=8'd0;elsem_M=m_M+1'b1;elseif(DN)if(m_M==8'h00)m_M=8'd59;elsem_M=m_M-1'b1;endelseif(FLAG==2'b11)//调秒状态beginif(UP)if(m_S==8'd59)m_S=8'b0;elsem_S=m_S+1'b1;elseif(DN)if(m_S==8'h00)7m_S=8'd59;elsem_S=m_S=m_S-1'b1;endelsebegin//正常计时状态if(m_MS==8'd99)beginm_MS=8'd0;if(m_S==8'd59)beginm_S=8'd0;if(m_M==8'd59)beginm_M=8'd0;if(m_H==8'd23)m_H=0;elsem_H=m_H+1'b1;endelsem_M=m_M+8'd1;endelsem_S=m_S+1'b1;endelsem_MS=m_MS+1'b1;end8endmodule4.2整数分频模块由于数字系统提供的基准时钟信号频率往往较高,因此需要分频模块产生所需频率的失踪信号,例如上面时钟校正及计时模块所需的100Hz的时钟信号。整数分频模块int_div可以实现对输入时钟clock进行F_DIV分频后输出clk_out。F_DIV分频系数范围为1~2^n(n=F_DIV_WIDTH),若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。若分频系数为偶数,则输出时钟占空比为50%;若分频系数为奇数,则输出的时钟占空比取决于输入的时钟占空比和分频系数(当输入为50%时,输出也是50%)。代码:moduleint_div(clock,clk_out);parameterF_DIV=48000000;//分频系数parameterF_DIV_WIDTH=32;//分频计数器宽度inputclock;//输入时钟outputclk_out;//输出时钟regclk_p_r;regclk_n_r;reg[F_DIV_WIDTH-1:0]count_p;reg[F_DIV_WIDTH-1:0]count_n;wirefull_div_p;//上升沿计数满标志wirehalf_div_p;//上升沿计数半满标志wirefull_div_n;//下降沿计数满标志wirehalf_div_n;//下降沿计数半满标志9//判断计数标志位置位与否assignfull_div_p=(count_pF_DIV-1);assignhalf_div_p=(count_p(F_DIV1)-1);assignfull_div_n=(count_nF_DIV-1);assignhalf_div_n=(count_n(F_DIV1)-1);//时钟输出assignclk_out=(F_DIV==1)?clock:(F_DIV[0]?(clk_p_r&clk_n_r):clk_p_r);always@(posedgeclock)//上升沿脉冲计数beginif(full_div_p)begincount_p=count_p+1'b1;if(half_div_p)clk_p_r=1'b0;elseclk_p_r=1'b1;endelsebegincount_p=0;clk_p_r=1'b0;endendalways@(negedgeclock)//下降沿脉冲计数begin10if(full_div_n)begincount_n=count_n+1'b1;if(half_div_n)clk_n_r=1'b0;elseclk_n_r=1'b1;endelsebegincount_n=0;clk_n_r=1'b0;endendendmodule4.3时钟信号选择模块时钟信号选择模块clkgen实际上时一个二选一电路,用于提供时钟调校及计时时模块所需的时钟脉冲。当电子表工作在正常计时状态时选择100Hz时钟信号;当电子表工作在调时、调分、调秒是那种设置模式时,如果采用100Hz时钟信号,那么手动一次按键可能引起设置数据的一串跳变,因此为了方便按键时动作对时间的设置,这里采用2Hz的时钟信号。其端口说明如下:flag——时钟选择输入信号;clk_100Hz———输入100Hz的时钟信号;clk_2Hz——输入2Hz的时钟信号;Clkout——输出时钟信号。代码:moduleclkgen(flag,clk_100hz,clk_2hz,clkout);11input[1:0]flag;//若flag=0则clkout=100Hz,否则clkout=2Hzinputclk_100hz,clk_2hz;outputclkout;assignclkout=(flag==2'b00)?clk_100hz:clk_2hz;endmodule4.4七段显示设置为了对时钟时、分、秒和毫秒数据输出显示,需要将时、分、秒和毫秒的二进制转换为十进制数。由于时、分、秒最大到60,毫秒最大到99,所以十进制数选择2位就能满足要求。为了在七段数码管输出时间数据,还需要将显示的十进制数转化为七段段码。以上功能分别由BCD码显示模块和七段译码管模块来实现。4.4.1BCD码显示模块BCD码显示模块的功能是将8位二进制数转化为2位十进制数后,进行七段段译码显示。为了实现显示功能,在其内部调用了dual_hex2位七段显示模块。其端口说明如下:输入信号:hex——2位8421BCD码输入。输出信号:dispout——2位8421码对应的七段数码管段码。代码:moduledisp_dec(hex,dispou