2024寒假练-基于小脚丫FPGA实现秒表
该项目使用了小脚丫FPGA核心板,实现了具有启动、停止、递增和清除功能的秒表的设计,它的主要功能为:具有启动、停止、递增和清除功能的秒表。
标签
FPGA
数字逻辑
寒假练
0215
更新2024-04-02
北京理工大学
30

一、系统方案论证:

概述:

"Tube" 模块旨在与数码管或7段数码管进行接口。它包括一个状态机,用于控制段数据,并管理指示按键按下和按键释放的标志。

功能:

代码片段中描述的模块执行以下任务:

计时,同时精确到秒和100毫秒。

控制两个7段数码管上显示的段数据。

根据按键输入管理启动和停止标志。

设计分析:

"Tube" 模块维护两个计数器,用于在秒和100毫秒内计时。它使用状态机来控制两个7段数码管的段数据。它还基于按键输入管理启动和停止标志。

"Tube" 模块需要一个 "Segment" 实例来显示段数据,以及一个 "Key" 实例来处理按键输入。"Key" 实例管理按键输入并根据按键释放检测设置 "r_flag"。

考虑因素:

"Tube" 模块的设计基于同步逻辑和正沿触发的触发器。按键输入用于控制启动和停止标志,从而影响段数据的显示。

重要的是要确保设计中的时序参数适合目标硬件平台,并满足7段数码管的电气规格。

总体而言,该设计展示了对段数据和按键输入管理的有效控制,以操作数码管。

二、理论分析与电路设计

设计思路:利用计数器驱动数码管,从而达到一个秒表功能

1. 利用reset按键来实现数码管清空功能

2. 当按键key1被按下时,启动计数器,从而改变数码管显示

3. 当按键key2被按下时,停止计数器,让数码管保持当时的数值不变

4. 当按键key3(flag)被按下时,数码管递增0.1s,达到递增效果

 

整体设计思路如下:

模块功能:

 

模块包含了一个用于显示时间的数码管显示器和一个按键模块,能够实现倒计时功能。

数码管显示器分为两部分,分别用于显示秒和毫秒。

按键模块用于启动和停止倒计时功能。

输入输出:

 

输入包括时钟信号clk、复位信号rst_n、按键信号key和一个标志位add。

输出包括用于显示秒的数码管信号seg_led_1和用于显示毫秒的数码管信号seg_led_2。

寄存器定义:

 

cnt_1s用于计时秒数,共24位。

cnt_100ms用于计时毫秒数,共21位。

flag用于控制倒计时的启动和停止。

seg_data_1和seg_data_2分别用于存储数码管显示的数据。

状态机设计:

 

设计了三个时序逻辑块,分别用于计时秒数、计时毫秒数和控制数码管显示数据。

每个逻辑块在正边沿时钟信号或者负边沿复位信号下更新寄存器的值。

控制逻辑:

 

当按键为10时,启动倒计时;当按键为01时,停止倒计时。

每个时序逻辑块的更新受到flag标志位和按键信号的控制。

根据计时条件和数码管显示值,更新数码管显示数据。

子模块实例化:

 

实例化了名为segment_inst的segment模块用于控制数码管的显示。

实例化了名为key_inst的key模块用于按键检测与处理。

主要难题可能包括以下几点:

时序逻辑设计复杂性

 

解决方法:时序逻辑设计中涉及多个计时器和状态机,需要确保逻辑正确性和时序稳定性。建议使用状态图等工具来清晰描述各状态转移和逻辑控制条件,同时对时序逻辑进行仿真验证。

数码管显示数据更新条件复杂

 

解决方法:数码管数据更新受多个条件影响,包括秒数、毫秒数、标志位等。建议优化逻辑控制条件,确保更新条件清晰明确,减少逻辑混乱和可能出现的bug。

按键检测与处理

 

解决方法:按键模块关键影响倒计时的启动和停止,正确检测和处理按键信号至关重要。建议添加消抖电路,确保按键信号稳定,并且对按键模块的逻辑进行充分测试。

功能框图如下:

代码如下:

module timer(

input wire clk, // 输入时钟信号



input wire rst, // 复位信号(低有效)

input wire add, // 加0.1s

input wire start, // 开始

input wire stop, // 结束



output wire [8:0] led_1, // 七段数码管输出

output wire [8:0] led_2 // 七段数码管输出

);





wire add_edge, start_edge, stop_edge;

wire clk10hz; //输出分频后的时钟信号

reg state; //状态机状态

reg [8:0] seg [9:0];

reg [3:0] count_gewei; //个位

reg [3:0] count_shiwei; //十位



