基于FPGA的简易数字时钟
基于FPGA的可显示数字时钟,设计思路为自底向上,包含三个子模块:时钟模块,进制转换模块。led显示模块。所用到的FPGA晶振频率为50Mhz,首先利用它得到1hz的时钟然后然后得到时钟模块。把时钟模块输出的时、分、秒输入到进制转换模块后得到十进制的值再输入到led显示模块,该project已经在FPGA开发板上亲測可用。
下图为模块示意图(实际project中并没有採用原理图的输入方法。这里仅作示意)。
以下分模块说明:
clk1: 时钟模块,设计思路为首先依据50M晶振得到1hz的时钟,然后通过时分秒的关系得到时钟模块(详细见代码)。
输入 clk:系统时钟信号 50Mhz rst_n:低电平异步复位
输出 sec: 8bit位宽的秒位 min:
8bit位宽的分位 hour: 8bit位宽的时位
bin_dec1: 进制转换模块,设计思路全然依照之前的博文《利用verilog将二进制码转换为十进制BCD码》,代码稍作改动,去掉两个用不到的输出。
输入 clk:系统时钟信号 50Mhz rst_n:低电平异步复位 bin: 8bit位宽的输入待转换二进制数
输出 one: 十进制数的个位 ten: 十进制数的十位 hun: 十进制数的百位,这里用不到所以空置了。
led: 数码管显示模块,八段数码管在一定频率下切换赋值,每个时钟对一个数码管单独赋值并显示,切换频率大于一定值后。看起来像8位数码管同一时候显示(详细设计见代码)。
输入 clk: 系统时钟信号50Mhz
sec0,sec1,min0,min1。hour0。hour1: 4bit位宽的值。分代表时钟秒、分、时的个位和十位。
输出 sel: 8bit 数码管位选信号
data:8bit数码管译码显示的值
以下给出code:
clk1:
module clock1(sec,min,hour,clk,rst_n
);
input clk,rst_n;
output [7:0] sec,min;
output [7:0] hour;
reg [7:0] sec=0;
reg [7:0] min=0;
reg [7:0] hour=0;
reg clk_div;
reg [32:0] cnt;
//////////////////////////////////////// 分频部分 50MHz - 1Hz
always @ ( posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cnt <= 0;
clk_div <= 0;
end
else begin
if ( cnt < 25000000 - 1 )
begin
clk_div <= 0;
cnt <= cnt + 1;
end
else if ( cnt < 50000000 - 1 )
begin
clk_div <= 1;
cnt <= cnt + 1 ;
end
else
cnt <=0 ;
end
end
///////////////////////////////////////// 时钟部分
always @ ( posedge clk_div or negedge rst_n )
begin
if(!rst_n)
sec <= 0;
else begin
if ( sec == 59 )
sec <= 0 ;
else
sec <= sec + 1 ;
end
end
always @ ( posedge clk_div or negedge rst_n)
begin
if(!rst_n)
min <= 0;
else begin
if ( sec == 59 )
begin
if (min ==59 )
min <= 0;
else
min <= min + 1 ;
end
end
end
always @ ( posedge clk_div or negedge rst_n)
begin
if(!rst_n)
hour <= 0;
else begin
if ( sec == 59 && min ==59 )
begin
if (hour == 23)
hour <= 0 ;
else
hour <= hour + 1;
end
end
end
endmodule
bin_dec1
module bin_dec1(clk,bin,rst_n,one,ten,hun
);
input [7:0] bin;
input clk,rst_n;
output [3:0] one,ten;
output [1:0] hun;
reg [3:0] one,ten;
reg [1:0] hun;
reg [3:0] count;
reg [17:0]shift_reg=18'b000000000000000000;
////////////////////// 计数部分 ////////////////////////
always @ ( posedge clk or negedge rst_n )
begin
if( !rst_n )
count<=0;
else if (count==9)
count<=0;
else
count<=count+1;
end
////////////////////// 二进制转换为十进制 /////////////////
always @ (posedge clk or negedge rst_n )
begin
if (!rst_n)
shift_reg=0;
else if (count==0)
shift_reg={10'b0000000000,bin};
else if ( count<=8) //实现8次移位操作
begin
if(shift_reg[11:8]>=5) //推断个位是否>5。假设是则+3
begin
if(shift_reg[15:12]>=5) //推断十位是否>5。假设是则+3
begin
shift_reg[15:12]=shift_reg[15:12]+2'b11;
shift_reg[11:8]=shift_reg[11:8]+2'b11;
shift_reg=shift_reg<<1; //对个位和十位操作结束后,总体左移
end
else
begin
shift_reg[15:12]=shift_reg[15:12];
shift_reg[11:8]=shift_reg[11:8]+2'b11;
shift_reg=shift_reg<<1;
end
end
else
begin
if(shift_reg[15:12]>=5)
begin
shift_reg[15:12]=shift_reg[15:12]+2'b11;
shift_reg[11:8]=shift_reg[11:8];
shift_reg=shift_reg<<1;
end
else
begin
shift_reg[15:12]=shift_reg[15:12];
shift_reg[11:8]=shift_reg[11:8];
shift_reg=shift_reg<<1;
end
end
end
end
/////////////////输出赋值//////////////////////////
always @ ( posedge clk or negedge rst_n )
begin
if ( !rst_n )
begin
one<=0;
ten<=0;
hun<=0;
end
endmodule
led:
module led(clk,sec0,sec1,min0,min1,hour0,hour1,sel,data
);
input clk;
input [3:0] sec0,sec1,min0,min1,hour0,hour1;
output reg [7:0] data;
output reg [7:0] sel;
reg [3:0] data_dis=0;
reg [20:0] m=0;
always @ ( posedge clk )
begin
m<=m+1;
end
always@( posedge clk)
begin
case(m[16:14])
0: begin
data_dis<=4'b0000;
sel<=8'b1111_1110;
end
1: begin
data_dis<=4'b0000;
sel<=8'b1111_1101;
end
2: begin
data_dis<=hour1;
sel<=8'b1111_1011;
end
3: begin
data_dis<=hour0;
sel<=8'b1111_0111;
end
4: begin
data_dis<=min1;
sel<=8'b1110_1111;
end
5: begin
data_dis<=min0;
sel<=8'b1101_1111;
end
6: begin
data_dis<=sec1;
sel<=8'b1011_1111;
end
7: begin
data_dis<=sec0;
sel<=8'b0111_1111;
end
default:begin
data<=8'bz;
sel<=8'bz;
end
endcase
end
always @(data_dis)
begin
case(data_dis)//七段译码
4'h0:data = 8'hc0;//显示0
4'h1:data = 8'hf9;//显示1
4'h2:data = 8'ha4;//显示2
4'h3:data = 8'hb0;//显示3
4'h4:data = 8'h99;//显示4
4'h5:data = 8'h92;//显示5
4'h6:data = 8'h82;//显示6
4'h7:data = 8'hf8;//显示7
4'h8:data = 8'h80;//显示8
4'h9:data = 8'h90;//显示9
default data = 8'hxx;
endcase
end
endmodule
顶层例化模块:
top
module top(clk,rst_n,sel,data
);
input clk,rst_n;
output [7:0] sel,data;
wire [7:0] sec,min,hour;
wire [3:0] one1,ten1,one2,ten2,one3,ten3;
clock1 clock(
.clk(clk),
.rst_n(rst_n),
.sec(sec),
.min(min),
.hour(hour)
);
bin_dec1 bin_dec1(
.clk(clk),
.rst_n(rst_n),
.bin(sec),
.one(one1),
.ten(ten1)
);
bin_dec1 bin_dec2(
.clk(clk),
.rst_n(rst_n),
.bin(min),
.one(one2),
.ten(ten2)
);
bin_dec1 bin_dec3(
.clk(clk),
.rst_n(rst_n),
.bin(hour),
.one(one3),
.ten(ten3)
);
led led(
.clk(clk),
.sec0(one1),
.sec1(ten1),
.min0(one2),
.min1(ten2),
.hour0(one3),
.hour1(ten3),
.sel(sel),
.data(data)
);
endmodule
基于FPGA的简易数字时钟的更多相关文章
- 基于Verilog HDL 的数字时钟设计
基于Verilog HDL的数字时钟设计 一.实验内容: 利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...
- FPGA经典:Verilog传奇与基于FPGA的数字图像处理原理及应用
一 简述 最近恶补基础知识,借了<<Verilog传奇>>,<基于FPGA的嵌入式图像处理系统设计>和<<基千FPGA的数字图像处理原理及应用>& ...
- 基于FPGA的数字识别的实现
欢迎大家关注我的微信公众号:FPGA开源工作室 基于FPGA的数字识别的实现二 作者:lee神 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版 ...
- 一个简易的 LED 数字时钟实现方法
这个应该是已经有很多人做过的东西,我应该只是算手痒,想写一下,所以,花了点时间折腾了这个,顺便把 Dark Mode 的处理也加上了. 首先可以很明确的一点,这个真没技术含量存在,只是需要点耐心. L ...
- 基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)
1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤 ...
- 基于FPGA的图像去噪
目录 结构图 其中FPGA 控制模块为核心,通过它实现视频图像数据的获取.缓存.处理和控制各模块间通讯[1].由CCD 相机对目标成像,高速图像数据由camera link 实时传输[2],经信号转换 ...
- 基于FPGA的OLED真彩色动态图像显示的实现
源:基于FPGA的OLED真彩色动态图像显示的实现 作为第3代显示器,有机电致发光器件(Organic Light Emitting Diode,OLED)由于其主动发光.响应快.高亮度.全视角.直流 ...
- 基于FPGA的中值滤波算法实现
在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑 ...
- 基于FPGA的Sobel边缘检测的实现
前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...
随机推荐
- 锐动SDK应用于在线教育方面的解决方案
在线教育 PC端.Android端的屏幕.摄像头录制和直播功能,教师不再拘泥于专业的视频教室进行直播授课. 强大的视频编辑功能,便于课件的制作和不断修改升级. 在线课堂实现了教学视频内容在PC.PAD ...
- HDU_1166_敌兵布阵
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- [iOS]查看苹果支持的所有字库
有时候,在开发的时候,想换个字体更加优雅的显示.但是不知道苹果本身到底支持了那些字体,怎么办? 没关系,打开这个网址:http://iosfonts.com/ 所见即所得,非常方便,而且还表明了从那个 ...
- #NOIP前数学知识总结
我好菜啊…… 欧拉函数 欧拉函数φ(n),是小于n且和n互质的正整数(包括1)的个数. 性质: 1.对于质数n: φ(n)=n-1 2..对于n=pk φ(n)=(p-1)*pk-1 3.积性函数的性 ...
- acedssget
大多数ObjectARX函数在处理选择集和实体时,都用名字来识别选择集或实体,该名字用一个长整型对来表示的,并对AutoCAD来维护.在ObjectARX中,该名字的类型为ads_name.在对选择集 ...
- 第一节:EasyUI样式,行内编辑,基础知识
一丶常用属性 $('#j_dg_left').datagrid({ url: '/Stu_Areas/Stu/GradeList', fit: true, // 自动适应父容器大小 singleSel ...
- java代码完全手写模仿qq登录界面
这是我模仿QQ2015版界面,实现的基本功能有登陆验证,重置等,当然直接复制代码运行是不一样的,还要注意自己插入自己的图片. 结果截图如下所示: import java.awt.BorderLayou ...
- (转载)不错的CSS写法
根据微信订阅号“设计达人”推送的文章,学到了如题知识.个人尝试了一下,感觉还不错.原文链接:http://mp.weixin.qq.com/s/g9TyBwB9xIi45TGwTBOLSQ. 字体 从 ...
- Linux 安装 Tomcat 详解
说明:安装的 tomcat 为解压版(即免安装版):apache-tomcat-8.5.15.tar.gz (1)使用 root 用户登录虚拟机,在根目录下的 opt 文件夹新建一个 software ...
- 【转】精选十二款餐饮、快递、票务行业微信小程序源码demo推荐
微信小程序的初衷是为了线下实体业服务的,必须有实体相结合才能显示小程序的魅力.个人认为微信小程序对于餐饮业和快递业这样业务比较单一的行业比较有市场,故整理推荐12款餐饮业和快递业微信小程序源码demo ...