FPGA-50秒倒计时的实现(特权XILINX spartan-6开发板)
实现 FPGA 50 开发板 倒计时 Xilinx 特权
2023-09-14 09:13:03 时间
工具 ISE14.7
通过时间分频在4位7段数码管中显示2个数字,给人眼一个错觉是同时显示出两个数字。
实验原理是轮流向各位数码管送出字形码和相应的位选信号,利用数码管闪烁的余晖和人眼视觉的暂留作用,使人感觉像各位管同时在显示
就像单片机数码管的思想一样:这里也要做相同的事情。
单片机步骤如下:
动态显示:
1)位选数码管; 2)段选数码管; 3)延时
dula=1;//段选
P0=table[i];
dula=0;
P0=0xff;
wela=1;//位选
P0=a;
wela=0;
delayms(500);//延时
这样的代码实现流水显示,如果延时时间够短肉眼难以分辨;则可以实现几位数据的同时显示;
同理到FPGA中也是这样,不过要考虑用不同的模块实现这个功能
EG 两位数码管显示:
单片机中延时用个delay就可以实现,但是这里的延时要用一个计数器来模拟延时的状态
1.0)段选选择数码管显示的数值
1.1)因为这里我代码中值用了4个位来显示当前的数据(数据位宽为4)所以要在不同的时间选择当前显示的值
2)位选选择数码管的位数
3)延时(保证动态显示肉眼分辨不出)
代码如下:
module seg(clk,ext_rst_n,TimeH,TimeL,dtube_cs_n,dtube_data
);
input clk; //时钟信号25MHz
input ext_rst_n; //复位信号
input [3:0]TimeH; //两位输入高位
input [3:0]TimeL; //两位输入低位
output reg[1:0] dtube_cs_n; //段选数据位
output reg[6:0] dtube_data;//位选数据位
reg[3:0] display_num; //当前显示数据
reg[15:0] div_cnt; //延时计数器计数位
initial div_cnt = 0;//赋初值为0
//延时计数器模块
always@ (posedge clk or negedge ext_rst_n)
begin
if(!ext_rst_n)
div_cnt <= 8'd0;
else if(div_cnt==16'd50000)
div_cnt <= 8'd0;
else
div_cnt <= div_cnt+1'b1;
end
//显示当前的数据模块
always @(posedge clk or negedge ext_rst_n)
begin
if(!ext_rst_n)
display_num <= 4'h0;
else if(div_cnt < 25000)
display_num <= TimeH;
else
display_num <= TimeL;
end
//段选数据译码模块(共阴数码管)
always @(posedge clk or negedge ext_rst_n)
begin
if(!ext_rst_n)
dtube_data <= 8'h00;
else begin
case(display_num)
4'h0: dtube_data <= 8'h3f;
4'h1: dtube_data <= 8'h06;
4'h2: dtube_data <= 8'h5b;
4'h3: dtube_data <= 8'h4f;
4'h4: dtube_data <= 8'h66;
4'h5: dtube_data <= 8'h6d;
4'h6: dtube_data <= 8'h7d;
4'h7: dtube_data <= 8'h07;
4'h8: dtube_data <= 8'h7f;
4'h9: dtube_data <= 8'h6f;
default:dtube_data <= 8'h00;
endcase
end
end
//位选选译模块
always @(posedge clk or negedge ext_rst_n)
begin
if(!ext_rst_n)
dtube_cs_n <= 2'b11;
else if(div_cnt < 20000)
dtube_cs_n <= 2'b01;
else
dtube_cs_n <= 2'b10;
end
endmodule
数码管显示模块定义好了就要想如何实现倒计时的完成
这里的设计思路是
顶层设计模块
分频器模块 --> 计数器模块 -----> 数码管显示模块
输入复位信号 和系统时钟
1)分频器输入25MHz输出1Hz
2)IHz时钟信号传给计数器模块用于计数
3)计数的值在数码管显示
输出数码管的段选和位选
和蜂鸣器(计时完成标志位)
代码如下:
1,.TOP.v
module top(ext_clk_25m,ext_rst_n,beep,dtube_cs_n,dtube_data
);
//顶层控制模块
input ext_clk_25m; //时钟信号25MHz
input ext_rst_n; //复位信号
output [1:0] dtube_cs_n; //段选数据位
output [6:0] dtube_data;//位选数据位
output beep; //计时完成标志位
wire clk;//中间变量
wire [3:0] TimeL;
wire [3:0] TimeH;
//分频25MHZ变为1HZ
div d1(
.ext_clk_25m(ext_clk_25m),
.ext_rst_n(ext_rst_n),
.mclk(clk)
);
//倒计时计数模块
counter c1(
.mclk(clk),
.ext_rst_n(ext_rst_n),
.TimeH(TimeH),
.TimeL(TimeL),
.beep(beep)
);
//数码管显示模块
seg s1(
.clk(ext_clk_25m),
.ext_rst_n(ext_rst_n),
.TimeH(TimeH),
.TimeL(TimeL),
.dtube_cs_n(dtube_cs_n),
.dtube_data(dtube_data)
);
endmodule
2.div.v
module div(ext_clk_25m,ext_rst_n,mclk
);
input ext_clk_25m;//输入时钟
input ext_rst_n; //复位端口
output reg mclk;//输出1Hz
reg [23:0] cnt;//存放计数器的值
initial cnt = 0;
parameter TIME=24'd1250_0000;//时钟25MHz
//分频模块
//使得输入时钟为25MHz输出时钟为1Hz
always@(posedge ext_clk_25m or negedge ext_rst_n)
begin
if(!ext_rst_n)
begin
mclk <=1'b0;
cnt <=25'd0;
end
else if(cnt ==TIME-1'b1)
begin
mclk <=~mclk;
cnt <=1'b0;
end
else
cnt <=cnt + 1'b1;
end
endmodule
3.counter.v
module counter(mclk,ext_rst_n,TimeH,TimeL,beep
);
input mclk;//时钟信号
input ext_rst_n;//复位信号
output reg [3:0]TimeH;//两位数码管显示高位
output reg [3:0]TimeL;//两位数码管显示低位
output beep; //计数完成位
assign beep =({TimeH,TimeL}==8'h00);//当计数为0时,蜂鸣器响
initial {TimeH,TimeL} = 8'h50; //计数器赋初值
//计数器模块
always@(posedge mclk or negedge ext_rst_n)
begin
if(!ext_rst_n)
{TimeH,TimeL} <= 8'h50;
else if({TimeH,TimeL}==8'h00)
{TimeH,TimeL} <={TimeH,TimeL};
else if(TimeL==4'h0)
begin
TimeH <=TimeH-1'b1;
TimeL <=4'h9;
end
else
begin
TimeH <=TimeH;
TimeL <=TimeL-1'b1;
end
end
endmodule
4.数码管.v
上文已经贴出
相关文章
- PhoneGap Plugin与Wind.js结合,实现异步通信
- Java实现第十一届蓝桥杯 C组 省赛真题
- Java实现蓝桥杯算法提高 陶陶摘苹果
- Java实现 LeetCode 203 移除链表元素
- Java实现背包问题
- (Java实现) 洛谷 P1200 你的飞碟在这儿
- [CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口
- paip.提升效率---filter map reduce 的java 函数式编程实现
- 【Python代码实现】兔年新年快乐——送给女朋友
- Girlfriend含苞待笑——一次性处理上百份文档(Python实现)
- 基于智能优化算法的无人机路径规划(Matlab代码实现)
- 基于FPGA的DDS设计,并通过DDS实现ASK,FSK,PSK三种调制
- m基于FPGA的64QAM调制解调、载波同步verilog实现
- 基于FPGA的FFT变换和反变换实现,使用IP核设计,包含testbench
- m基于FPGA的viterbi译码verilog实现,包含testbench和MATLAB配套验证仿真程序
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
- FPGA奇数分频的实现
- windows10 tensorflow_(object_detection) 实现二(protos文件编译)
- FPGA-控制舵机实现
- FPGA-基于UART的QVGA显示(一)(实现PC端发送字母数字汉字的分别显示)
- FPGA-均值滤波算法的实现
- 数字信号处理-10-并行FIR滤波器MATLAB与FPGA实现
- 数字信号处理-09-串行FIR滤波器MATLAB与FPGA实现
- Verilog | I2C详解与Verilog实现
- m基于FPGA的RGB转ycrcb颜色空间转换算法实现,包含testbench,对比三种转换方法
- FPGA之OV7725摄像头采集与VGA显示实验--2--SCCB协议发送器实现(Verilog代码)
- FPGA 20个例程篇:14.千兆网口实现ICMP、UDP通信协议(上)
- FPGA 20个例程篇:12.千兆网口实现MDIO接口读写
- FPGA实现HDMI视频输出