2024年寒假练 - 基于小脚丫FPGA制作具有启动、停止、递增和清除功能的秒表
该项目使用了小脚丫FPG,实现了具有启动、停止、递增和清除功能的秒表的设计,它的主要功能为:在小脚丫FPGA核心板上创建一个2位数秒表,通过七段显示器输出。计数范围0.0秒到9.9秒,每0.1秒更新一次。按钮控制:开始递增(10Hz),停止显示当前值,增量增加显示值,清除重置为0。。 该项目使用了WebIDE编程环境,实现了FPGA代码的设计,它的主要功能为:编程、综合、仿真、生成JED代码并下载到FPGA中进行验证。。
标签
FPGA
数字逻辑
开发板
landaye
更新2024-04-01
204

项目需求

这个项目的目标是设计和实现一个2位数的秒表系统,使用小脚丫FPGA核心板作为硬件平台。秒表系统应具备可靠的计时功能,能够从0.0秒开始计数,逐步增加到9.9秒,然后循环回零重新计数。系统需要以0.1秒的精度更新计数值。

为了操作秒表系统,我们将使用四个按键进行控制:开始、停止、增量和清除。按下开始按钮后,秒表开始以10Hz的时钟速率递增,每0.1秒更新一次。停止按钮将暂停递增,但仍然显示当前计数器的值。增量按钮将导致显示值增加一次,无论按住按钮的时间有多长。最后,清除按钮将强制将计数器值重置为零。


需求分析

  1. 功能需求:
    • 秒表计数:实现从0.0秒开始计数,每0.1秒递增一次,当计数达到9.9秒时,循环回零重新计数。
    • 开始/停止功能:通过按下开始按钮启动秒表,按下停止按钮暂停计数,但仍然显示当前计数值。
    • 增量功能:通过按下增量按钮,将当前计数值增加一次,无论按住按钮的时间有多长。
    • 清除功能:通过按下清除按钮,将计数器值强制重置为零。
  2. 界面需求:
    • 显示器:使用数码管来显示当前计数值,确保清晰可读。
    • 按键:需要四个按键,分别为开始、停止、增量和清除按钮,用于控制秒表的各项功能。
  3. 计时精度:
    • 秒表应具备高精度计时功能,以确保准确的计数和显示。
  4. 时钟速率:
    • 秒表应以10Hz的时钟速率进行递增,即每0.1秒更新一次。
  5. 按钮功能:
    • 开始按钮:按下开始按钮后,秒表开始计时,并以10Hz的时钟速率递增。
    • 停止按钮:按下停止按钮后,秒表暂停计数,但仍然显示当前计数器的值。
    • 增量按钮:按下增量按钮后,将当前计数值增加一次,无论按住按钮的时间有多长。
    • 清除按钮:按下清除按钮后,将计数器值强制重置为零。

实现方式

使用两个数码管 seg_led_1seg_led_2,用于显示十位数和个位数。通过 clk 信号驱动计数器的递增,并可以通过控制信号 hold, hold1, hold2, hold3 来控制计数器的启动、暂停和复位操作。当计数达到最大值时会回到零,并且支持手动递增功能。

在模块中使用了多个寄存器来存储计数器的当前值和状态,并通过逻辑判断来实现计数器的递增和复位功能。同时,在时钟上升沿检测到控制信号变化时,根据不同的情况更新计数器的值以及数码管显示的内容。

功能框图

实物展示:


adc41b2218486ddc06b49e2677e53d2.jpg


24482233121330197b260a13cf01132.jpg


示例代码

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:时钟信号,用于驱动计数器的计数。
  • rstrst1rst2rst3:重置信号,将计数器的值归零。
  • holdhold1hold2hold3:暂停信号,用于暂停计数器的计数。

输出端口:

  • 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:用于表示计数完成的信号。
  • segseg1:用于存储数码管的显示数据。
  • cnt_gecnt_shi:分别用于存储个位数和十位数的计数值。
  • cnt:24位宽的计数器,用于存储当前的计数值。
  • cnt_flagincrease_flagpre_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


  1. segseg1 是存储数字对应的数码管显示值的寄存器数组。
  2. cnt_gecnt_shi 分别用于存储计数器的个位数和十位数。
  3. cnt 是一个 24 位的计数器寄存器,用于存储当前计数值。
  4. cnt_flag 是一个标志位,用来控制计数器的开始和暂停。
  5. increase_flag 是一个标志位,用来标识是否需要递增计数器的值。
  6. pre_inc 是一个辅助标志位,用于辅助检测手动递增操作。
  7. 当复位信号 rst 为非零时,back_to_zero_flag 被置为0;当 cnt_shicnt_ge 均为0时,back_to_zero_flag 被置为1,表示需要将计数器清零。
  8. 在时钟信号上升沿检测到不同的控制信号时,根据控制信号的状态来更新计数器的值:
    • holdhold1 控制计数器的开始和暂停。
    • 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
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号