上一次设计的动态扫描数码管显示电路模型如上,这是一个32位并行数据[31:0]disp_num选通输出并行数据[7:0]select和[7:0]段选的电路。因此需要输出16个信号

而在开发板上的电路与这个的接口不同,如下:

这个开发板设计的fpga只有有三个输出,接到2片级联的74HC595芯片上,并行输出段选和位选数据。

这三个输出分别为:DIO(串行数据),SCLK(与74HC595匹配的时钟信号),RCLK(锁存器使能信号)

因此,想要在这片开发板上控制数码管显示,就得修改代码。

在上一次代码的基础上,把输出的16位并行数据转化为串行数据从DIO端口输出。(并行数据转串行数据:逐个输出即可)。

由于74HC595时钟信号频率与fpga芯片的时钟信号频率不相等,fpga芯片的时钟频率为50MHz,而74HC595时钟频率在不同的驱动电压下不同,在3.3VS可以达到6~30MHz,为了方便,我们可以根据fpga50MHz的时钟产生一个12.5MHz的信号作为74HC595的SCLK信号输入 。

为了数据传输的稳定,在传输串行数据时,我们可以在SCLK的低电平时刻从fpga中输出一个数据,在SCLK上升沿到来时输入到74HC595,这样子防止亚稳态的产生。

每16个数据传输完成后,再让锁存器使能信号有效,这样子一次性把16个数据从两片移位寄存器中传到锁存器中,输出给数码管。

对于74HC595芯片,其设计就是一个移位寄存器(实现串行数据转换为并行数据),如图所示:

16个输出Q并行输出。