//时钟分频模块

IntegerDivider #

(

.your_divisor(1200000)

)

IntegerDivider_inst

(

.clk(clk),

.rst_n(rst),

.clkout(clk10hz)

);



// 下降沿捕获模块

edge_detector edge_detector_inst(

.clk(clk10hz),

.rst_n(rst),

.add(add),

.start(start),

.stop(stop),

.add_edge(add_edge),

.start_edge(start_edge),

.stop_edge(stop_edge)

);



//参数化

parameter IDLE = 1'b0; // 初始空闲状态

parameter COUNTING = 1'b1; // 计数状态



// 程序主题:使用状态机

always @ (posedge clk10hz or negedge rst) begin

if(!rst == 1) begin

state <= 0;

count_gewei <= 4'd0;

count_shiwei <= 4'd0;

end

else begin

case(state)

//IDLE

IDLE : begin

if(add_edge == 1) begin

if(count_shiwei==9 && count_gewei==9) begin

count_shiwei <= 0;

count_gewei <= 0;

end

else if(count_gewei==9) begin

count_shiwei <= count_shiwei + 1;

count_gewei <= 0;

end

else begin

count_gewei <= count_gewei + 1;

end

end

else if(start_edge == 1) begin

state <= 1'd1;

end

else begin

count_shiwei <= count_shiwei;

count_gewei <= count_gewei;

end

end

//COUNTER

COUNTING : begin

if(stop_edge == 1) begin

state <= 1'd0;

end

else begin

if(count_shiwei==9 && count_gewei==9) begin

count_shiwei <= 0;

count_gewei <= 0;

end

else if(count_gewei==9) begin

count_shiwei <= count_shiwei + 1;

count_gewei <= 0;

end

else begin

count_gewei <= count_gewei + 1;

end

end

end

default : state <= 0;

endcase

end

end



initial

begin

seg[0] = 9'h3f; // 数码管输出显示0

seg[1] = 9'h06; // 数码管输出显示1

seg[2] = 9'h5b; // 数码管输出显示2

seg[3] = 9'h4f; // 数码管输出显示3

seg[4] = 9'h66; // 数码管输出显示4

seg[5] = 9'h6d; // 数码管输出显示5

seg[6] = 9'h7d; // 数码管输出显示6

seg[7] = 9'h07; // 数码管输出显示7

seg[8] = 9'h7f; // 数码管输出显示8

seg[9] = 9'h6f; // 数码管输出显示9

end



assign led_1 = seg[count_shiwei] + 9'b10000000;

assign led_2 = seg[count_gewei];



endmodule



//顶层模块


三、结果显示

资源占用:

仿真结果:

附件下载
archive (3).zip
团队介绍
李雨桐 北京理工大学
团队成员
0215
评论
0 / 100
查看更多
猜你喜欢
制作FPGA电子琴1. 存储一段音乐,并可以进行音乐播放, 2. 可以自己通过板上的按键进行弹奏,支持两个按键同时按下(和弦)并且声音不能失真,板上的按键只有13个,可以通过有上方的“上“、”下”两个按键对音程进行扩展
john
851
2024寒假练-基于小脚丫FPGA实现秒表该项目使用了Lattice MXO2的小脚丫FPGA核心板 - Type C接口,实现了具有启动、停止、递增和清除功能的秒表的设计,它的主要功能为:使用四个按钮输入:开始、停止、增量和清除(重置)。 开始输入使秒表开始以10Hz时钟速率递增(即每0.1秒计数一次); 停止输入使计数器停止递增,但使数码管显示当前计数器值; 每次按下按钮时,增量输入都会导致显示值增加一次,无论按住增量按钮多长时间; 复位/清除输入强制计数器值为零。。
烜月xy
60
2024寒假练-基于小脚丫FPGA实现秒表该项目使用了Lattice MXO2的小脚丫FPGA核心板-Type C接口,Verilog语言,实现了具有启动、停止、递增和清除功能的秒表的设计,它的主要功能为:使用七段显示器作为输出设备,在小脚丫FPGA核心板上创建一个2位数秒表。 秒表应从 0.0 秒计数到 9.9秒,然后翻转,计数值每0.1秒精确更新一次。 秒表使用四个按钮输入:开始、停止、增量和清除(重置)。 开始输入使秒表开始以10Hz时钟速率递增(即每0.1秒计数一次); 停止输入使计数器停止递增,但使数码管显示当前计数器值; 每次按下按钮时,增量输入都会导致显示值增加一次,无论按住增量按钮多长时间; 复位/清除输入强制计数器值为零。。
子墨一
29
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号