上一次设计的动态扫描数码管显示电路模型如上,这是一个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;//50MHz
input 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;// 分频计数器,频率为25MHz
always@( posedge clk or negedge reset)
begin
if (!reset)
div_cnt <= 2'd0 ;
else if(div_cnt == 1)
div_cnt <= 2'd0 ;
else
div_cnt <= div_cnt + 1'd1 ;
end wire pulse25M; //频率为25MHz的取样脉冲
assign pulse25M = ( div_cnt == 2'd1 ) ? 1 : 0 ; reg [5:0]cnt;//计数33个状态
always@(posedge clk or negedge reset)
begin
if(!reset)
cnt <= 6'd0 ;
else if (s_en)
begin
if (pulse25M)
begin
if(cnt == 6'd33)
cnt <= 6'd0 ;
else
cnt <= cnt + 1 ;
end
end
else
cnt <= 6'd0 ;
end always@(posedge clk or negedge reset)
begin
if(!reset)
begin
DIO <= 0 ;
sclk <= 0 ;
rclk <= 0 ;
s_done = 0 ;
end
else if(s_en)
begin
if (pulse25M)
case(cnt)//sclk为12.5MHz信号,rclk为输出使能(所有数据取完后),在sclk的低电平时取值,可以稳定,在sclk上升沿到来时可稳定输出
0:begin DIO <= 0 ;sclk <= 0 ;rclk <= 0 ;s_done = 0 ;end
1: sclk <= 1 ;
2:begin DIO <=data[15] ;sclk <= 0 ; end
3:sclk <= 1 ;
4:begin DIO <=data[14] ;sclk <= 0 ; end
5:sclk <= 1 ;
6:begin DIO <=data[13] ;sclk <= 0 ; end
7:sclk <= 1 ;
8:begin DIO <=data[12] ;sclk <= 0 ; end
9:sclk <= 1 ;
10:begin DIO <=data[11] ;sclk <= 0 ; end
11:sclk <= 1 ;
12:begin DIO <=data[10] ;sclk <= 0 ; end
13:sclk <= 1 ;
14:begin DIO <=data[9] ;sclk <= 0 ; end
15:sclk <= 1 ;
16:begin DIO <=data[8] ;sclk <= 0 ; end
17:sclk <= 1 ;
18:begin DIO <=data[7] ;sclk <= 0 ; end
19:sclk <= 1 ;
20:begin DIO <=data[6] ;sclk <= 0 ; end
21:sclk <= 1 ;
22:begin DIO <=data[5] ;sclk <= 0 ; end
23:sclk <= 1 ;
24:begin DIO <=data[4] ;sclk <= 0 ; end
25:sclk <= 1 ;
26:begin DIO <=data[3] ;sclk <= 0 ; end
27:sclk <= 1 ;
28:begin DIO <=data[2] ;sclk <= 0 ; end
29:sclk <= 1 ;
30:begin DIO <=data[1] ;sclk <= 0 ; end
31:sclk <= 1 ;
32:begin DIO <=data[0] ;sclk <= 0 ; rclk <= 1 ;end
33:begin sclk <= 1 ; rclk <= 0 ;s_done = 1 ;end
default ;
endcase
end
else
begin
DIO <= 0 ;
sclk <= 0 ;
rclk <= 0 ;
s_done = 0 ;
end
end 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 ;
initial
begin
reset = 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 ;
end endmodule

 注意:

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

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

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

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

  1. 关于 FPGA 和 外部芯片接口时序设计

    在看这篇文章之前, 建议先好好读下这篇文章.http://download.csdn.net/detail/angelbosj/8013827. 因为我不太会用 VISio.要是哪位网友能告诉我.怎么 ...

  2. FPGA的时钟质量对设计的影响

    小梅哥编写,未经许可严禁用于任何商业用途 近期,一直在调试使用Verilog编写的以太网发送摄像头数据到电脑的工程(以下简称以太网图传).该工程基于今年设计的一款FPGA教学板AC620.AC620上 ...

  3. Xilinx FPGA全局时钟和全局时钟资源的使用方法

    对FPGA的全局时钟了解不多,遂转载一篇文档: http://xilinx.eetop.cn/?action-viewnews-itemid-42 目前,大型设计一般推荐使用同步时序电路.同步时序电路 ...

  4. FPGA多时钟处理应用

    FPGA项目设计中,通常会遇到多时钟处理.即一个PLL输出多个时钟,根据条件选择合适的时钟用作系统时钟.方案一: 外部晶振时钟进入PLL,由PLL输出多个时钟,MUX根据外部条件选择时钟输出做为系统使 ...

  5. 7系列FPGA的时钟资源——UG472

    时钟架构总览 7系的FPGA使用了专用的全局(Global)和区域(Regional)IO和时钟资源来管理设计中各种的时钟需求.Clock Management Tiles(CMT)提供了时钟合成(C ...

  6. xilinx FPGA全局时钟资源的使用

    1.什么是xilinx fpga全局时钟资源 时钟对于一个系统的作用不言而喻,就像人体的心脏一样,如果系统时钟的抖动.延迟.偏移过大,会导致系统的工作频率降低,严重时甚至会导致系统的时序错乱,实现不了 ...

  7. FPGA异步时钟设计中的同步策略

    1 引言    基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...

  8. FPGA跨时钟域握手信号的结构

    FPGA跨时钟数据传输,是我们经常遇到的问题的,下面给出一种跨时钟握手操作的电路结构.先上图 先对与其他人的结构,这个结构最大的特点是使用 req 从低到高或者高到低的变化 来表示DIN数据有效并开始 ...

  9. FPGA开发时钟资源评估需要考虑的问题

    在第一个独立开发的FPGA项目中,使用了Altera平台的三速以太网IP,工作在100M模式下,外部输入的PHY时钟频率为25MHz. 由于在前期没有注意这个外部输入的时钟,导致最后不得不在板子上飞线 ...

随机推荐

  1. EdgeFormer: 向视觉 Transformer 学习,构建一个比 MobileViT 更好更快的卷积网络

    ​  前言 本文主要探究了轻量模型的设计.通过使用 Vision Transformer 的优势来改进卷积网络,从而获得更好的性能. 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结.最新技术跟 ...

  2. js项目案例

    2021.04.12 --mouseover抖动情况之一

  3. 『忘了再学』Shell基础 — 14、环境变量(二)

    目录 1.PS1变量的作用 2.PS1变量的查看 2.PS1可以支持的选项 3.PS1环境变量的配置 4.总结 提示: 在Linux系统中,环境变量分为两种.一种是用户自定义的环境变量,另一种是系统自 ...

  4. 好客租房49-组件的props(特点)

    特点 1可以给组件传递任意类型的数据 2props是只读的对象 只能读取属性的值 无法修改对象 3注意:使用类组件时 如果写了构造函数 应该将props传递给super() 否则 无法在构造函数 中获 ...

  5. Django序列化组件与数据批量操作与简单使用Forms组件

    目录 SweetAlert前端插件 Django自带的序列化组件 批量数据操作 分页器与推导流程 Forms组件之创建 Forms组件之数据校验 Forms组件之渲染标签 Forms组件之信息展示 S ...

  6. cut-列过滤

    列过滤命令. 语法 cut [选项] 要过滤的字符串 选项 -f 以字段为单位进行分割 -c 以字符为单位进行分割 -b 以字节为单位进行分割 -d 以分割符为单位进行分割,分隔符可以是"冒 ...

  7. Python模块Ⅰ

    Python模块Ⅰ part1 模块的定义/取别名 自定义模块 什么是模块:模块的本质就是.py文件,封装语句的最小单位 模块中出现的变量,for循环,if结构,函数定义...称为模块成员 模块的运行 ...

  8. Python使用EasyOCR库对行程码图片进行OCR文字识别介绍与实践

    关注「WeiyiGeek」点我,点我 设为「特别关注」,每天带你在B站玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录 0x00 ...

  9. 构建基于React18的电子表格程序

    背景 2022年3月29日,React正式发布18.0.0.本次升级内容包括开箱即用的改进,如自动批处理.新的API(如startTransition)和支持Suspense 的流式服务器端渲染.关于 ...

  10. c++ FHQ Treap

    前面我们对平衡树有了个大概的了解 关于 Treap Treap=Binary Search Tree + Heap 二叉搜索树 + 二叉堆(一般是小根堆) Treap 每一个节点有两个值 一个值是平衡 ...