基于verilog的数字时钟设计 - 图文(3)

2019-09-02 19:06

input[1:0] flag; //若flag=0则clkout=100Hz,否则clkout=2Hz input clk_100hz,clk_2hz; output clkout;

assign clkout=(flag==2'b00)?clk_100hz:clk_2hz; endmodule

4.4七段显示设置

为了对时钟时、分、秒和毫秒数据输出显示,需要将时、分、秒和毫秒的二进制转换为十进制数。由于时、分、秒最大到60,毫秒最大到99,所以十进制数选择2位就能满足要求。为了在七段数码管输出时间数据,还需要将显示的十进制数转化为七段段码。以上功能分别由BCD码显示模块和七段译码管模块来实现。

4.4.1 BCD码显示模块

BCD码显示模块的功能是将8位二进制数转化为2位十进制数后,进行七段段译码显示。为了实现显示功能,在其内部调用了dual_hex 2位七段显示模块。其端口说明如下:

输入信号:

hex——2位8421BCD码输入。 输出信号:

dispout——2位8421码对应的七段数码管段码。 代码:

module disp_dec(hex,dispout);

input[7:0] hex; //八位二进制输入数据

output[15:0] dispout; //2位十进制的七段段码显示数据 reg[7:0] dec;

11

always @(hex)

begin //8位二进制数转化为2位BCD码 dec[7:4]=hex/4'd10; dec[3:0]=hex%4'd10; end

dual_hex u1(1'b0,dec,dispout); //调用2位共阳极七段显示模块 endmodule

4.4.2 二位七段显示模块

二位七段显示模块的功能是将2进制或十六进制数转化为对应的七段段码,内部调用了一位七段译码模块seg_decoder。

代码:

module dual_hex(iflag,datain,dispout);

input iflag; //共阴或共阳输出选择 input[7:0] datain; //2位的十进制或十六进制数据 output[15:0] dispout; //2个七段段码数据

seg_decoder u1(iflag,datain[7:4],dispout[15:8]); seg_decoder u2(iflag,datain[3:0],dispout[7:0]); endmodule

4.4.3 一位七段译码模块

一位七段译码模块的功能是将4位二进制数转化为对应的共阴或共阳七段段码。

代码:

module seg_decoder(iflag,iA,oY);

input iflag; //共阴或共阳输出选择

12

input[3:0] iA; //4位二进制数据 output reg[7:0] oY; //七段段码显示数据

always @(iflag,iA) begin

case(iA) //共阴级七段输出 4'b0000:oY=8'h3f; 4'b0001:oY=8'h06; 4'b0010:oY=8'h5b; 4'b0011:oY=8'h4f; 4'b0100:oY=8'h66; 4'b0101:oY=8'h6d; 4'b0110:oY=8'h7d; 4'b0111:oY=8'h27; 4'b1000:oY=8'h7f; 4'b1001:oY=8'h6f; 4'b1010:oY=8'h77; 4'b1011:oY=8'h7c; 4'b1100:oY=8'h58; 4'b1101:oY=8'h5e; 4'b1110:oY=8'h79; 4'b1111:oY=8'h71; endcase if(!iflag)

oY=~oY; end endmodule

//共阳极七段输出 13

4.5、顶层模块的实现

顶层模块是将各功能模块连接起来,实现电子表的完整功能。其端口信号说明如下: 输入信号:

iCLK——50——50MHz时钟信号; RSTn——复位信号;

FLAG——工作模式控制信号,模式定义为:00表示正常显示,01表示调时,10表示调分,11表示调秒;

UP——调校模式时以加1方式调节信号; DN——调校模式时以减1方式调节信号。 输出信号:

H_dis——“小时”数据的七段数码管数据; M_dis——“分钟”数据的七段数码管数据; S_dis——“秒”数据的七段译码管数据; MS_dis——“百分秒”数据的七段译码管数据; Mode——工作模式输出; H——“时”数据(十六进制); M——“分”数据(十六进制); S——“秒”数据(十六进制); MS———“百分秒”数据(十六进制)。

代码:

module clock(iCLK_50,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S); input iCLK_50; input RSTn,UP,DN; input [1:0] FLAG; output [1:0] Mode;

output [15:0] H_dis,M_dis,S_dis,MS_dis; output [7:0] H,M,S;

14

wire [7:0] MS; wire clk_100hz,clk_2hz; wire clk;

assign Mode=FLAG;

int_div #(500000,32) nclk100(iCLK_50,clk_100hz); int_div #(50000000,32) nclk2(iCLK_50,clk_2hz); clkgen u0(FLAG,clk_100ha,clk_2hz,clk); myclock u1(RSTn,clk,FLAG,UP,DN,H,M,S,MS); disp_dec Hour(H,H_dis); disp_dec Minute(M,M_dis); disp_dec Second(S,S_dis); disp_dec hour(MS,MS_dis); endmodule

五、模拟与仿真

在Quartus II中利用仿真波形进行功能或时序仿真的基本步骤如下: (1)创建新的矢量波形文件(*.vwf). (2)添加输入、输出节点。 (3)编译输入节点的波形。

(4)完成矢量波形文件的创建之后,用户即可以对设计进行功能或时序仿真。 (5)仿真启动后,状态窗口会同时自动打开,在状态窗口中显示仿真进度及所用时间。

(6)默认情况下,仿真器报告窗口内在仿真过程中会显示仿真波形部分,其中还包括当前仿真器的设置信息和仿真信息等。

15


基于verilog的数字时钟设计 - 图文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《化学反应原理》综合练习7

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: