草庐IT

verilog学习笔记- 14)静态数码管显示实验

Vizio< 2023-07-29 原文

目录

简介:

实验任务:

硬件设计:

程序设计:

下载验证:


简介:

数码管也称半导体数码管,它是将若干发光二极管按一定图形排列并封装在一起的一种数码显示器件。常见的数码管如图这种数码管主要被称为八段数码管或 8 字形数码管,可用来显示小数点、数字 0~9,和英文字母 A~F。

除了常用的八段数码管之外,较常见的还有“±1”数字管、“N”形管、“米”字管以及工业科研领域使用的 14 段管、16 段管、24 段管等。

 

 从该图可以看出,一位数码管的引脚是 10 个,其中 7 个引脚对应连接到组成数码管中间“8”字型的 led,Dp 引脚连接到数码管的小数点显示 led(dp)。最后还有两个公共端,生产商为了封装统一,单个数码管都封装成 10 个引脚,其中 8 和 3 两个公共端引脚(图中为 com)是连接在一起的。公共端又可分为共阳极和共阴极

对共阴极数码管来说,其 8 个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴”,而阳极独立。对共阳极数码管来说,其 8 个发光二极管的阳极在数码管内部全部连接在一起,所以称“共阳”,而阴极独立。以共阳极数码管为例,当我们想让数码管显示数字“8”,可以给 a、b、c„g 七个引脚送低电平,数码管就显示“8”,显示数字“1”,就给 b、c 引脚低电平,其余引脚(除公共端)给高电平,数码管就显示“1”。

当多位数码管应用于某一系统时,为了减少数码管占用的 I/O 口,将其段选(数码管的 a、b、c 等引脚)连接在一起,而位选(数码管的公共端)独立控制。这样我们可以通过位选信号控制哪几个数码管亮,而且在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选信号都是相同的,数码管的这种显示方法叫做静态显示。


实验任务:

使用 FPGA 开发板上的 6 位数码管以静态方式依次显示 000000、111111、222222 至FFFFFF,结束后继续从 000000 开始计数,每 0.5s 变化一次。


硬件设计:

为了增加 FPGA 输出信号的驱动能力,我们使用 PNP 型三极管驱动数码管的位选段,所以给三极管基极提供低电平时,位选信号为高电平。

各端口信号的管脚分配如下表所示:

 

 对应的 TCL 约束语句如下:

set_location_assignment PIN_M2 -to sys_clk
set_location_assignment PIN_M1 -to sys_rst_n
set_location_assignment PIN_N16 -to sel[0]
set_location_assignment PIN_N15 -to sel[1]
set_location_assignment PIN_P16 -to sel[2]
set_location_assignment PIN_P15 -to sel[3]
set_location_assignment PIN_R16 -to sel[4]
set_location_assignment PIN_T15 -to sel[5]
set_location_assignment PIN_M11 -to seg_led[0]
set_location_assignment PIN_N12 -to seg_led[1]
set_location_assignment PIN_C9 -to seg_led[2]
set_location_assignment PIN_N13 -to seg_led[3]
set_location_assignment PIN_M10 -to seg_led[4]
set_location_assignment PIN_N11 -to seg_led[5]
set_location_assignment PIN_P11 -to seg_led[6]
set_location_assignment PIN_D9 -to seg_led[7]

程序设计:

系统的控制流程:首先我们需要一个静态数码管显示模块在数码管上显示数据,其次需要一个计时模块每当计时到 0.5s 时改变数码管显示的数值。由此画出系统的功能框图如下所示:

 程序中各模块端口及信号连接如图:

 FPGA 顶层(seg_led_static_top)例化了以下两个模块:计时模块(time_count)和数码管静态显示模块(seg_led_static),实现各模块之间数据的交互。计时模块将计时到 0.5s 时的标志信号 flag 传递给数码管静态显示模块,数码管静态显示模块接收到此信号时显示的数值增加 1。

计时模块(time_count):计时模块对系统时钟进行计数,当计时到给定值(此处指 0.5s)时输出标志信号。

数码管静态显示模块(seg_led_static):数码管静态显示模块在数码管上以静态方式显示数值。

顶层模块的代码如下:

1 module seg_led_static_top (
2 input sys_clk , // 系统时钟
3 input sys_rst_n, // 系统复位信号(低有效)
4 
5 output [5:0] sel , // 数码管位选
6 output [7:0] seg_led // 数码管段选
7 
8 );
9 
10 //parameter define
11 parameter TIME_SHOW = 25'd25000_000; // 数码管变化的时间间隔 0.5s
12 
13 //wire define
14 wire add_flag; // 数码管变化的通知信号
15 
16 //*****************************************************
17 //** main code
18 //*****************************************************
19 
20 //每隔 0.5s 产生一个时钟周期的脉冲信号
21 time_count #(
22 .MAX_NUM (TIME_SHOW)
23 ) u_time_count(
24 .clk (sys_clk ),
25 .rst_n (sys_rst_n),
26 
27 .flag (add_flag )
28 );
29 
30 //每当脉冲信号到达时,使数码管显示的数值加 1
31 seg_led_static u_seg_led_static (
32 .clk (sys_clk ),
33 .rst_n (sys_rst_n),
34 
35 .add_flag (add_flag ),
36 .sel (sel ),
37 .seg_led (seg_led )
38 );
39 
40 endmodule

