FPGA_数码管显示

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

1,数码管介绍

一位数码管:

FPGA_数码管显示,fpga开发

数码管等效电路(共阴极 和 共阳极)

FPGA_数码管显示,fpga开发

数码管显示的值:

FPGA_数码管显示,fpga开发

假设我们需要b,c亮,我们只需要给b,c接高电平,其他接低电平就可。

seg[7:0]  = 8'b0000_0110

FPGA_数码管显示,fpga开发

对于数码管显示的值,seg值如下图:

FPGA_数码管显示,fpga开发

多位数码管----->如下图(以3位为例)

FPGA_数码管显示,fpga开发

假设现在需要LED1亮,那么就让sel0为1,数码管0的LED0-LED7阳极都是高电平,然后再控制a为低电平,那么就实现了数码管0的LED0点亮。

如果是8个数码管呢

8个sel信号

FPGA_数码管显示,fpga开发FPGA_数码管显示,fpga开发

2,位选输出

这个规律就是3-8译码器  我们要按顺序点亮每一位,就需要1个3位的计数器(控制位切换信号):

FPGA_数码管显示,fpga开发

利用人眼视觉暂留效应,得到多个数码管同时点亮的效果

FPGA_数码管显示,fpga开发

每个数码管20ms带点亮一次,我们有8个数码管,那么数码管的切换时间就是20/8=2.5ms,保险一点改为1ms切换一个数码管。

FPGA_数码管显示,fpga开发

1ms计时就设计一个1ms的计数器(预留位宽大一点30位)

FPGA_数码管显示,fpga开发

设计一个比较器,当技术达到指定要求就输出1,当作cnt_sel的时钟使能信号以及自己本身计数的清0信号。

FPGA_数码管显示,fpga开发

现在就可以实现8位数码管位选输出了。

3,段选输出

使用查找表形式在实现所要显示的字符。

所谓查找表就是,我预先设定好一个表,在每个表项里面存放需要输出的具体值。把每个字符输出的段码存放在表里面,然后把每个字符的显示内容作为查找表的索引号,只要给出索引号,就能查出对应的值。

FPGA_数码管显示,fpga开发

16个索引号 4位数据表示temp_data[3:0]

FPGA_数码管显示,fpga开发

根据当前动态扫描,正在扫描在哪个数码管,就将这个数码管需要显示的内容送到查找表的输入端口去,将需要显示的字符内容作为查找表的索引号输入进去。

8个数码管用一个8选1的多路选择器,利用段选中的cnt_sel作为选通通道--就能实现在扫描对应数码管的时候让段选就是这个数码管。

FPGA_数码管显示,fpga开发

如果要显示更多字符:

FPGA_数码管显示,fpga开发

这里 是8个通道,每个通道4位,那么把这8个通道合成一个32位数据data[31:0]

FPGA_数码管显示,fpga开发

4,代码编写

整体设计符号图:

FPGA_数码管显示,fpga开发

根据以上描述,编写代码:

module digitial_tube_0(
    Clk,
    Reset_n,
    Disp_Data,
    SEL,
    SEG
    );
    input Clk;
    input Reset_n;
    input [31:0]Disp_Data;
    output reg [7:0]SEL;
    output reg [7:0]SEG;
    
    parameter MCNT_1MS = 1000000/20 -1;
    parameter MCNT_SEL = 8-1;
    reg [15:0]cnt_1ms;
    reg [2:0]cnt_sel;
    reg [7:0]encode_sel;
    reg [7:0]LUT_seg;
    reg [3:0]data_temp;
    //1ms计数器
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        cnt_1ms <= 0;
    else if(cnt_1ms == MCNT_1MS)
        cnt_1ms <= 0;
    else 
        cnt_1ms <= cnt_1ms + 1'b1;
    //位选计数器
    always@(posedge Clk or Reset_n)
    if(!Reset_n)
        cnt_sel <= 0;
    else if(cnt_1ms == MCNT_1MS) begin
        if(cnt_sel == MCNT_SEL)
            cnt_sel <= 0;
        else
            cnt_sel <= cnt_sel + 1'b1;
    end 
    else
        cnt_sel <= cnt_sel;
    
    //3_8译码器
    always@(*)
        case(cnt_sel)
            3'b000:encode_sel = 8'b0000_0001; 
            3'b001:encode_sel = 8'b0000_0010; 
            3'b010:encode_sel = 8'b0000_0100; 
            3'b011:encode_sel = 8'b0000_1000; 
            3'b100:encode_sel = 8'b0001_0000; 
            3'b101:encode_sel = 8'b0010_0000; 
            3'b110:encode_sel = 8'b0100_0000; 
            3'b111:encode_sel = 8'b1000_0000;
        endcase
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        SEL <= 0;
    else
        SEL <= encode_sel;
   //段选

    always@(*)
        case(cnt_sel)
            3'b000:data_temp = Disp_Data[3:0]; 
            3'b001:data_temp = Disp_Data[7:4]; 
            3'b010:data_temp = Disp_Data[11:8]; 
            3'b011:data_temp = Disp_Data[15:12]; 
            3'b100:data_temp = Disp_Data[19:16]; 
            3'b101:data_temp = Disp_Data[23:20]; 
            3'b110:data_temp = Disp_Data[27:24]; 
            3'b111:data_temp = Disp_Data[31:28];
        endcase
    
    always@(*)
    case(data_temp)
        0 : LUT_seg = 8'hc0;
        1 : LUT_seg = 8'hf9;
        2 : LUT_seg = 8'ha4;
        3 : LUT_seg = 8'hb0;
        4 : LUT_seg = 8'h99;
        5 : LUT_seg = 8'h92;
        6 : LUT_seg = 8'h82;
        7 : LUT_seg = 8'hf8;
        8 : LUT_seg = 8'h80;
        9 : LUT_seg = 8'h90;
        4'ha :LUT_seg = 8'h88;
        4'hb :LUT_seg = 8'h83;
        4'hc :LUT_seg = 8'hc6;
        4'hd :LUT_seg = 8'ha1;
        4'he :LUT_seg = 8'h86;
        4'hf :LUT_seg = 8'h8e;
    endcase
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        SEG <= 0;
    else
        SEG <=   LUT_seg;  
            
