当前位置: 首页 > news >正文

FPGA开发——数码管的使用

一、概述

在我们的日常开发中,数字显示的领域中用得最多的就是数码管,这篇文章也是围绕数码管的静态显示和动态显示进行一个讲解。

1、理论

(1)数码管原理图

在对数码管进行相关控制时,其实就是对于8段发光二极管和一个位选信号进行控制,也就是我们熟悉的段选和位选。段选就包括a,b,c,d,e,f,g,h这八个二极管,位选就是选择某个二极管工作的一个简单引脚。

2、共阴极和共阳极的判断

市场上我们常见的数码管有共阴极啊和共阳极两种信号,其外观上没有什么区别,都是通过原理图进行判断和区分,两种数码挂对应的驱动方式也不一样。共阴极是高电平驱动,共阳极是低电平驱动。所谓的共阴极和共阳极实际上就是看公共引脚接在正极还是负极上。

 

3、本次使用的数码管原理图

其实在原理图中并没有明确说明是共阴极还是共阳极,我们需要通过SEL位选信号进行判断。在最下面的三极管我们可以看到只有当SELx_T为低电平时三极管才会接通,所以这里通过判断是共阳极,通过低电平触发。

 二、工程实现

1、单个数码管静态显示

(1)、设计文件

新建seg.v文件,如下:

这里不需要使用任何时序功能,只是简单显示一个数字,直接就用连续赋值进行实现。这里代码过于简单,就不去进行仿真和下板验证了。

module top(output  seg_sel,output [7:0] seg_dual);assign seg_sel=1'b0;//选择第一个数码管
assign seg_dual=8'b11_000_000;//数码管显示0

2、单个数码管实现动态显示

(1)、设计文件

//分频器
module seg0(input  clk,input  rst_n,input  seg_sel,//位选output reg [7:0] seg_dual0//段选
);
localparam  ZERO  = 8'b11100_0000, //共阳极段码ONE   = 8'b11111_1001,TWO   = 8'b11010_0100,THREE = 8'b11011_0000,FOUR  = 8'b11001_1001,FIVE  = 8'b11001_0010,SIX   = 8'b11000_0010,SEVEN = 8'b11111_1000,EIGHT = 8'b11000_0000,NINE  = 8'b11001_0000,A     = 8'b11000_1000,b     = 8'b11000_0011,c     = 8'b11100_0110,d     = 8'b11010_0001,E     = 8'b11000_0110,f     = 8'b11000_1110;
reg [26:0] cnt;
wire       add_cnt;
wire       end_cnt;  
reg [4:0]   flag;
wire        add_flag;
wire        end_flag;
always @(posedge clk or negedge rst_n)beginif(!rst_n)cnt<=0;else if(add_cnt)beginif(end_cnt)cnt<=0;elsecnt<=cnt+1'b1;end
end
assign add_cnt=1'b1;
assign end_cnt=add_cnt && (cnt==50_000_000-1);always @(posedge clk or negedge rst_n)beginif(!rst_n)flag<=0;else if(add_flag)beginif(end_flag)flag<=0;elseflag<=flag+1'b1;end
end
assign add_flag=end_cnt;
assign end_flag=add_flag && (flag==16-1);always @(posedge clk or negedge rst_n)beginif(!rst_n)seg_dual0<=8'b1111_1111;else begincase (flag)4'd0:seg_dual0<=ZERO ;4'd1:seg_dual0<=ONE  ;4'd2:seg_dual0<=TWO  ; 4'd3:seg_dual0<=THREE;4'd4:seg_dual0<=FOUR ;4'd5:seg_dual0<=FIVE ;4'd6:seg_dual0<=SIX  ;4'd7:seg_dual0<=SEVEN;4'd8:seg_dual0<=EIGHT;4'd9:seg_dual0<=NINE ;4'd10:seg_dual0<=A ;4'd11:seg_dual0<=b  ;4'd12:seg_dual0<=c;4'd13:seg_dual0<=d;4'd14:seg_dual0<=E ;4'd15:seg_dual0<=f ;default: ;endcaseend 
end
endmodule 

(2)、测试文件

//定义时间尺度
`timescale 1ns/1ns
module seg_tb ;//输入信号定义
reg  clk;
reg rst_n;wire [7:0] seg_dual0;
wire  seg_sel;
defparam  seg0_inst.TIME_1s=500;
//模块例化
seg0 seg0_inst(/*input */.clk      (clk     ),/*input */.rst_n    (rst_n   ),/*output*/.seg_sel  (seg_sel ),/*output*/.seg_dual0 (seg_dual0));
//激励信号产生
parameter CLK_CLY = 20;
//时钟
initial clk=1;
always #(CLK_CLY/2)clk=~clk;//复位
initial beginrst_n= 1'b0;#(CLK_CLY*3);#5;//复位结束避开时钟上升沿rst_n= 1'b1;
end
endmodule

(3)、波形图仿真

在波形图中我们可以看到段选从8'b11_000_000——8'b11_000_1110,也就是从0——F动态显示。

http://www.lryc.cn/news/410561.html

相关文章:

  • 什么是网络安全等级保护测评服务?
  • 基于深度学习的多模态情感分析
  • Glove-词向量
  • Plugin ‘mysql_native_password‘ is not loaded`
  • Hive数据类型
  • OSI七层网络模型:构建网络通信的基石
  • MSYS2下载安装和使用
  • 机器学习中的决策树算法——从理论到实践完整指南
  • FFplay介绍及命令使用指南
  • php实现动态登录
  • Servlet2-HTTP协议、HttpServletRequest类、HttpServletResponse类
  • 探索数据的内在世界:sklearn中分层特征聚类标签的可视化技术
  • airtest定位方法
  • 排列组合 n*(n-1)*(n-m+1)
  • Python面试整理-数据处理和分析
  • 职业教育计算机网络综合实验实训室建设应用案例
  • 【Docomo】5G
  • Servlet详解(Servlet源码)
  • 仓颉--接收控制台输入
  • 数据库设计效率提高的5大注意事项
  • C语言笔试题(一)
  • 轻松实现远程智能交互:OriginBot与钉钉和GPT4o的集成指南
  • Qt题目知多少-1
  • nginx的反向代理和负载均衡(seventeen day)
  • BES编译SDK中遇到的perl问题
  • 【康复学习--LeetCode每日一题】3111. 覆盖所有点的最少矩形数目
  • Django实战:开启数字化任务管理的新纪元
  • 史上最全网络安全面试题+答案
  • Python 爬虫入门(五):使用 lxml 解析网页
  • 阿里云RDS到亚马逊云RDS的实时数据同步方案详解