FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

这篇具有很好参考价值的文章主要介绍了FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数码管静态显示seg_595_static

数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数一般分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显示)。

实验原理

八段数码管是一个八字型数码管,分为八段:a、b、c、d、e、f、g、dp,其中dp为小数点,每一段即为一个发光二极管,这样的八段我们称之为段选信号。数码管常用的有10根管脚,每一段有一根管脚,另外两根管脚为一个数码管的公共端,两根互相连接。
FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

数码管分为共阳极数码管和共阴极数码管。共阳极数码管就是把发光二极管的正极连接在一起作为一个引脚,负极分开。相反的,共阴极数码管就是把发光二极管的阴极连接在一起作为一个引脚,正极分开。这两者的区别在于,公共端是连接到地还是高电平,对于共阳极数码管需要给对应段低电平才会使其点亮,而对于共阴极数码管则需要 给其高电平才会点亮。本次实验使用的是共阳极数码管,也就是说给对应段低电平才会被点亮。给不同的段点亮可显示0~f的值。
FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

二进制段码右边为高位左边为低位。我们只要点亮相应的段码,就能显示我们需要显示的内容。

段式数码管工作方式有两种:静态显示和动态显示。静态显示的特点是每个数码管的段选必须接一个8位数据线来显示字形,显示字形可一直保持,直到送入新字形码为止。
FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

74HC595

FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

引脚名 引脚编号 引脚功能
Q0—Q7 15,1—7 并行数据输出
GND 8 电源地
Q7S 9 串行数据输出
10 主复位(低电平有效)
SHCP 11 移位寄存器时钟输入
STCP 12 存储寄存器时钟输入
13 输出使能输入(低电平有效)
DS 14 串行数据输入
VCC 16 电源电压

该芯片有个并行的数据输出,同时芯片的输入是串行数据,也就是说我们使用一个串行输入口就可以并行输出八个输入的串行数据。最先输入的数据会被移位到最后位进行输出。

总结一下74HC595的使用步骤:

  1. 首先把要传输的数据通过引脚DS输入到74HC595中。
  2. 产生SHCP时钟,将DS上的数据串行移入移位寄存器。
  3. 产生STCP时钟,将移位寄存器里的数据送入存储寄存器。
  4. 将引脚置为低电平,存储寄存器的数据会在Q0—Q7并行输出,同时并行输出的数据会被锁存起来。

实验框图、波形图与代码原理

控制六位数码管实现000000、111111到FFFFFF每隔0.5s循环显示。
FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

模块名称 功能描述
seg_static 静态数码管驱动模块
hc595_ctrl 74HC595控制模块
seg_595_static 数码管静态显示顶层模块

接下来各个模块分别讨论
FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

cnt计数器每0.5s技术到最大值,同时产生cnt_flag标志信号用于控制数码管字符的跳转。sel:数码管的位选信号。我们是显示六个数码管,直接给其全点亮即可。seg:数码管的段选信号,给其相应段码点亮显示num里的值即可。

该模块的参考代码

module  seg_static
#(
    parameter   CNT_MAX=25'd24_999_999

)
(
    input   wire    sys_clk     ,
    input   wire    sys_rst_n   ,
                                
    output  reg     [5:0]   sel ,
    output  reg     [7:0]   seg 
    
);
reg     [24:0]  cnt;
reg     [3:0]   data;
reg             cnt_flag;