endmodule

编写testbench,测试代码:

`timescale 1ns / 1ps
module digitial_tubr_1_tb();
    reg Clk;
    reg Reset_n;
    reg [31:0]Disp_Data;
    wire [7:0]SEL;
    wire [7:0]SEG;
    digitial_tube_0 digitial_tube_0(
        .Clk(Clk),
        .Reset_n(Reset_n),
        .Disp_Data(Disp_Data),
        .SEL(SEL),
        .SEG(SEG)
        );
    initial Clk = 1;
    always #10 Clk = ~Clk;
    
    initial begin
        Reset_n = 0;
        Disp_Data = 32'h00000000;
        #201
        Reset_n = 1;
        #200;
        Disp_Data = 32'h12345678;
        #10000000
        Disp_Data = 32'h9abcdef0;
        #10000000
        $stop;       
    end  
endmodule

仿真波形如下:

FPGA_数码管显示,fpga开发

至此,数码管驱动逻辑编写完毕,但是在实际应用此输出占用的管脚过多,所以为了节省FPGA的管脚,需要将输出信号并转串后(FPGA只需要输出3个管脚),再利用串转并芯片(比如74HC595)连接数码管去显示需要输出的字符。文章来源地址https://www.toymoban.com/news/detail-818747.html

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

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

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

相关文章

  • FPGA基础设计之数码管显示

    数码管是一种半导体发光器件,其基本单元是发光二极管。一般分为七段数码管和八段数码管,多的一段是小数点。也有其他如N型、米型数码管以及16段、24段管等。本次设计的是八段数码管 公阴极数码管高电平亮,公阳极数码管低电平亮。AC620上搭载的是公阳极数码管。 数

    2023年04月26日
    浏览(38)
  • [FPGA 学习记录] 数码管动态显示

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

    2024年02月04日
    浏览(44)
  • [FPGA 学习记录] 数码管静态显示

    数码管静态显示 在我们的许多项目设计当中,我们通常需要一些显示设备来显示我们需要的信息。我们可以选择的显示设备有很多,而我们的数码管就是使用最多、最简单的显示设备之一。数码管它是一种半导体发光器件,它具有响应时间短、体积小、重量轻、寿命长的优点

    2024年02月03日
    浏览(44)
  • FPGA(5)数码管静态显示与动态显示

    目录 一、数码管静态显示 二、数码管动态显示 1、变量定义 2、定时(60us) 3、动态显示 代码 FPGA的数码管有4位,8段 。( 位和段都是共阳,即低电平有效 )     位选的4位(二进制):分别为第1、2、3、4位数码管。 段选的8位(二进制):分别为第h、g、f、e、d、c、b、a段

    2023年04月12日
    浏览(36)
  • FPGA项目(5)--FPGA控制数码管动态显示的原理

            数码管是现在电子产品上常用的显示器件,它有驱动简单、显示清晰、价格低廉等优势。数码管的实物图:          数码管的内部结构图如下所示:          从图中可以看出,它由八个段组成,即A B C D E F G DP(小数点),只要将这八个段按规律组合点亮,就

    2024年02月11日
    浏览(44)
  • FPGA学习之数码管时间显示模块

    在学习完小梅哥的串口通信以及数码管显示教程后,他留下了一个课后作业,也就是本次的数码管时间显示模块。作为一个FPGA新人,这也算是第一个比较完整的练手小项目了,也推荐和我一样的新人花时间去完成一下。总体功能虽然比较简单,但是我也花了小两天的时间去编

    2024年03月10日
    浏览(55)
  • 二、19【FPGA】数码管动态显示实验

    学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。 学习视频:是根据野火FPGA视频教程——第二十二讲 https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3 “天下武功唯快不破”    “看到的不一定为真” 眼睛的视觉暂留:光信号传入大脑需要短暂时间,

    2023年04月08日
    浏览(32)
  • FPGA学习汇总(六)----数码管显示(1)

    目录 概念 单个数码管显示单个数字  操作  代码  现象 分析 四个数码管定时单个显示数字 分析 代码 四个数码管同时显示 分析 代码 现象

    2024年02月01日
    浏览(44)
  • FPGA基本实验之数码管的静态显示

    此实验基于FPGA征途pro开发板实现, 数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数一般分为七 段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管(多一个小数点显 示)。当然也还有一些其他类型的数码管如“N”形管、“米”字管

    2024年02月03日
    浏览(42)
  • FPGA基本实验之数码管的动态显示

            关于数码管的基本知识大家可以参考我上一篇文章数码管的静态显示,         使用 1ms 的刷新时间让六个数码管轮 流显示:第 1ms 点亮第一个数码管,第 2ms 点亮第二个数码管,以此类推依次点亮六个数 码管,6ms 一个轮回,也就是说每个数码管每 6ms 点亮

    2024年02月08日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包