原创 三十而立学FPGA之数码管

2022-6-12 16:47 2553 16 4 分类: FPGA/CPLD 文集: FPGA
简介

数码管,一种把多个发光二极管通过简单阵列的方式组合而成的显示器件。多个二极管阴极连在一起,通过控制阳极的高低电平来控制数码管相应LED亮灭的叫做共阴,反之共阳。每个发光二极管称之为数码管的段,连在一起的阴极或阳极称之为位。

实现框图

 

模块实现 1. 十进制转BCD模块

十进制(二进制)转BCD通常使用方式是移位加三的算法。具体方式如下表示(以123即8‘b01111011为例):

说明:

1. count为0,将需要转换的数值赋值给设置的移位寄存器shift_reg的后八位

2. count每计数一次,将移位寄存器向左移1位,再判断个位十位的值是否大于等于5,如果十位或个位大于等于5,则十位或个位都加3。

3. 移位的次数(即count的计数值),由需要转化的数的二进制位数相同。

4. 需要避免0,因为复位count值为0,会打乱后面的逻辑。

程序实现

//移位计数
  • always @(posedge clk or negedge rst_n)
  • begin
  • if(rst_n == 1'b0)
  • count <= 4'd0;
  • else if(count == 4'd9)
  • count <= 4'd0;
  • else
  • count <= count + 4'd1;
  • end
  • //移位加三算法
  • always @(posedge clk or negedge rst_n)
  • begin
  • if(rst_n == 1'b0)
  • shift_reg = {shift_reg[19:8],data_in};
  • else if(count == 4'd0)
  • shift_reg = {shift_reg[19:8],data_in};
  • else if(count <= 4'd9)
  • if(shift_reg[11:8]>=5)
  • if(shift_reg[15:12]>=5)
  • begin
  • shift_reg[11:8] = shift_reg[11:8] + 4'd3;
  • shift_reg[15:12]= shift_reg[15:12]+ 4'd3;
  • end
  • else
  • begin
  • shift_reg[11:8] = shift_reg[11:8] + 4'd3;
  • shift_reg[15:12]= shift_reg[15:12];
  • end
  • else
  • if(shift_reg[15:12]>=5)
  • begin
  • shift_reg[11:8] = shift_reg[11:8];
  • shift_reg[15:12]= shift_reg[15:12]+ 4'd3;
  • end
  • else
  • begin
  • shift_reg[11:8] = shift_reg[11:8];
  • shift_reg[15:12]= shift_reg[15:12];
  • end
  • else
  • shift_reg = shift_reg;
  • end
  • 复制代码

    2. 译码模块

    以下代码以共阳极数码管为例

    always @(posedge clk or negedge rst_n)
  • begin
  • if(rst_n == 1'b0)
  • dp_val_r <= 8'b1100_0000;
  • else
  • case (dp_index) //dp,g,f,e,d,c,b,a
  • 0:dp_val_r <= 8'b1100_0000;
  • 1:dp_val_r <= 8'b1111_1001;
  • 2:dp_val_r <= 8'b1010_0100;
  • 3:dp_val_r <= 8'b1011_0000;
  • 4:dp_val_r <= 8'b1001_1001;
  • 5:dp_val_r <= 8'b1001_0010;
  • 6:dp_val_r <= 8'b1000_0010;
  • 7:dp_val_r <= 8'b1111_1000;
  • 8:dp_val_r <= 8'b1000_0000;
  • 9:dp_val_r <= 8'b1001_0000;
  • 10:dp_val_r <= 8'b1000_1000;
  • 11:dp_val_r <= 8'b1000_0011;
  • 12:dp_val_r <= 8'b1100_0110;
  • 13:dp_val_r <= 8'b1010_0001;
  • 14:dp_val_r <= 8'b1000_0110;
  • 15:dp_val_r <= 8'b1000_1110;
  • default:dp_val_r <= 8'b1100_0000;
  • endcase
  • end
  • 复制代码

    3. 数码管扫描模块 扫描计时

    always @(posedge clk or negedge rst_n)
  • begin
  • if(rst_n == 1'b0)
  • cnt <= 20'd0;
  • else if(start_cnt == 1'b1)
  • if(cnt == 20'd99999)
  • cnt <= 20'd0;
  • else
  • cnt <= cnt + 20'd1;
  • else
  • cnt <= 20'd0;
  • end
  • 复制代码

    扫描实现

    本实验为六位数码管

    //SEL_W由数码管位数决定
  • always @(posedge clk or negedge rst_n)
  • begin
  • if(rst_n == 1'b0)
  • dp_sel_o_r <= {{(SEL_W-1){1'b0}},1'b1};
  • else if(cnt == 20'd99999)
  • dp_sel_o_r <= dp_sel_o_r << 1;
  • else if(dp_sel_o_r == {1'b0,{(SEL_W-1){1'b0}}})
  • dp_sel_o_r <= {{(SEL_W-1){1'b0}},1'b1};
  • else
  • dp_sel_o_r <= dp_sel_o_r;
  • end
  • always @(posedge clk or negedge rst_n)
  • if(rst_n == 1'b0)
  • dp_index = 4'd0;
  • else
  • begin
  • case (dp_sel_o_r)
  • 6'b000000:dp_index = 4'd0;
  • 6'b000001:dp_index = dp_data_r[3:0];
  • 6'b000010:dp_index = dp_data_r[7:4];
  • 6'b000100:dp_index = dp_data_r[11:8];
  • 6'b001000:dp_index = dp_data_r[15:12];
  • 6'b010000:dp_index = dp_data_r[19:16];
  • 6'b100000:dp_index = dp_data_r[23:20];
  • default: dp_index = 4'd0;
  • endcase
  • end
  • 复制代码

     


    作者: 二月半, 来源:面包板社区

    链接: https://mbb.eet-china.com/blog/uid-me-1862109.html

    版权声明:本文为博主原创,未经本人允许,禁止转载!

    PARTNER CONTENT

    文章评论1条评论)

    登录后参与讨论

    yzw92 2022-6-13 06:25

    感谢楼主分享
    相关推荐阅读
    二月半 2025-06-17 16:39
    13. ESP32开发之定时器中断
    概述相关API函数举例:定时发送一个事件总结概述ESP32有一组外设--定时器组。它可以选择不同的时钟源和分配系数。该定时器应用灵活,超时报警可以自动更新计数值。相关API函数1.定时器配置结构体ty...
    二月半 2025-06-12 14:32
    【拆解】一款远程控制开关
    七年前买了个远程控制开关,想想那个时候应该物联网才兴起的时候吧。如今因为控制麻烦且经常出现连接掉线问题,于是给淘汰了。这个设备我是拿来控制吊灯,特别麻烦的是,当晚上关灯后,会有一点灯点亮着,掉线的时候...
    二月半 2025-06-12 10:11
    ESP32开发之GPIO中断
    电路图GPIO的中断类型相关API函数应用举例总结电路图在ESP32中内部有完整的控制电路,比如上下拉以及滤波器等,所以我们这里可以直接用一个微动开关连接到地。GPIO的中断类型GPIO_INTR_D...
    二月半 2025-06-09 22:37
    ESP32开发之WS2812B控制
    WS2812B数据手册重点摘录硬件电路Remote Control Transceive(RMT)概念RMT的相关API函数一段简单的控制WS2812B的应用举例总结WS2812B数据手册重点摘录WS...
    二月半 2025-06-04 09:07
    10. ESP32开发之LED闪烁和呼吸的实现
    硬件电路介绍GPIO输出模式GPIO配置过程闪烁灯的源码LED PWM的控制器(LEDC)概述LEDC配置过程及现象整体流程硬件电路介绍电路图如下:只要有硬件基础的应该都知道上图中,当GPIO4的输出...
    二月半 2025-06-02 21:24
    【Milk-V Duo 开发板】+初用体验
    许久未在面包板社区申请板卡评测了。这一次偶然最近的这款Milk-V Duo开发板正在评测。首次看到如此简单切功能强大的嵌入式平台:· 支持linux、rtos· 可接一路Camera,做人脸检测、目标...
    我要评论
    1
    16
    关闭 站长推荐上一条 /4 下一条