module drive_digital_tube(clk,reset,data,s_en,DIO,sclk,rclk,s_done);input clk;//50MHzinput reset;input [15:0]data;input  s_en;output reg DIO;output reg sclk;output reg rclk;output reg s_done;reg [1:0]div_cnt;// 分频计数器,频率为25MHzalways@( posedge clk or negedge reset)beginif (!reset)div_cnt <= 2'd0 ;else if(div_cnt == 1)div_cnt <= 2'd0 ;elsediv_cnt <= div_cnt + 1'd1 ; endwire pulse25M; //频率为25MHz的取样脉冲assign pulse25M = ( div_cnt == 2'd1 ) ? 1 : 0 ;reg [5:0]cnt;//计数33个状态always@(posedge clk or negedge reset)beginif(!reset)cnt <= 6'd0 ;else if (s_en)beginif (pulse25M)beginif(cnt == 6'd33)cnt <= 6'd0 ; else cnt <= cnt + 1 ;endendelsecnt <= 6'd0 ;endalways@(posedge clk or negedge reset)beginif(!reset)beginDIO <= 0 ;sclk <= 0 ;rclk <= 0 ;s_done = 0 ;endelse if(s_en)           beginif (pulse25M)case(cnt)//sclk为12.5MHz信号,rclk为输出使能(所有数据取完后),在sclk的低电平时取值,可以稳定,在sclk上升沿到来时可稳定输出0:begin DIO <= 0 ;sclk <= 0 ;rclk <= 0 ;s_done = 0 ;end1: sclk <= 1 ;2:begin DIO <=data[15] ;sclk <= 0 ; end3:sclk <= 1 ;4:begin DIO <=data[14] ;sclk <= 0 ; end5:sclk <= 1 ;6:begin DIO <=data[13] ;sclk <= 0 ; end7:sclk <= 1 ;8:begin DIO <=data[12] ;sclk <= 0 ; end9:sclk <= 1 ;10:begin DIO <=data[11] ;sclk <= 0 ; end11:sclk <= 1 ;12:begin DIO <=data[10] ;sclk <= 0 ; end13:sclk <= 1 ;14:begin DIO <=data[9] ;sclk <= 0 ; end15:sclk <= 1 ;16:begin DIO <=data[8] ;sclk <= 0 ; end17:sclk <= 1 ;18:begin DIO <=data[7] ;sclk <= 0 ; end19:sclk <= 1 ;20:begin DIO <=data[6] ;sclk <= 0 ; end21:sclk <= 1 ;22:begin DIO <=data[5] ;sclk <= 0 ; end23:sclk <= 1 ;24:begin DIO <=data[4] ;sclk <= 0 ; end25:sclk <= 1 ;26:begin DIO <=data[3] ;sclk <= 0 ; end27:sclk <= 1 ;28:begin DIO <=data[2] ;sclk <= 0 ; end29:sclk <= 1 ;30:begin DIO <=data[1] ;sclk <= 0 ; end31:sclk <= 1 ;32:begin DIO <=data[0] ;sclk <= 0 ; rclk <= 1 ;end33:begin sclk <= 1 ; rclk <= 0 ;s_done = 1 ;enddefault ;           endcaseendelsebeginDIO <= 0 ;sclk <= 0 ;rclk <= 0 ;s_done = 0 ;endend    end
module
`timescale 1ns / 1ns
module drive_digital_tube_tb();reg clk ;reg reset;reg s_en;reg [15:0]data;wire DIO;wire sclk;wire rclk;wire s_done ;drive_digital_tube drive_digital_tube_sim(clk,reset,data,s_en,DIO,sclk,rclk,s_done);initial clk = 1;always #10 clk = ! clk ;initialbeginreset = 0 ;data = 0 ;s_en = 0 ;#201;reset = 1 ;s_en = 1 ;data = 16'ha55a;@(negedge s_done);s_en = 0;#200;s_en = 1;data = 16'h7597;@(negedge s_done);s_en = 0;#200;s_en = 1;data = 16'h6425;@(negedge s_done);$stop ;endendmodule

 注意:

①有的内部变量由于没有真正用上,在仿真时波形为X,会使结果错误。检查alyays里面有没有 posedge reset,没有的话可能会出现这种情况。

②对于输入的数据,最好拿一个寄存器把当下的值存下来(添加一个控制信号),再慢慢输出,不然可能会造成输入数据不稳定,传输结果错误。

③fpga与外部芯片连接的场景:大部分情况下需要fpga产生一个时钟信号来驱动外部芯片,因此,对于fpga既要提高数据又要提高时钟的情况,我们可以在自己提供的时钟的低电平时刻输出数据,这样子可以保证外部芯片输入数据的稳定,在时钟上升沿到来时已经稳定,不会产生亚稳态。

74HC595驱动(并转串,fpga与时钟匹配,fpga与外部芯片的连接注意事项)相关推荐

  1. 74HC595驱动四位数码管

    74HC595驱动四位数码管 数码管编码 出处 硬件原理图 出处 驱动程序 出处 1.数码管编码介绍 它每一段是一个发光二极管,排成一个"日"字形.通过控制某几段发光二极管的发光来 ...

  2. c语言595驱动数码管,74hc595驱动4位数码管电路连接图及程序解析 - 全文

    本设计使用了一个4位的数码管,为共阳型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口.74HC595部分电路图如下: 与单片机相连接的三个脚分别为: HC_D ...

  3. Arduino与Proteus仿真实例-74HC595驱动7段数码管仿真

    74HC595驱动7段数码管仿真 74HCT595 是一个 8 位串行输入/串行或并行输出移位寄存器,带有一个存储寄存器和三态输出.移位寄存器和存储寄存器都有独立的时钟.该器件具有串行输入 (DS) ...

  4. MicroPython-On-ESP8266——8x8LED点阵模块(2)使用74HC595驱动

    MicroPython-On-ESP8266--8x8LED点阵模块(2)使用74HC595驱动 1. 使用74HC595驱动的原理 1.1. 基础回顾 上篇我们学习了8x8LED点阵屏的电路基础知识 ...

  5. STM32F1与STM32CubeIDE编程实例-74HC595驱动4位7段数码管

    74HC595驱动4位7段数码管 1.74HC595介绍 74HCT595 是一个 8 位串行输入/串行或并行输出移位寄存器,带有一个存储寄存器和三态输出.移位寄存器和存储寄存器都有独立的时钟.该器件 ...

  6. 【 FPGA 】时钟简介

    时钟,时序逻辑的心跳 在时序逻辑中,正是时钟信号将各个存储单元中的数据一级一级地推动下去,如果时钟信号突然停止,那么整个时序逻辑也将陷入瘫痪,因此,时钟就好像时序逻辑的心跳一样,那么重要却又平常的存在 ...

  7. Xilinx FPGA全局时钟和第二全局时钟资源的使用方法

    目前,大型设计一般推荐使用同步时序电路.同步时序电路基于时钟触发沿设计,对时钟的周期.占空比.延时和抖动提出了更高的要求.为了满足同步时序设计的要求,一般在FPGA设计中采用全局时钟资源驱动设计的主时 ...

  8. led灯串怎么摆造型_如何驱动LED灯串小绝招

    也许有些人知道如何驱动LED灯串,可能就是采用大多数人都认同的一种大众化方法,但其实在这种大众化方法的背后其实还有许多人不知道的小绝招.今天小编就带你从其他地方入手更好的驱动led灯串. 在机械和电气 ...

  9. 定时器驱动数码管c语言程序,74hc595驱动数码管时间程序

    74hc595驱动数码管时间程序 这里是电路图: 下面是51单片机驱动74hc595芯片的程序: #include                            //包含51单片机的头文件 # ...

最新文章

  1. Spring JDBC整合
  2. 【NLP】简单学习一下NLP中的transformer的pytorch代码
  3. 程序员刚结婚3天,老婆疑似骗婚?聊天记录曝光,网友:拜金实锤
  4. Docker Harbor 2.3.4 集群 双主复制高可用镜像仓库
  5. 程序员的圣诞节后-零
  6. Django中的prefetch_related()函数优化
  7. JAVA高性能内存队列-disruptor
  8. 王通:网络营销人才必备的10种技能
  9. Dell笔记本周期性闪屏故障
  10. Android Canvas API总结和使用方法
  11. 机器人断指_揭秘我国机器人发展历程:从机械手到服务机器人
  12. PAT 1082 射击比赛 python
  13. 互联网思维之简约思维
  14. [E::hts_idx_push] NO_COOR reads not in a single block at the end 10 -1
  15. 从faces_glintasia的.rec数据集转换为jpg图片
  16. Android实现高斯模糊背景对话框,Android进行高斯模糊的简单实现
  17. 新手小白开始学习verilog(学习方法有点歪门邪道的,大佬勿喷( ̄▽ ̄)“)
  18. 对接华为存储iSCSI
  19. php 在线选座,捷西网络在线选座系统
  20. Android短视频开发

热门文章

  1. 铜陵学院计算机实验考试报告,铜陵学院课程实验报告1(江自信).doc
  2. KdPrint使用方法
  3. 如何正确使用笔记本电池
  4. Myeclipse CI 2019.4.x激活教程
  5. 大数据就在我们的日常生活中
  6. ModuleNotFoundError: No module named ‘lasagne‘ 解决方案
  7. 细节----函数返回局部变量
  8. oracle实例增加xml组件,使用Oracle SQL生成嵌套XML
  9. livy使用样例_使用Spark的REST服务Livy
  10. 一个跑酷小游戏的项目总结