上一次设计的动态扫描数码管显示电路模型如上,这是一个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. Ubuntu 系统安装,VMware

    系统版本   ubuntu-18.04.5-server-amd64.iso 1.自定义安装 2.默认下一步 3. 稍后安装操作系统 4.选择ubuntu 64位 5.选额安装的目录 6.设置虚拟机c ...

  2. 前端面试 -HTTP系列

    http和https 的区别? 端口 经济 安全性 响应速度 http 80端口 不需要 明文传输,安全性差 页面响应速度快,使用tcp的3次握手 https 443端口 费钱SSL需要ca 证书 S ...

  3. leetcode704二分查找

    title: 二分查找 题目描述 题目链接:二分查找 解题思路 二分模板默写 int search(vector<int>& nums, int target) { int lef ...

  4. Python技法:用argparse模块解析命令行选项

    1. 用argparse模块解析命令行选项 我们在上一篇博客<Linux:可执行程序的Shell传参格式规范>中介绍了Linux系统Shell命令行下可执行程序应该遵守的传参规范(包括了各 ...

  5. unity---判断物体碰撞的对象

    脚本效果 trrn对象为地面,排除这个选项

  6. 个人冲刺(四阶段)——体温上报app(一阶段)

    任务:完成了后台数据库的类模块 MyDBHelper.java package com.example.helloworld; import android.content.Context; impo ...

  7. 【单片机】使用 sscanf 提取AT命令返回结果中的有效数据

    摘要:1. sscanf函数 sscanf是C标准库函数,用于从字符串中读取格式化输入. 头文件: #include <stdio.h>函数原型如下: int sscanf(const c ...

  8. 我用 AntV/S2 买了一套房

    背景 经过一年多的摇号,我在前两天收到了某网红盘的摇中通知.还沉浸在摇中房屋喜悦中的我,很快被售房顾问告知选房的人很多,每位购房者的选房时间都很短,必须 一分钟内 快速选房.并且,排在 400 多号的 ...

  9. 使用kubeseal加密和管理k8s集群的secret

    使用kubeseal加密和管理k8s集群的secret 在k8s的管理过程中,像secret这种资源并不好维护,kubeseal提供了一种相对简单的方式来对原始secret资源进行加密,并通过控制器进 ...

  10. camunda流程引擎概念术语

    前言 本文重点介绍开源流程引擎camunda的核心概念,这些概念同样适用于JBMP.Activiti.Flowable流程引擎,了解这些基本概念和原理,使用流程引擎API将更得心应手. 一.Proce ...