基于Basys2的数码管动态扫描module(verilog)的模块化设计
目录
一、数码管工作原理
二、Verilog模块设计
1、原理
(1)动态扫描的优点:
(2)动态扫描原理简介:
2、Verilog模块的设计
(1)分频器:
2、译码器模块:
3、动态扫描模块:
4、顶层模块:
三、写在最后:
在大二下学期学习《Verilog与FPGA实现》的时候鲲鲲给我们布置了课程实验,有许多实验需要用到数码管作为输出。本文旨在用模块化的思想向大家介绍笔者的通用的数码管显示模块。
一、数码管工作原理
数码管事常见的显示装置,通常由7段或8段LED组成,根据公共端连接方式分为:共阳极数码管、共阴极数码管。
顾名思义,共阴极数码管的所有LED的阴极是接在一块的,当通入高电平数码管才点亮;共阳极数码管的所有LED是阳极接在一起,输入低电平点亮,段选码如下图所示
我们用的Basys2的数码管为共阳极数码管,因此本次设计采用共阳极段码表。
二、Verilog模块设计
1、原理
为了节省管脚,Basys2开发板采用的是动态扫描的方式来进行数码管显示,具体如下:
(1)动态扫描的优点:
管脚对芯片来说是非常宝贵的资源,对于我们的板子来说,用到了4个8段数码管,如果用管脚直接控制LED的亮灭的话,总共需要用到4*(8+2)=40个管脚(8是abcdefg段选,2是两个共阳极),一共用到32个管脚作为控制端;而用动态扫描的方式来进行显示的话需要4个位选(选择四个数码管中的哪一个)和8个段选(abcdefg中的哪一段,当然还有两个共阳极),一共用到12个管脚作为控制端,高下立判。
(2)动态扫描原理简介:
要实现动态扫描,最常用的是数据锁存器和移位寄存器,在某一时刻输入位选选中要显示的数码管,同时送上相应的段选码,下一时刻选中下一个数码管同时送上对应的段选码,只要扫描的频率足够快,人眼就会因为视觉暂留效应而看到的4个数码管显示不同的数字。常用的刷新频率在1KHz到60Hz,太快就会亮度不够,太慢就会闪烁。
2、Verilog模块的设计
设计的模块会将输入的4个二进制码显示在4个位的数码管上,因而需要模块:分频器(将板子50MHz时钟分频为1KHz时钟)、译码模块(二进制码转为共阳极数码管段选码)、动态扫描模块(在特定时刻选中位并送上对应的段选码)、top(顶层封装),具体代码如下:
(1)分频器:
计数分频,通过计算,输入的50MHz时钟分频为1KHz时钟,需要计数50000次,为了节省资源,计数器位宽为16位刚好满足2^16<50000<2^17。
module clk_div(input clk,output reg clk_div);//输入板子50MHz时钟,输出1KHz时钟//计数分频:50000次reg [15:0]cnt = 16'd0;always@(posedge clk)beginif(cnt == 16'd50000)begincnt <= 16'd0;endelsebegincnt <= cnt + 16'd1;endend//输出时钟控制always@(posedge clk)beginif(cnt <= 16'd24999)beginclk_div <= 1'b1;endelsebeginclk_div <= 1'b0;endendendmodule
2、译码器模块:
一个很简单的case分支实现译码,输入4位二进制编码,输出对应的8位段选码。
module wei_encoder(input [3:0]hex_number,output reg [7:0]display_code);//将输入的十六进制代码转换为共阳极数码管段选编码并输出always@(*)begincase(hex_number)4'b0000:display_code = 8'hc0;//04'b0001:display_code = 8'hf9;//14'b0010:display_code = 8'ha4;//24'b0011:display_code = 8'hb0;//34'b0100:display_code = 8'h99;//44'b0101:display_code = 8'h92;//54'b0110:display_code = 8'h82;//64'b0111:display_code = 8'hf8;//74'b1000:display_code = 8'h80;//84'b1001:display_code = 8'h90;//94'b1010:display_code = 8'h88;//A4'b1011:display_code = 8'h83;//B4'b1100:display_code = 8'hc6;//C4'b1101:display_code = 8'ha1;//D4'b1110:display_code = 8'h86;//E4'b1111:display_code = 8'h8e;//Fdefault:display_code = 8'hff;//无endcaseend
endmodule
3、动态扫描模块:
输入分频后的1KHz时钟作为位选信号的扫描频率,通过计数器的数值case输出位选和相应的段选信号。
module Display(input clk_div,input [7:0]Out_number_1,//第一位数字对应的段选码input [7:0]Out_number_2,//第二位数字对应的段选码input [7:0]Out_number_3,//第三位数字对应的段选码input [7:0]Out_number_4,//第四位数字对应的段选码output reg [7:0]duan_code,output reg [3:0]wei_code);//将输入的十六进制代码转换为共阳极数码管段选码动态扫描输出reg [2:0]sel_cnt;//扫描计数器//动态扫描always@(posedge clk_div)beginif(sel_cnt == 3'd4)beginsel_cnt <= 3'd0;endelsebeginsel_cnt <= sel_cnt + 3'd1;endendalways@(posedge clk_div)begincase(sel_cnt)3'd0:beginwei_code <= 4'b0001;duan_code <= Out_number_1;end3'd1:beginwei_code <= 4'b0010;duan_code <= Out_number_2;end3'd2:beginwei_code <= 4'b0100;duan_code <= Out_number_3;end3'd3:beginwei_code <= 4'b1000;duan_code <= Out_number_4;enddefault:beginwei_code <= 4'b0000;duan_code <= 8'hff;endendcaseendendmodule
4、顶层模块:
在顶层中例化上述三个模块,封装为一个模块,方便实例化调用,具体流程:分频器将输入的clk(50MHz)分频为clk_div(1KHz),送往Display用于扫描计数器的动态扫描,wei_encoder将输入的二进制数转化为共阳极数码管对应的段选码,送往Display模块扫描输出。
module SEG_display(input clk,input [7:0]number1,input [7:0]number2,output [3:0]wei_code,output [7:0]duan_code);//声明内部信号线wire [7:0]Out_number_1;//将要输出的段选码wire [7:0]Out_number_2;wire [7:0]Out_number_3;wire [7:0]Out_number_4;wire clk_div;//分频后的时钟//模块实例化//时钟分频,用于数码管计数扫描clk_div div(.clk(clk),.clk_div(clk_div));//将将要输出的数转化为段选码wei_encoder encoder1(.hex_number(number1[3:0]),.display_code(Out_number_1));wei_encoder encoder2(.hex_number(number1[7:4]),.display_code(Out_number_2));wei_encoder encoder3(.hex_number(number2[3:0]),.display_code(Out_number_3));wei_encoder encoder4(.hex_number(number2[7:4]),.display_code(Out_number_4));//数码管动态扫描显示Display display(.clk_div(clk_div),.Out_number_1(Out_number_1),.Out_number_2(Out_number_2),.Out_number_3(Out_number_3),.Out_number_4(Out_number_4),.duan_code(duan_code),.wei_code(wei_code));
endmodule
三、写在最后:
这个Verilog数码管动态扫描模块可以适用于Basys2几乎所有的项目,今后我将陆续更新鲲鲲的《Verilog与FPGA实现》 给我们布置的八个实验,一方面巩固自己的知识,另一方面有助于学弟学妹们学习。笔者不才,如有疏漏,欢迎各位网友批评指正。
基于Basys2的数码管动态扫描module(verilog)的模块化设计相关推荐
- 实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计
实验三 基于FPGA的数码管动态扫描电路设计 源文件的链接放在最后啦 实验目的: (1) 熟悉7段数码管显示译码电路的设计. (2) 掌握数码管显示原理及静态.动态扫描电路的设计. 实验任务: (1) ...
- 基于fpga的数码管动态扫描电路设计_【至简设计案例系列】基于FPGA的密码锁设计(altera版)...
秦红凯 明德扬FPGA科教 一.项目背景概述 随着生活质量的不断提高,加强家庭防盗安全变得非常重要,但传统机械锁的构造过于简单,很容易被打开,从而降低了安全性.数字密码锁因为它的保密性很高,安全系数也 ...
- 基于FPGA的数码管动态扫描显示(含代码)
数码管的显示有静态显示和动态扫描显示.一个数码管通常有8个段码,当要控制数码管的数量在两个及以上时,动态扫描无疑是一个最好的选择,可以大量节约IO资源. 静态显示很好理解,8个段码拼成了数字8.,当我 ...
- 基于fpga的数码管动态扫描电路设计_FPGA是什么?里面有什么?能做什么?
本文由硬禾学堂创始人苏公雨首发于微信公众号电路设计技能. 今天在群里有工程师问我,怎么才叫学会了FPGA,怎么才叫学好了FPGA?我相信有很多朋友有类似的问题,因为在多数人的潜意识里,FPGA是非常高 ...
- FPGA项目五:数码管动态扫描
文章目录 第五章 数码管动态扫描 第 1 节 项目背景 第 2 节 设计目标 第 3 节 设计实现 3.1 顶层信号 3.2 信号设计 3.3 信号定义 第四节 综合和上板 4.1 新建工程 4.2 ...
- 51单片机使用定时器进行数码管动态扫描程序
数码管是51单片机学习中比较基础的一个模块,为简化电路连接,提高系统可靠性,降低制造成本,多位数码管广泛采用动态扫描的方式进行显示.如果程序编写不当,数码管动态扫描容易出现亮度不均匀.亮度过低.重影等 ...
- c语言数码管流动显示一个数,51单片机数码管动态显示 - 数码管动态扫描显示01234567程序(三种方案)...
数码管动态扫描显示01234567程序二--51单片机动态显示共阳数码管01234567 原理图 c语言程序 程序如下: #include #define uint unsigned int #def ...
- 【Proteus仿真】8位数码管动态扫描显示变化数据
[Proteus仿真]8位数码管动态扫描显示变化数据 Proteus仿真 示例代码 /*-----------------------------------------------名称:8位数码管动 ...
- 【萌新向】STC8A8K64S4A12开发学习(三)——数码管动态扫描
数码管动态扫描 一.多位一体数码管 开发板上使用的是两个四位一体数码管,并且带有小数点,一个四位一体数码管共有12个引脚,各个位数码管共用一组a,b,c,d,e,f,g,dp引脚,通过另外4个引脚进行 ...
- linux 动态扫描 数码管,数码管动态扫描显示01234567程序(三种方案) - 全文
数码管由于价格便宜,使用简单,在电器特别是家电领域(比如空调.热水器和冰箱等)得到了极为广泛的应用.在高校电子信息类专业单片机的教学过程中,数码管动态显示及实现方法是学生普遍反映较难掌握的内容.鉴于此 ...
最新文章
- 不懂 Zookeeper?没关系,看这篇就够了!
- UT斯达康XV6700应用及常见问题
- 二十四、深入Java抽象类,抽象方法和接口
- Activity小技巧
- @keyframes—定义动画关键帧
- P2486 [SDOI2011]染色(树链剖分+线段树)
- 建立代理,而不是框架
- 关于K8s技术架构的几个问题
- android windows 上JNI编程
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration
- 1007. 素数对猜想 (20)-PAT乙级真题
- 传统的 IT 销售渠道将会走向末路?
- 认识了解WMV 9 视频编解码器
- springboot+easypoi excel表格多个sheet导出
- html5文本框获取焦点,CSS3实现文本输入框获取焦点高亮显示
- [计算机网络]第二章——应用层
- BOJ 427. 学姐逗学弟
- JMS介绍:我对JMS的理解和认识
- [Tensorflow2] 梯度反转层(GRL)与域对抗训练神经网络(DANN)的实现
- python入门学习笔记——详细基础知识篇(第10章 正则表达式(重点)与JSON)