74HC595,移位寄存器,串行输入,8位并行输出,一般用于数码管电路以减少使用的IO口数量。


管脚介绍:

Q0~Q7 :八位并行输出位

Q7'       :  级联位,若输入位数大于8位,先进入的位会从此口连续输出,用于多片之间的级联

VCC GND 不多介绍

Ds        :  串行数据输入位

OE       : 输出使能位,低有效,一般直接全程给低电平就行

SHcp   :  移位寄存器时钟输入,后文详述

STcp    :  存储寄存器时钟输入,同上

MR      : 主复位,低有效,一般直接接到VCC拉高


上图为74HC595内部结构,一个8位的移位寄存器,一个8位的存储寄存器,再有一个8位的并行输出。

为讲明Q7'的级联作用,此处应用场景选择为:6位8段数码管,驱动此数码管共需要8位段选端和6位位选端,共14位串行数据输入。

Ds数据输入端串行输入时,在SHcp的上升沿将数据移入移位寄存器内,每个SHcp上升沿移入一位单bit数据,最先输入的一直向后移直到8个SHcp上升沿后,移位寄存器填满,此时若数据输入端还有数据输入,下一个SHcp上升沿到来时,最先输入的1bit数据就会从Q7'输出(此处可理解为队列,先进先出)。在STcp的上升沿,数据会从移位寄存器进入存储寄存器中,当OE低有效时,存储寄存器中的值从Q0~Q7并行输出。

上述应用场景下,将第一片74HC595的Q7‘串行输出端接到第二片的数据输入端Ds,实现级联功能。经过14个时钟SHcp上升沿后,数据已经全部移位进入移位寄存器,一次共输入14位数据,那么第一位输入的串行数据会在第二片74HC595芯片的Q5输出,此时给一个上升沿的STcp信号就可以将信号移入存储寄存器,OE信号持续给低, 即可输出。

上述过程中还存在一个问题,SHCP频率给多少合适?它是有限制的

我实验板子的电压为3.3V,取图中2V的亦可,采用50MHZ的四分频12.5MHZ作为SHCP时钟,计数SHCP时钟上升沿,14个上升沿给出一个STCP的上升沿作为STCP时钟,相当于STCP时钟是SHCP时钟的14分频。

主要难点就在于SHCP和STCP时钟的获得,其他的按步骤来即可。

代码如下,需者自取(静态数码管)

