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