always@(posedge sys_clk or  negedge sys_rst_n)
    if(sys_rst_n==1'b0)
        cnt<=25'd0;
    else    if(cnt==CNT_MAX)
                cnt<=25'd0;
            else    
                cnt<=cnt+25'd1;
                
always@(posedge sys_clk or  negedge sys_rst_n)
    if(sys_rst_n==1'b0)   
        cnt_flag<=1'b0;
    else    if(cnt==CNT_MAX-25'd1)
                cnt_flag<=1'b1;
            else
                cnt_flag<=1'b0;
                
always@(posedge sys_clk or  negedge sys_rst_n)
    if(sys_rst_n==1'b0)   
        data<=4'd0;
    else    if((data==4'd15)&&(cnt_flag==1'b1))
                data<=4'd0;
            else    if(cnt_flag==1'b1)
                    data<=data+4'd1;
                    else    
                    data<=data;

always@(posedge sys_clk or  negedge sys_rst_n)
    if(sys_rst_n==1'b0)  
        sel<=6'b000_000;
    else    sel<=6'b111_111;
    
always@(posedge sys_clk or  negedge sys_rst_n)
    if(sys_rst_n==1'b0) 
        seg<=8'hc0;
    else    case(data)
            4'd0:seg<=8'hc0;
            4'd1:seg<=8'hf9;
            4'd2:seg<=8'ha4;
            4'd3:seg<=8'hb0;
            4'd4:seg<=8'h99;
            4'd5:seg<=8'h92;
            4'd6:seg<=8'h82;
            4'd7:seg<=8'hf8;
            4'd8:seg<=8'h80;
            4'd9:seg<=8'h90;
            4'd10:seg<=8'h88;
            4'd11:seg<=8'h83;
            4'd12:seg<=8'hc6;
            4'd13:seg<=8'ha1;
            4'd14:seg<=8'h86;
            4'd15:seg<=8'h8e;
            default:seg<=8'hff;
            endcase
endmodule

FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static

sys_clk 1bit Input 系统时钟,频率50MHz
sys_rst_n 1bit Input 复位信号,低有效
sel 6bit Input 数码管位选信号
seg 8bit Input 数码管段选信号
stcp 1bit Output 存储寄存器时钟
shcp 1bit Output 移位寄存器时钟
ds 1bit Output 串行数据
oe 1bit Output 输出使能,低有效

本实验我们使用系统时钟(50MHz)四分频得到的shcp时钟(12.5MHz)去进行驱动,而stcp时钟是在我们串行输入14位数 码管之后拉高的,其频率远远小于shcp,所以这里我们只要确定shcp的频率即可,至于oe信号我们一直让其拉低即可。

该部分代码

module  hc595_ctrl
(
    input   wire    sys_clk     ,
    input   wire    sys_rst_n   ,
    input   wire    [5:0]   sel ,
    input   wire    [7:0]   seg ,
    
    output  reg     ds          ,
    output  reg     shcp        ,
    output  reg     stcp        ,
    output  wire     oe          
);
wire    [13:0]     data ;
reg     [1:0]      cnt  ;
reg     [3:0]      cnt_bit;
 
assign  data={seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel[5],sel[4],sel[3],sel[2],sel[1],sel[0]};

always@(posedge sys_clk or negedge  sys_rst_n)
    if(sys_rst_n==1'b0)
        cnt<=2'd0;
    else    if(cnt==2'd3)
            cnt<=2'd0;
            else
            cnt<=cnt+2'd1;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
        cnt_bit<=4'b0;
    else    if((cnt_bit==4'd13)&&(cnt==2'd3))
            cnt_bit<=4'b0;
            else    if(cnt==2'd3)
                    cnt_bit<=cnt_bit+4'd1;
                    else
                    cnt_bit<=cnt_bit;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    ds<=1'b0;
    else    if(cnt==2'd0)
            ds<=data[cnt_bit];
            else
            ds<=ds;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    shcp<=1'b0;
    else    if(cnt==2'd2)
            shcp<=1'd1;
            else   if(cnt==2'd0) 
                    shcp<=1'd0;
                    else    
                    shcp<=shcp;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n==1'b0)
    stcp<=1'd0;
    else    if((cnt_bit==4'd0)&&(cnt==2'd0))
            stcp<=1'd1;
            else    if((cnt_bit==4'd0)&&(cnt==2'd2))
                    stcp<=1'd0;
                    else
                    stcp<=stcp;
                    
            
assign oe=1'b0;
            

endmodule

顶层模块代码

module  seg_595_static
(
    input   wire    sys_clk     ,
    input   wire    sys_rst_n   ,
    
    output  wire    ds          ,
    output  wire    shcp        ,
    output  wire    stcp        ,
    output  wire    oe          

);

wire    [5:0]   sel ;
wire    [7:0]   seg ;

seg_static
#(
    .CNT_MAX(25'd24_999_999)

)
seg_static_inst
(
   .sys_clk    (sys_clk   ),
   .sys_rst_n  (sys_rst_n ),
                
   .sel        (sel       ),
   .seg        (seg       )
    
);

hc595_ctrl  hc595_ctrl_inst
(
    .sys_clk     (sys_clk     ),
    .sys_rst_n   (sys_rst_n   ),
    .sel         (sel         ),
    .seg         (seg         ),

    .ds          (ds          ),
    .shcp        (shcp        ),
    .stcp        (stcp        ),
    . oe         ( oe         ) 
);
endmodule

仿真代码文章来源地址https://www.toymoban.com/news/detail-478138.html

`timescale  1ns/1ns
module  tb_seg_595_static();

reg     sys_clk     ;
reg     sys_rst_n   ;

wire    ds          ;
wire    shcp        ;
wire    stcp        ;
wire     oe         ;


initial 
    begin   
        sys_clk=1'b0    ;
        sys_rst_n<=1'b0  ;
        #20
        sys_rst_n<=1'b1  ;
  
    end
always #10 sys_clk=~sys_clk;

seg_595_static  seg_595_static_inst
(
    .sys_clk    (sys_clk  ),
    .sys_rst_n  (sys_rst_n),
   
    .ds         (ds       ),
    .shcp       (shcp     ),
    .stcp       (stcp     ),
    .oe         (oe       )

);
endmodule

到了这里,关于FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 4位数码管和74HC595

            在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共有12个IO口。         当选择数码管1显示的时候,这可以

    2024年04月17日
    浏览(99)
  • 【基础知识】【模块介绍】8位8段数码管(74HC595)【硬件部分】

    数码管实际上是 多个LED按照一定顺序排列,并加上遮罩所构成的元件。 八段一般会引出9个引脚,其中7个引脚显示数字(或某些字母),1个显示小数点,1个作为片选端。 根据连接方式的不同,数码管分为共阳和共阴。 共阳在这端输出低电平时点亮,高电平时会熄灭,共阴

    2023年04月17日
    浏览(81)
  • STM32 HAL库实现三位数码管显示(74HC595+按键+蜂鸣器)

    1、加强数码管学习,实现数码显示变量数据(三位数的显示); 2、3位数码+2个按键+蜂鸣器实现模拟电磁炉功率调节及显示; 关于74HC595的STM32F103的驱动以及数码的显示等请查阅我写的上一篇博客:https://blog.csdn.net/luojuan198780/article/details/136653377 实验效果参考下面网址视频:

    2024年03月17日
    浏览(86)
  • 51单片机通过两片74HC595级联,用8位LED数码管,分别显示当前日期,如:“2”、“0”、“-”、“0”、“5”、“-”、“2”、“6”,用Proteus仿真实现。

    1.先上仿真图,但这么连仿真图是不太正确的,要注意。展示的话能用就行。 2.从上到下依次放上数据手册上的引脚解释和逻辑功能和时序图    3.贴上代码:写了发送一字节数据函数,发送全部字节函数,加上一些写了很久的解释(求赞)。

    2024年02月08日
    浏览(61)
  • 51单片机---编程实现流水灯----键盘控制数码管显示--利用74LS164扩展并行输出口---定时中断方式驱动一个数码管

    目录 基于51单片机,用c语言编程实现流水灯 代码: 使用C语言编写的基于51单片机的键盘控制数码管显示 代码: 基于51单片机,用c语言编程实现利用74LS164扩展并行输出口 代码: 基于51单片机,用c语言编程实现定时中断方式驱动一个数码管  代码:  1- 2- 上述代码中,使用

    2024年02月16日
    浏览(51)
  • 【Multisim仿真】74LS47译码器驱动共阳数码管显示(0-8)数字显示

    🎬Multisim仿真演示 📑74ls47引脚功能 LT: 试灯输入,是为了检查数码管各段是否能正常发光而设置的。当LT=0时,无论输入A3,A2,A1,A0 为何种状态,译码器输出均为低电平,也就是七段将全亮,若驱动的数码管正常,是显示8。 BI: 灭灯输入,是为控制多位数码显示的灭灯所

    2024年02月17日
    浏览(276)
  • 基于MAX-10 FPGA 读取超声波模块HC_SR04距离数据到数码管上

    将MAX-10小脚丫FPGA和超声波模块HC_SR04插在面包板上,用杜邦线将对应的引脚连接好,烧录程序,小脚丫自带的数码管显示距离数据(单位是厘米)。 这张图拍花了,数码管显示的数据是18CM HC-SR04是一种基于超声波的测距模块。该模块向前15度内发送超声波并接收回响,通过发

    2024年02月14日
    浏览(42)
  • FPGA 驱动数码管动态显示(Verilog&Vivado)

    应用实例: (1)使用串口发送实现ACX720开发板时钟显示 本章将实现 FPGA 驱动数码管动态显示并提取出实现的电路结构,从电路结构入手编写代码,仿真对设计进行验证。最终板级调试时使用 Virtual Input/Output(VIO,虚拟输入/输出端口工具),输入需要显示的数据,数码管则显

    2023年04月12日
    浏览(57)
  • FPGA学习—数码管显示

    数码管动态显示采用了人眼暂存的原理,即时分复用,在数码管实现动态显示。 整个实验设计流程框架如下图所示: 开发板采用共阳极数码管,即低电平点亮。 本实验准备设计一个定时器,6为数码管显示24小时制的时间,所以编写一个计数模块。 改变变量COUNT的数值,可实

    2024年02月09日
    浏览(45)
  • [FPGA 学习记录] 数码管动态显示

    数码管动态显示 在上一小节当中,我们对数码管的静态显示做了一个详细的讲解;但是如果单单只掌握数码管的静态显示这种显示方式是远远不够的,因为数码管的静态显示当中,被选中的数码位它们显示的内容都是相同的,这种显示方式在我们的实际应用当中显然是不合适

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包