实现设备:
1.笔记本
2.软件:Vivado
3.硬件:NEXYS 4 DDR开发版
实验要求
目的:
1.分时控制:七段数码管显示多个数字 2.分频:从100MHz时钟生成其他频率时钟 3.一个模块包括多个时钟:100MHz, 1KHz, 400Hz 4.二进制转换成十进制
实验要求:
- 计数器每毫秒增加1,范围从0~9999 (十进制);
- 当reset按钮按下,计数器值清零;
- 用4个七段数码管显示计数器的值
实验原理
(一)分频原理:
Nexys开发板的输入时钟是100MHz
如果我们希望LED每秒闪烁一次,则需要一个2Hz的时钟。 LED每0.5秒改变一次状态 2Hz时钟的周期为0.5秒,高电平时间=低电平时间=0.25秒
对于100MHz的时钟来说,0.25秒需要25M个周期。 25M个周期意味着从0计算到24,999,999 24,999,999用二进制表示需要25-bit。
(二)实验内容:
- 4个七段数码管的刷新频率为100Hz,即每个数码管显示时间为0.0025(1/100/4)秒。
- 同一时间只打开一个数码管。定义一个2-bit的计数器,当计数器值为2’b00,打开第1个数码管;当计数器值为2’b01,打开第2个数码管,以此类推;
- 定义一个16-bit的变量timer保存计数器的值,该timer[3:0]用于个位,timer[7:4]用于十位,以此类推。
verilog代码:
//
//School: neusoft
// Engineer: yzh
/
module timer(
input clk,
input reset_n,
output reg [15:0] timer,
output reg [6:0] seg,
output reg [7:0] AN
);
reg clk1k; // 1KHz时钟
reg [15:0] cnt1k; // 用于产生1KHz时钟的计数器
reg clk400; // 400Hz时钟
reg [16:0] cnt400; // 用于产生400Hz时钟的计数器
reg [1:0] cnt_seg; // 用于控制4个数码管开关
reg [3:0] seg_data; // 数码管显示的数字
always @(posedge clk) begin
if (reset_n == 1'b0) begin
cnt1k <= 0; clk1k <= 1'b0;
end
else begin
if (cnt1k >= 49999) begin
cnt1k <= 16'd0; clk1k = ~clk1k;
end
else begin cnt1k <= cnt1k + 1;
end
end
end
always @(posedge clk) begin
if (reset_n == 1'b0) begin
cnt400 <= 0; clk400 <= 1'b0;
end
else begin
if (cnt400 >= 124999) begin
cnt400 <= 17'd0; clk400 = ~clk400;
end
else begin
cnt400 <= cnt400 + 1;
end
end
end
always @(posedge clk1k,negedge reset_n) begin
if ( reset_n == 1'b0) begin
timer <= 16'd0;
end
else begin
timer[3:0] <= timer[3:0] + 1;
if(timer[3:0]==10) begin
timer[7:4]<=timer[7:4]+1;
timer[3:0]<= 0;
end
else if(timer[7:4]==10) begin
timer[11:8]<=timer[11:8]+1;
timer[7:4]<= 0;
end
else if(timer[11:8]==10) begin
timer[15:12]<=timer[15:12]+1;
timer[11:8]<= 0;
end
else if(timer[15:12]==10)begin
timer[15:12]<= 0;
end
end
end
always @(posedge clk400 ) begin
if (reset_n == 1'b0) begin
cnt_seg <= 2'b00;
end
else begin
cnt_seg <= cnt_seg + 1;
end
end
always @(cnt_seg)
begin
case (seg_data )
4'd0 : seg <= 7'b0000001; //0
4'd1 : seg <= 7'b1001111; //1
4'd2 : seg <= 7'b0010010; //2
4'd3 : seg <= 7'b0000110; //3
4'd4 : seg <= 7'b1001100; //4
4'd5 : seg <= 7'b0100100; //5
4'd6 : seg <= 7'b0100000; //6
4'd7 : seg <= 7'b0001111; //7
4'd8 : seg <= 7'b0000000; //8
4'd9 : seg <= 7'b0000100; //9
default : seg <= 7'b0000001; //0
endcase
case (cnt_seg)
2'b00: begin AN<= 8'b11111110;seg_data<=timer[3:0] ; end
2'b01: begin AN<= 8'b11111101;seg_data<=timer[7:4]; end
2'b10: begin AN <= 8'b11111011;seg_data<=timer[11:8] ; end
2'b11: begin AN <= 8'b11110111; seg_data<=timer[15:12]; end
default:AN <= 8'b11110000;
endcase
if(reset_n == 1'b0)
begin
AN <= 8'b11110000;
seg_data<=0;
end
end
endmodule
约束文件:
## Clock signal
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}];
## LEDs
set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports {timer[0] }];# IO_L18P_T2_A24_15 Sch=led[0]
set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports {timer[1] }];# IO_L24P_T3_RS1_15 Sch=led[1]
set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports {timer[2] }];# IO_L17N_T2_A25_15 Sch=led[2]
set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports {timer[3] }];# IO_L8P_T1_D11_14 Sch=led[3]
set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports {timer[4] }];# IO_L7P_T1_D09_14 Sch=led[4]
set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports {timer[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5]
set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { timer[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6]
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports {timer[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7]
set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports {timer[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8]
set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { timer[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9]
set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports {timer[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10]
set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports {timer[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11]
set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports {timer[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12]
set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports {timer[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13]
set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports {timer[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14]
set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports {timer[15]}];
##7 segment display
set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { seg[6] }];# IO_L24N_T3_A00_D16_14 Sch=ca
set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { seg[5] }]; #IO_25_14 Sch=cb
set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { seg[4] }]; #IO_25_15 Sch=cc
set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { seg[3] }]; #IO_L17P_T2_A26_15 Sch=cd
set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { seg[2] }]; #IO_L13P_T2_MRCC_14 Sch=ce
set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { seg[1] }]; #IO_L19P_T3_A10_D26_14 Sch=cf
set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { seg[0] }]; #IO_L4P_T0_D04_14 Sch=cg
set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { AN[0] }];# IO_L23P_T3_FOE_B_15 Sch=an[0]
set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { AN[1] }];# IO_L23N_T3_FWE_B_15 Sch=an[1]
set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { AN[2] }];# IO_L24P_T3_A01_D17_14 Sch=an[2]
set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { AN[3] }];# IO_L19P_T3_A22_15 Sch=an[3]
set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { AN[4] }];# IO_L8N_T1_D12_14 Sch=an[4]
set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { AN[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5]
set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { AN[6] }];# IO_L23P_T3_35 Sch=an[6]
set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { AN[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7]