基于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的简易数字时钟的更多相关文章

  1. 基于Verilog HDL 的数字时钟设计

    基于Verilog HDL的数字时钟设计 一.实验内容:     利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...

  2. FPGA经典:Verilog传奇与基于FPGA的数字图像处理原理及应用

    一 简述 最近恶补基础知识,借了<<Verilog传奇>>,<基于FPGA的嵌入式图像处理系统设计>和<<基千FPGA的数字图像处理原理及应用>& ...

  3. 基于FPGA的数字识别的实现

    欢迎大家关注我的微信公众号:FPGA开源工作室     基于FPGA的数字识别的实现二 作者:lee神 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版 ...

  4. 一个简易的 LED 数字时钟实现方法

    这个应该是已经有很多人做过的东西,我应该只是算手痒,想写一下,所以,花了点时间折腾了这个,顺便把 Dark Mode 的处理也加上了. 首先可以很明确的一点,这个真没技术含量存在,只是需要点耐心. L ...

  5. 基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)

    1 设计内容 本设计是基于FPGA的音频信号FIR低通滤波,根据要求,采用Matlab对WAV音频文件进行读取和添加噪声信号.FFT分析.FIR滤波处理,并分析滤波的效果.通过Matlab的分析验证滤 ...

  6. 基于FPGA的图像去噪

    目录 结构图 其中FPGA 控制模块为核心,通过它实现视频图像数据的获取.缓存.处理和控制各模块间通讯[1].由CCD 相机对目标成像,高速图像数据由camera link 实时传输[2],经信号转换 ...

  7. 基于FPGA的OLED真彩色动态图像显示的实现

    源:基于FPGA的OLED真彩色动态图像显示的实现 作为第3代显示器,有机电致发光器件(Organic Light Emitting Diode,OLED)由于其主动发光.响应快.高亮度.全视角.直流 ...

  8. 基于FPGA的中值滤波算法实现

    在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑 ...

  9. 基于FPGA的Sobel边缘检测的实现

    前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...

随机推荐

  1. CSS3 opacity

    opacity用来设置元素的透明度. 值被约束在[0.-1.0]范围内,如果超过了这个范围,其计算结果将截取到与之最相近的值. 0表示完全透明,1表示完全不透明. 浏览器支持: (1).IE浏览器支持 ...

  2. 联想 Z5 Pro(L78031)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖ZUI 10.0.355

    >>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...

  3. vscode常好用的插件以及几个快捷操作

    使用方法,可以在官网中搜索需要的插件或者在VsCode的“”扩展“”中搜索需要的插件添加方法使用Ctrl+P, 输入 ext install xxxx ,搜索要安装的插件,点击安装按钮即可(各取所需插 ...

  4. jq微信分享

    (function() { var weChat = { init: function() { this.getData(); }, getData: function() { $.ajax({ ty ...

  5. [Windows Server 2003] 手工创建安全网站

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:手工创建安全站 ...

  6. Linux终端常用快捷操作

    命令或文件名自动补全:在输入命令或文件名的前几个字母后,按Tab键,系统会自动补全或提示补全 上下箭头:使用上下箭头可以回溯之前的命令,增加命令的重用,减少输入工作量 !加之前输入过的命令的前几个字母 ...

  7. RabbitMQ系列(八)--顺序消费模式和迅速消息发送模式

    MQ使用过程中,有些业务场景需要我们保证顺序消费,而如果一个Producer,一个Queue,多个Consumer的情况下是无法保证顺序的 举例: 1.业务上产生三条消息,分别是对数据的增加.修改.删 ...

  8. JavaScipt30(第十八个案例)(主要知识点:Array.prototype.map)

    承接上文,这是第十八个案例,中间的十到十八我直接看了答案,因为有些例子从他打开的页面看不出他要做什么. 附上项目链接: https://github.com/wesbos/JavaScript30 这 ...

  9. 在TWaver的Tree节点上画线

    论坛上有同学提出如何在tree上画引导线,之前我们Flex已经实现此功能,现在最新版的HTML5也将添加此功能.先看看效果:详细的使用方法可以参考我们开发手册中可视化视图组件#Tree引导线一章,下面 ...

  10. 动态生成java、动态编译、动态加载

    我曾经见过一个“规则引擎”,是在应用系统web界面直接编写java代码,然后保存后,规则即生效,我一直很是奇怪,这是如何实现的呢?实际这就好像jsp,被中间件动态的编译成java文件,有被动态的编译成 ...