//时钟分频进程,用于数码管扫描显示 always @(posedge clock) begin
count <= count + 1'b1; end
assign div_clk = &count;
//数码管扫描显示部分
always @(posedge clock) begin
if(div_clk) cnt <= cnt + 1'b1; end
always @(posedge clock) begin
if(div_clk) begin case(cnt) 2'd0:disp_dat <= acount[7:4]; 2'd1:disp_dat <= acount[3:0]; 2'd2:disp_dat <= bcount[7:4]; 2'd3:disp_dat <= bcount[3:0]; endcase case(cnt) 2'd0:dig <= 8'b01111111; 2'd1:dig <= 8'b10111111; 2'd2:dig <= 8'b11110111; 2'd3:dig <= 8'b11111011; endcase end end
always @(disp_dat) begin
case(disp_dat) 4'h0:seg = 8'hc0; //显示0 4'h1:seg = 8'hf9; //显示1 4'h2:seg = 8'ha4; //显示2 4'h3:seg = 8'hb0; //显示3 4'h4:seg = 8'h99; //显示4 4'h5:seg = 8'h92; //显示5 4'h6:seg = 8'h82; //显示6 4'h7:seg = 8'hf8; //显示7
4'h8:seg = 8'h80; //显示8 4'h9:seg = 8'h90; //显示9 4'ha:seg = 8'h88; //显示a 4'hb:seg = 8'h83; //显示b 4'hc:seg = 8'hc6; //显示c 4'hd:seg = 8'ha1; //显示d 4'he:seg = 8'h86; //显示e 4'hf:seg = 8'h8e; //显示f endcase end
endmodule
(3) traffic_top.v(顶层文件)
module traffic_top(clk,rst_n,seg,dig,lampa,lampb); input clk; input rst_n; output [2:0] lampa; output [2:0] lampb; output [7:0] seg; output [7:0] dig;
wire clken;
wire [7:0] acount; wire [7:0] bcount;
traffic traffic( .clock(clk), .rst_n(rst_n), .clken(clken), .lampa(lampa), .lampb(lampb), .acount(acount), .bcount(bcount) );
traffic_test traffic_test( .clock(clk), .clken(clken), .rst_n(rst_n), .acount(acount), .bcount(bcount), .seg(seg),
//系统时钟(48MHz) //复位信号,低电平有效
.dig(dig) );
Endmodule
实验八 数字时钟
1、实验目的
学习数字时钟的硬件设计。 2、实验内容
在实验平台上完成一个可以计时的数字时钟,其显示时间范围是 00:00:00~23:59:59,且该时钟具有暂停计时和清零等功能。 3 、实验原理
一个完整的时钟应由 3 部分组成:秒脉冲发生电路、计数显示部分和时钟调整部分。一个时钟的准确与否主要取决秒脉冲的精确度。为了保证计时准确我们对系统时钟 50MHZ 进行了 50000000 分频,从而得到 1HZ 的秒脉冲。至于显示部分与 LED 数码管原理相同,而校时电路用户可以自由发挥,如定义 3 个键keystart、keymon 和 keyadd,分别用于控制时钟的计时开始、调整功能选择和加 1 处理,从而完成对现 在时间的调整。本实验的较时电路在此仅仅完成了暂停、清零等基本功能。 4、电路连接
(1)将EDA-MK-01模块跳线帽设置为SEG_a—SEG_dp和COM0—COM7端。
(2) 用实验仪提供的 8PIN 数据线将 IO 口三和四(J33和J34)分别与数码管的
J28、J27相连接。 (3)引脚分配 PIN_23 -to clk PIN_120 -to key\\[0\\] PIN_119 -to key\\[1\\] PIN_74 -to seg\\[0\\] PIN_72 -to seg\\[1\\] PIN_69 -to seg\\[2\\] PIN_68 -to seg\\[3\\] t PIN_67 -to seg\\[4\\] PIN_64 -to seg\\[5\\] PIN_63 -to seg\\[6\\] PIN_61 -to seg\\[7\\] PIN_86 -to dig\\[0\\] PIN_84 -to dig\\[1\\] PIN_82 -to dig\\[2\\] PIN_81 -to dig\\[3\\] PIN_80 -to dig\\[4\\] PIN_77 -to dig\\[5\\] PIN_76 -to dig\\[6\\] PIN_75 -to dig\\[7\\]
(4) 把程序下载到 FPGA 器件中。观察数码管的显示状态。按下按键 K3、K2 观察数
字钟上的时间有什么变化。
5、实验程序
module clock(clk,key,dig,seg); input clk; input[1:0] key; output[7:0] dig;
output[7:0] seg;
reg[7:0] seg_r; reg[7:0] dig_r; reg[3:0] disp_dat; reg[24:0]count; reg[23:0]hour; reg sec,keyen; reg[1:0]dout1,dout2,dout3; wire[1:0]key_done;
assign dig = dig_r; assign seg = seg_r;
//秒信号产生部分
always @(posedge clk) begin count = count + 1'b1; if(count == 25'd25000000) begin count = 25'd0; sec = ~sec; end end
//按键消抖处理部分
assign key_done = (dout1 | dout2 | dout3);
always @(posedge count[17]) begin dout1 <= key; dout2 <= dout1; dout3 <= dout2; end
always @(negedge key_done[0]) begin keyen = ~keyen; end
//数码管动态扫描显示部分 always @(posedge clk) begin case(count[17:15])