FPGA开发——数码管的使用(二)

一、概述

在上一篇文章中我们针对单个数码管的静态显示和动态显示进行了一个设计和实现,这篇文章中我们针对多个数码管同时显示进行一个设计。这里和上一篇文章唯一不同的是就是数码管位选进行了一个改变,原来是单个数码管的显示,所以位选就直接赋值就可以了,但在本篇文章中一次性使用了多个数码管,所以在位选信号中我们就需要进行一个更改。

实验的重难点

在进行多位数码管的显示时,最大的难点就是怎样选择每个数码管的位选,以及每个数码管之间显示的时间间隔,这时本次设计中所设计的两个重难点,只要掌握着两个点,设计也就变得非常简单。

二、工程实现

1、设计文件的编写

在针对上面的两个难点,我们在编写代码时拼接语法的方式实现位选的循环移动,将不同数码管显示的值使用位选变量作为条件写在一个case语句中,以实现我们预设的012345的字符显示。这里在对8段发光二极管显示字符进行设计时,我们和前一篇文章一样需要先确认时共阴极还是共阳极(这里使用的是共阳极),如果时共阴极就是高电平驱动,反之,就是低电平驱动。通过给8段对应的二极管进行0或者1的赋值,共同组成不同的字符。

cpp 复制代码
module seg0(
  input  clk,
  input  rst_n,
  output reg [5:0] seg_sel,//位选
  output reg [7:0] seg_dual//段选
);
localparam  ZERO  = 8'b1100_0000, //共阳极段码
            ONE   = 8'b1111_1001,
            TWO   = 8'b1010_0100,
            THREE = 8'b1011_0000,
            FOUR  = 8'b1001_1001,
            FIVE  = 8'b1001_0010;
reg [15:0] cnt;//ms计数器
wire       add_cnt;
wire       end_cnt;
reg     [4:0]   flag;
wire            add_flag;
wire            end_flag;


always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
      cnt<=0;
    else if(add_cnt)begin
      if(end_cnt)
        cnt<=0;
      else
        cnt<=cnt+1'b1;
    end
end
assign add_cnt=1'b1;
assign end_cnt=add_cnt && (cnt==50_000-1);

always @(posedge clk or negedge rst_n)begin
  if(!rst_n)
    seg_sel<=6'b111_110;
  else if(end_cnt)
    seg_sel<={seg_sel[4:0],seg_sel[5]};
end

always @(posedge clk or negedge rst_n)begin
  if(!rst_n)
    seg_dual<=8'b1111_1111;
  else begin
    case (seg_sel)
      6'b111_110:seg_dual<=ZERO ;
      6'b111_101:seg_dual<=ONE  ;
      6'b111_011:seg_dual<=TWO  ; 
      6'b110_111:seg_dual<=THREE;
      6'b101_111:seg_dual<=FOUR ;
      6'b011_111:seg_dual<=FIVE ;
      default: ;
    endcase
  end 
end
endmodule 

2、测试文件编写

这里很简单,我就不进行波形仿真了,下面是测试文件,感兴趣的可以去仿真一下,我就直接在后面给出下板验证的结果。

cpp 复制代码
//定义时间尺度
`timescale 1ns/1ns
module seg0_tb ;

//输入信号定义
reg  clk;
reg rst_n;
wire [7:0] seg_dual;
wire [5:0] seg_sel;
//模块例化
seg0 seg_inst(
    /*input */.clk      (clk     ),
    /*input */.rst_n    (rst_n   ),
    /*output*/.seg_sel  (seg_sel ),
    /*output*/.seg_dual (seg_dual)

);
//激励信号产生
parameter CLK_CLY = 20;
//时钟
initial clk=1;
always #(CLK_CLY/2)clk=~clk;

//复位
initial begin
    rst_n= 1'b0;
    #(CLK_CLY*3);
    #5;//复位结束避开时钟上升沿
    rst_n= 1'b1;
end
endmodule

3、下板验证

图片中我们可以看到6个数码管从0显示到5,成功设计成多个数码管同时显示。

相关推荐
minglie111 小时前
简易寄存器接口SMMR---正交编码器
fpga开发
神电测控15 小时前
新品发布:32通道50MS/s同步并行14位采集模块PG-FMC9249(支持任意FPGA/ZYNQ,兼容LabVIEW FPGA软件开发)
fpga开发·labview·ni·神电测控·王电令·ad9249·32通道
Drgfd16 小时前
半导体国产替代进入“深水区”:决战设备、材料、IP三大高地
网络·fpga开发
国产HT1621B17 小时前
YL1650 LED驱动芯片详解:从原理到实战应用(附51单片机驱动代码)
stm32·单片机·嵌入式硬件·mcu·fpga开发·lcd驱动
szxinmai主板定制专家19 小时前
驱控一体新范式:RK3576+FPGA+CODESYS工业实时AI控制架构全解
人工智能·嵌入式硬件·计算机视觉·fpga开发·架构·工业ai·驱控一体
国科安芯20 小时前
ASC0101S自动双向电平转换原理深剖
单片机·嵌入式硬件·fpga开发·云计算·信息与通信
谢斯21 小时前
[vscode] 使用unity打开vscode的取消.csproj的显示
ide·vscode·unity
落chen21 小时前
7 Series FPGAs Clocking Resources
fpga开发
2501_916007471 天前
SwiftUI 声明式语法与 Xcode 预览功能详解
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
落chen2 天前
基于FPGA的IIC协议通信-强化篇
fpga开发