内容介绍
内容介绍
项目需求
这个项目的目标是设计和实现一个2位数的秒表系统,使用小脚丫FPGA核心板作为硬件平台。秒表系统应具备可靠的计时功能,能够从0.0秒开始计数,逐步增加到9.9秒,然后循环回零重新计数。系统需要以0.1秒的精度更新计数值。
为了操作秒表系统,我们将使用四个按键进行控制:开始、停止、增量和清除。按下开始按钮后,秒表开始以10Hz的时钟速率递增,每0.1秒更新一次。停止按钮将暂停递增,但仍然显示当前计数器的值。增量按钮将导致显示值增加一次,无论按住按钮的时间有多长。最后,清除按钮将强制将计数器值重置为零。
需求分析
- 功能需求:
- 秒表计数:实现从0.0秒开始计数,每0.1秒递增一次,当计数达到9.9秒时,循环回零重新计数。
- 开始/停止功能:通过按下开始按钮启动秒表,按下停止按钮暂停计数,但仍然显示当前计数值。
- 增量功能:通过按下增量按钮,将当前计数值增加一次,无论按住按钮的时间有多长。
- 清除功能:通过按下清除按钮,将计数器值强制重置为零。
- 界面需求:
- 显示器:使用数码管来显示当前计数值,确保清晰可读。
- 按键:需要四个按键,分别为开始、停止、增量和清除按钮,用于控制秒表的各项功能。
- 计时精度:
- 秒表应具备高精度计时功能,以确保准确的计数和显示。
- 时钟速率:
- 秒表应以10Hz的时钟速率进行递增,即每0.1秒更新一次。
- 按钮功能:
- 开始按钮:按下开始按钮后,秒表开始计时,并以10Hz的时钟速率递增。
- 停止按钮:按下停止按钮后,秒表暂停计数,但仍然显示当前计数器的值。
- 增量按钮:按下增量按钮后,将当前计数值增加一次,无论按住按钮的时间有多长。
- 清除按钮:按下清除按钮后,将计数器值强制重置为零。
实现方式
使用两个数码管 seg_led_1
和 seg_led_2
,用于显示十位数和个位数。通过 clk
信号驱动计数器的递增,并可以通过控制信号 hold
, hold1
, hold2
, hold3
来控制计数器的启动、暂停和复位操作。当计数达到最大值时会回到零,并且支持手动递增功能。
在模块中使用了多个寄存器来存储计数器的当前值和状态,并通过逻辑判断来实现计数器的递增和复位功能。同时,在时钟上升沿检测到控制信号变化时,根据不同的情况更新计数器的值以及数码管显示的内容。
功能框图
实物展示:
示例代码
module counter
(
clk , //clock
rst , //restoration
rst2,
rst3,
hold , //Start pause button
rst1 , //restoration
hold1 ,
hold2 ,
hold3 ,
seg_led_1 , //Nixie tube 1
seg_led_2 , //Nixie tube 2
);
input clk,rst,rst1,rst2,rst3;
input hold,hold1,hold2,hold3;
output [8:0] seg_led_1,seg_led_2;
输入端口:
clk
:时钟信号,用于驱动计数器的计数。rst
、rst1
、rst2
、rst3
:重置信号,将计数器的值归零。hold
、hold1
、hold2
、hold3
:暂停信号,用于暂停计数器的计数。
输出端口:
seg_led_1
:7段数码管1的显示信号。seg_led_2
:7段数码管2的显示信号。
reg back_to_zero_flag ; //Timing completion signal
reg [6:0] seg [9:0];
reg [7:0] seg1 [9:0];
reg [3:0] cnt_ge; //units digit
reg [3:0] cnt_shi; //tens digit
reg [23:0] cnt=24'd0;//counter
reg cnt_flag=1'b0;//flag of the counter
reg increase_flag=1'b0;//flag of the increasement
reg pre_inc=1'b1;
back_to_zero_flag
:用于表示计数完成的信号。seg
、seg1
:用于存储数码管的显示数据。cnt_ge
、cnt_shi
:分别用于存储个位数和十位数的计数值。cnt
:24位宽的计数器,用于存储当前的计数值。cnt_flag
、increase_flag
、pre_inc
:这些是计数器的控制标志,用于控制计数器的增加和状态变化。
initial
begin
seg[0] = 7'h3f; // 0 0011 1111
seg[1] = 7'h06; // 1 0000 0110
seg[2] = 7'h5b; // 2 0101 1011
seg[3] = 7'h4f; // 3 0100 1111
seg[4] = 7'h66; // 4 0110 0111
seg[5] = 7'h6d; // 5 0110 1101
seg[6] = 7'h7d; // 6 0111 1101
seg[7] = 7'h07; // 7 0000 0111
seg[8] = 7'h7f; // 8 0111 1111
seg[9] = 7'h6f; // 9 0110 1111
seg1[0] = 8'hbf; // 0. 1011 1111
seg1[1] = 8'h86; // 1. 1000 0110
seg1[2] = 8'hdb; // 2. 1101 1011
seg1[3] = 8'hcf; // 3. 1100 0111
seg1[4] = 8'he6; // 4. 1110 0111
seg1[5] = 8'hed; // 5. 1110 1101
seg1[6] = 8'hfd; // 6. 1111 1101
seg1[7] = 8'h87; // 7. 1000 0111
seg1[8] = 8'hff; // 8. 1111 1111
seg1[9] = 8'hef; // 9. 1110 1111
end
seg[0]
到seg[9]
分别表示数字 0 到 9 在7段数码管上的显示编码。seg1[0]
到seg1[9]
则表示带小数点的数字 0. 到 9. 在8段数码管上的显示编码。
always @ (*)
if(!rst == 1)
back_to_zero_flag <= 0;
else if(cnt_shi==0 && cnt_ge==0)
back_to_zero_flag <= 1;
else
back_to_zero_flag <= 0;
always @(posedge clk) begin
if (hold == 1'b1) begin
cnt_flag <= 1'b1;
end else if (hold1 == 1'b1) begin
cnt_flag <= 1'b0;
end else if (hold3 == 1'b1) begin
cnt <= 24'd0;
cnt_ge <= 4'd0;
cnt_shi <= 4'd0;
end
end
always @(posedge clk) begin
if (hold2 == 1'b0) begin
if (pre_inc == 1'b1) begin
increase_flag <= 1'b1;
end
pre_inc <= 1'b0;
end else if (hold2 == 1'b1) begin
if(hold2 == 1'b0)
if (pre_inc == 1'b0) begin
pre_inc <= 1'b1;
end
end
end
always @(posedge clk) begin
if (cnt_flag == 1'b1) begin
if (cnt == 24'd1199999) begin
cnt <= 24'd0;
if (cnt_shi == 4'd9) begin
cnt_shi <= 4'd0;
if (cnt_ge == 4'd9) begin
cnt_ge <= 4'd0;
cnt_shi <= 4'd0;
end else begin
cnt_ge <= cnt_ge + 4'd1;
end
end else begin
cnt_shi <= cnt_shi + 4'd1;
end
end else begin
cnt <= cnt + 24'd1;
end
end else begin
if (increase_flag == 1'b1) begin
increase_flag <= 1'b0;
if (cnt_shi == 4'd9) begin
cnt_shi <= 4'd0;
if (cnt_ge == 4'd9) begin
cnt_ge <= 4'd0;
cnt_shi <= 4'd0;
end else begin
cnt_ge <= cnt_ge + 4'd1;
end
end else begin
cnt_shi <= cnt_shi + 4'd1;
end
end
end
end
assign seg_led_1[8:0] = {2'b00,seg1[cnt_ge]};
assign seg_led_2[8:0] = {2'b00,seg[cnt_shi]};
endmodule
seg
和seg1
是存储数字对应的数码管显示值的寄存器数组。cnt_ge
和cnt_shi
分别用于存储计数器的个位数和十位数。cnt
是一个 24 位的计数器寄存器,用于存储当前计数值。cnt_flag
是一个标志位,用来控制计数器的开始和暂停。increase_flag
是一个标志位,用来标识是否需要递增计数器的值。pre_inc
是一个辅助标志位,用于辅助检测手动递增操作。- 当复位信号
rst
为非零时,back_to_zero_flag
被置为0;当cnt_shi
和cnt_ge
均为0时,back_to_zero_flag
被置为1,表示需要将计数器清零。 - 在时钟信号上升沿检测到不同的控制信号时,根据控制信号的状态来更新计数器的值:
hold
,hold1
控制计数器的开始和暂停。hold3
控制计数器的复位。hold2
用于手动递增计数器的值。
附件下载
archive.zip
团队介绍
无
评论
0 / 100
查看更多
猜你喜欢
2024年寒假练 - 基于小脚丫FPGA实现具有启动、停止、递增和清除功能的秒表该项目使用了小脚丫FPGA,实现了具有启动、停止、递增和清除功能的秒表的设计,它的主要功能为:使用七段显示器作为输出设备,在小脚丫FPGA核心板上创建一个2位数秒表。 秒表应从 0.0 秒计数到 9.9秒,然后翻转,计数值每0.1秒精确更新一次。 秒表使用四个按钮输入:开始、停止、增量和清除(重置)。 开始输入使秒表开始以10Hz时钟速率递增(即每0.1秒计数一次); 停止输入使计数器停止递增,但使数码管显示当前计数器值; 每次按下按钮时,增量输入都会导致显示值增加一次,无论按住增量按钮多长时间; 复位/清除输入强制计数器值为零。。
李书哲
110
2024 年寒假练 - 基于小脚丫 FPGA 核心板实现具有启动、停止、递增和清除功能的秒表该项目使用了小脚丫 FPGA 核心板,实现了具有启动、停止、递增和清除功能的秒表的设计,它的主要功能为:0~10s的计数器,可复位、暂停、启动、增量计数器。。
该项目使用了WebIDE与GPT,实现了verilog语言秒表程序的设计,它的主要功能为:实现十位数查找、计数器、分频器、七段数码管显示模块。。
sll
58
2024年寒假练 - 基于小脚丫FPGA核心板制作具有启动、停止、递增和清除功能的秒表该项目使用了小脚丫FPGA核心板,实现了秒表的设计,它的主要功能为:具有启动、停止、递增和清除的功能。
ststyst4399
76