`timescale 1ns/1nsmodule seg_static(input sys_clk,input sys_rst_n,output reg [7:0]seg,output reg [5:0]sel
);parameter seg_0 = 8'hc0,seg_1 = 8'hf9,seg_2 = 8'ha4,seg_3 = 8'hb0,seg_4 = 8'h99,seg_5 = 8'h92,seg_6 = 8'h82,seg_7 = 8'hf8,seg_8 = 8'h80,seg_9 = 8'h90,seg_a = 8'h88,seg_b = 8'h83,seg_c = 8'hc6,seg_d = 8'ha1,seg_e = 8'h86,seg_f = 8'h8e;parameter cnt_500ms = 25'd24_999_999 ;
//parameter cnt_500ms = 25'd32_999_999 ;      reg [24:0]cnt;
reg [3:0]num;always@(posedge sys_clk or negedge sys_rst_n)          if(sys_rst_n==1'b0)  cnt <= 25'd0;else if(cnt==cnt_500ms)cnt <= 25'd0;else cnt <= cnt + 1'b1;always@(posedge sys_clk or negedge sys_rst_n)          if(sys_rst_n==1'b0)  num <= 4'd0;else if(num==4'd15 && cnt==cnt_500ms)num <= 4'd0;else if(cnt==cnt_500ms)num <= num + 1'b1; else num <= num;always@(posedge sys_clk or negedge sys_rst_n)          if(sys_rst_n==1'b0)  seg <= 8'b1111_1111;elsecase(num)          0 : seg <= seg_0;1 : seg <= seg_1;2 : seg <= seg_2;3 : seg <= seg_3;4 : seg <= seg_4;5 : seg <= seg_5;6 : seg <= seg_6;7 : seg <= seg_7;8 : seg <= seg_8;9 : seg <= seg_9;10 : seg <= seg_a;11 : seg <= seg_b;12 : seg <= seg_c;13 : seg <= seg_d; 14 : seg <= seg_e; 15 : seg <= seg_f; default : seg <= 8'b1111_1111;   endcasealways@(posedge sys_clk or negedge sys_rst_n)          if(sys_rst_n==1'b0)  sel <= 6'b0;else sel <= 6'b111_111;         endmodule
`timescale  1ns/1nsmodule hc595_ctrl(input sys_clk,input sys_rst_n,input wire [7:0]seg,input wire [5:0]sel,output reg shcp,output reg stcp,output reg ds,output wire oe
);reg [1:0]cnt_4;
reg [3:0]cnt_14;wire [13:0]data;assign data = {seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel};always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)cnt_4 <= 2'b0;else if(cnt_4==2'd3)cnt_4 <= 2'b0;else cnt_4 <= cnt_4 + 1'b1;//sys_clk的四分频当作shcp时钟
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)shcp <= 1'b0;else if(cnt_4 <= 2'd1)shcp <= 1'b0;else  shcp <= 1'b1;//产生stcp时钟
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)cnt_14 <= 4'b0;else if(cnt_14==4'd13 && cnt_4==2'd3)cnt_14 <= 4'b0;else if(cnt_4==2'd3)cnt_14 <= cnt_14 + 1'b1;else cnt_14 <= cnt_14;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)stcp <= 1'b0;else if(cnt_14==4'd13 && cnt_4==2'd3)stcp <= 1'b1;else stcp <= 1'b0;//产生ds信号always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)ds <= 1'b0;else if(cnt_4==2'd0)ds <= data[cnt_14];else ds <= ds;//产生oe信号assign oe = ~sys_rst_n;endmodule
`timescale  1ns/1nsmodule smg_static(input  sys_clk,input  sys_rst_n,output shcp,output stcp,output oe,output ds
);wire [7:0]seg;
wire [5:0]sel;seg_static seg_static_inst(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.seg(seg),.sel(sel));hc595_ctrl hc595_ctrl_inst(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.seg(seg),.sel(sel),.shcp(shcp),.stcp(stcp),.ds(ds),.oe(oe)
);endmodule

动态数码管随缘更新

74HC595工作原理及FPGA实现数码管驱动方法相关推荐

  1. 51单片机LED点阵控制原理、74HC595工作原理和字母和滚动显示实验代码

    目录 1. 74HC595工作原理图解 2.LED点阵控制原理 3.点阵LED实验 3.1 配置74HC595代码 3.2 D点阵LED显示H 3.3 滚动LED (1) 滚动扫描图示 (2)程序代码 ...

  2. FIFO工作原理以及读写完成标识和判断方法

    FIFO工作原理 根据FIFO工作的时钟域分为同步/异步FIFO.同步FIFO是指读时钟和写时钟为同一个时钟在时钟沿来临时同时发生读写.异步FIFO读写时钟不一致,读写相互独立. 1.读写指针的工作原 ...

  3. linux下nand flash驱动工作原理,1.3.4. Nand flash驱动工作原理

    1.3.4. Nand flash驱动工作原理 在介绍具体如何写Nand Flash驱动之前,我们先要了解,大概的整个系统,和Nand Flash相关的部分的驱动工作流程,这样,对于后面的驱动实现,才 ...

  4. FPGA概念、芯片结构、工作原理、开发流程以及xilinx公司主要可编程芯片

    一.FPGA概念 可编程逻辑器件(Programmable Logic Device,PLD) 专用集成电路(Application Specific Integrated Circuit,ASIC) ...

  5. 伺服怎么接单相220伏_乐利网带你认识伺服电机及工作原理

    什么是伺服电机,应该听过人的不少,没听过的也占不少数,其实,伺服电机是指在伺服系统中控制机械元件运转的发动机,是一种补助马达间接变速装置. 伺服电机可使控制速度,位置精度非常准确,可以将电压信号转化为 ...

  6. ntnub原理怎么看_电锤只转不冲击怎么回事?看懂了工作原理,你也可以动手解决...

    电锤是我们在装修中常用到的电动工具,主要用来在混凝土.楼板.砖墙和石材上钻孔,下面我们来看看电锤的工作原理和常见的故障以及修理方法. 电锤内部结构动图 电锤工作原理动图 电锤工作时电机一方面通过齿轮减 ...

  7. Android中AMS工作原理,Android AMS启动详解

    启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...

  8. 步进电机工作原理与编程

    步进电机工作原理与编程 本章将介绍在嵌入式平台UP-NETARM2410-S中步进电机的实现.步进电机在各个领域诸如机器人.智能控制.工业控制等方面都有着广泛的应用空间,本章着重介绍步进电机的工作原理 ...

  9. 【转】视频分割器的工作原理及异常解决

    在有多个视频源组成的视频系统中,通常采用视频切换器使多路图像在一台显示设备上轮流显示.但有时为了让监控人员能同时看到所有监控点的情况,往往采用多视频分割器使得多路图像同时显示在一台显示设备上.当采用几 ...

最新文章

  1. 合肥工业大学—SQL Server数据库实验二:数据库架构的创建与使用
  2. MFC多线程同步互斥
  3. go如何使web工作
  4. 计算机故障的分析原理,蓝屏含义、原理分析、处理方法 电脑计算机故障系统安全...
  5. java 异步调用 shell_Java 实现异步调用
  6. 阿里开发者招聘节 | 面试题08:NAS(Network Attached Storage)协议NFS和SMB相关问题
  7. ASP.NET MVC 多语言开发简单案例
  8. 第零课、开启ce自身保护、设置od,让调试不非法
  9. 机器学习实践测试驱动的开发方法pdf
  10. 关于MySQL latch争用深入分析与判断
  11. 超好用的Redis管理及监控工具treeNMS
  12. 字体在ppt中可以整体替换吗_在ppt中怎么批量替换字体和图片呢?
  13. 微信小程序:map组件的简单使用,标注callout与label简单用法
  14. 网站Cache全分析
  15. BEV蒸馏来了!BEVDistill:用于多目3D目标检测的跨模态BEV蒸馏
  16. xinxin--小爱同学
  17. Ubuntu18.04打开关闭DNS服务
  18. Uncaught TypeError: Cannot read property ‘then‘ of undefined
  19. 解决极客时间网页文字无法选中或复制copy
  20. mysql使用博客_mysql使用

热门文章

  1. LeetCode常用算法模式大厂面试题整理
  2. CDH主机网络接口似乎未以全速运行
  3. ​PDF如何转换成Word文档?分享两种好用的转换方法
  4. StarUML使用说明—用例图、时序图、活动图
  5. 自我总结--测试面试常见问题(二)
  6. 开源任务管理平台TaskManager介绍
  7. part1-CST建模
  8. coreldraw x8重新安装失败解决办法
  9. PS cc 2018分享
  10. 【评测】SF9/SF21昆虫细胞培养基