顶层模块主要完成对其余模块的例化。代码第 11 行的参数 TIME_SHOW 控制数码管每隔多长时间改变显示的数值,该参数值与代码第32行的clk时钟信号频率有关。由于例化时clk为系统时钟sys_clk(50MHz)所以每隔 0.5 秒改变数码管显示的数值时此参数值为0.5 × 50000000 = 25000000,此功能由计时模块(time_count)实现。

计时模块的代码如下所示:

1 module time_count(
2 input clk , // 时钟信号
3 input rst_n , // 复位信号
4 
5 output reg flag // 一个时钟周期的脉冲信号
6 );
7 
8 //parameter define
9 parameter MAX_NUM = 25000_000; // 计数器最大计数值
10 
11 //reg define
12 reg [24:0] cnt; // 时钟分频计数器
13 
14 //*****************************************************
15 //** main code
16 //*****************************************************
17 
18 //计数器对时钟计数,每计时到 0.5s,输出一个时钟周期的脉冲信号
19 always @ (posedge clk or negedge rst_n) begin
20 if (!rst_n) begin
21 flag <= 1'b0;
22 cnt <= 24'b0;
23 end
24 else if(cnt < MAX_NUM - 1'b1) begin
25 cnt <= cnt +1'b1;
26 flag <= 1'b0;
27 end
28 else begin
29 cnt <= 24'b0;
30 flag <= 1'b1;
31 end
32 end
33 
34 endmodule

代码中第 9 行的参数 MAX_NUM 为计数的最大计数值,由于是对时钟计数,相当于计时,第 19 行的always 语句块表示的是当计数器 cnt 计数值小于 MAX_NUM - 1'b1 时,标志(flag)为0,否则标志为1,并且计数器 cnt 清零。通过 SignalTapII 抓到的波形图如下图所示:

 数码管静态显示模块的代码如下:

1 module seg_led_static (
2 input clk , // 时钟信号
3 input rst_n , // 复位信号(低有效)
4 
5 input add_flag, // 数码管变化的通知信号
6 output reg [5:0] sel , // 数码管位选
7 output reg [7:0] seg_led // 数码管段选
8 );
9 
10 //reg define
11 reg [3:0] num; // 数码管显示的十六进制数
12 
13 //*****************************************************
14 //** main code
15 //*****************************************************
16 
17 //控制数码管位选信号(低电平有效),选中所有的数码管
18 always @ (posedge clk or negedge rst_n) begin
19 if (!rst_n)
20 sel <= 6'b111111;
21 else
22 sel <= 6'b000000;
23 end
24 
25 //每次通知信号到达时,数码管显示的十六进制数值加 1
26 always @ (posedge clk or negedge rst_n) begin
27 if (!rst_n)
28 num <= 4'h0;
29 else if(add_flag) begin
30 if (num < 4'hf)
31 num <= num + 1'b1;
32 else
33 num <= 4'h0;
34 end
35 else
36 num <= num;
37 end
38 
39 //根据数码管显示的数值,控制段选信号
40 always @ (posedge clk or negedge rst_n) begin
41 if (!rst_n)
42 seg_led <= 8'b0;
43 else begin
44 case (num)
45 4'h0 : seg_led <= 8'b1100_0000;
46 4'h1 : seg_led <= 8'b1111_1001;
47 4'h2 : seg_led <= 8'b1010_0100;
48 4'h3 : seg_led <= 8'b1011_0000;
49 4'h4 : seg_led <= 8'b1001_1001;
50 4'h5 : seg_led <= 8'b1001_0010;
51 4'h6 : seg_led <= 8'b1000_0010;
52 4'h7 : seg_led <= 8'b1111_1000;
53 4'h8 : seg_led <= 8'b1000_0000;
54 4'h9 : seg_led <= 8'b1001_0000;
55 4'ha : seg_led <= 8'b1000_1000;
56 4'hb : seg_led <= 8'b1000_0011;
57 4'hc : seg_led <= 8'b1100_0110;
58 4'hd : seg_led <= 8'b1010_0001;
59 4'he : seg_led <= 8'b1000_0110;
60 4'hf : seg_led <= 8'b1000_1110;
61 default : seg_led <= 8'b1100_0000;
62 endcase
63 end
64 end
65 
66 endmodule

代码第 11 行的 num 信号为数码管显示的数值,由代码第 30 行的 if 语句块可知,其能显示的数值为0~f。由于开发板上的数码管为共阳数码管,所以不显示小数点时该位值为―1‖,因而 seg_led 信号的最高位为―1‖。下图为该模块运行时 SignalTapII 抓取到的波形图:

由该波形图可知,当 add_flag 信号拉高时,数值信号 num 加 1,输出对应的段选数据由 F8h 变为 80h


下载验证:

功能正常 

有关verilog学习笔记- 14)静态数码管显示实验的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  4. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  5. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  6. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  7. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  8. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  9. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  10. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

随机推荐