当前位置:   article > 正文

16数码管静态显示(74hc_595)_digital中16段数码管

digital中16段数码管

一、数码管静态显示
1、数码管
数码管是一种半导体发光器件,其基本单元是发光二极管。
待显示内容 段码(二进制格式) 段码(十六进制格式)
在这里插入图片描述

6位8段数码管
在这里插入图片描述

2、74HC595
74HC595是一个8位串行输入、并行输出的位移缓存器。其内部具有8位移位寄存器和一个存储器,具有三态输出功能。
在这里插入图片描述

输入方式:seg[0]…seg[7] sel[7]…sel[0]
!在这里插入图片描述](https://img-blog.csdnimg.cn/20210123131322340.png)

端口作用
连接到FPGA上的端口有4个,分别是DS、SHCP、STCP、OE
MR:复位端,对数据进行清零,不接到FPGA芯片上面,直接接到vcc上,避免对数据清零
DS:将串行数据传送到移位寄存器中
SHCP:移位寄存器的时钟输入端,在上升沿时将输入的数据移入到移位寄存器中间,先进来的数据在最后面,最多输入8bit数据,如果超过8bit,比如14位,那么最前面输入的6位数据会通过Q7S端口输出,Q7S会与下一个74HC595芯片的DS相连接
STCP:存储寄存器时钟,控制8位的存储器,在上升沿时,将移位寄存器中的数据写入到8位存储器中。
OE:使能信号,低电平有效,当使能信号有效时,会将存储器中的数据通过端口传输出去。

二、实现
实现数码管从000000~FFFFFF的循环显示,每个显示0.5s

1、电路图
在这里插入图片描述

2、输入输出方式
在这里插入图片描述

3、整体框图
在这里插入图片描述

4、数码管显示部分
在这里插入图片描述

波形图
在这里插入图片描述

程序:

module seg_static
#(
    parameter CNT_MAX = 25'd24999999
)
(
    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; */

//cnt_wait:0.5秒计数
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 + 1'b1;

 //num:从 4'h0 加到 4'hf 循环       
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        data <= 4'd0;
    else if ((data == 4'd15)&&(cnt == CNT_MAX))
        data <= 4'd0;
    else if (cnt == CNT_MAX)//也可以使用标志信号进行控制
        data <= data + 1'b1;
    else
        data <= data;
        
//add_flag:0.5s拉高一个标志信号        
/* 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;  */

//sel:选中六个数码管       
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n ==1'b0)
        sel <= 6'd0;
    else
        sel <=  6'b111111;
//给要显示的值编码,段显示        
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        seg <= 8'hff;
    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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

5、hc595控制
在这里插入图片描述在这里插入图片描述

程序:

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:0]};

//分频计数器:0~3循环计数
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 + 1'b1;
        
//cnt_bit:每输入一位数据加一        
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 +1'b1;
    else
        cnt_bit <= cnt_bit;
        
//ds:将寄存器里存储的数码管信号输入即        
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;

//shcp:产生四分频移位时钟
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'b1;
    else 
        shcp <= 1'b0;

//stcp:14个信号传输完成之后产生一个上升沿  
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        stcp <= 1'b0;
    else if ((cnt_bit == 4'd0)&&(cnt == 2'd0))
        stcp <= 1'b1;
    else if ((cnt_bit == 4'd0)&&(cnt == 2'd2))
        stcp <= 1'b0;
    else
        stcp <= stcp;
 
//使能信号,低电平有效,所以一直为低电平 
 assign oe = 1'b0;   


endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

6、整体程序(将前面两个模块连接起来)

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'd24999999)
)
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

测试程序
对整体的框图进行编写测试程序

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


wire    stcp    ;   //输出数据存储寄时钟
wire    shcp    ;   //移位寄存器的时钟输入   
wire    ds      ;   //串行数据输入
wire    oe      ;   //输出使能信号


reg     sys_clk     ;
reg     sys_rst_n   ;


//对sys_clk,sys_rst_n赋初始值
initial
    begin
        sys_clk     =   1'b1;
        sys_rst_n   <=  1'b0;
        #100
        sys_rst_n   <=  1'b1;
    end

//clk:产生时钟
always  #10 sys_clk <=  ~sys_clk;

//-------------seg_595_static_inst-------------
//使用顶层模块的实例化
seg_595_static  seg_595_static_inst
(
    .sys_clk     (sys_clk   ),  //系统时钟,频率50MHz
    .sys_rst_n   (sys_rst_n ),  //复位信号,低电平有效

    .stcp        (stcp      ),   //输出数据存储寄时钟
    .shcp        (shcp      ),   //移位寄存器的时钟输入
    .ds          (ds        ),   //串行数据输入
    .oe          (oe        )    //输出使能信号
);

endmodule

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/738626
推荐阅读
相关标签
  

闽ICP备14008679号