数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)
一个数码管有九个引脚,控制八段二极管的亮灭,用以显示需要的数字。
当有N个数码管时,一个一个控制的话需要N x 9 个引脚,消耗资源较多。
因此可以利用动态显示的方案通过人眼的视觉暂留特性达到静态显示的效果(动态显示周期<20ms),只需N+8个引脚。节省了大量资源。(动态静显)
数码管动态显示的逻辑电路如下:
Verilog设计代码如下:
module digital_tube(//八个数码管显示
clk,
reset,
disp_num_all,
dg_tube,
tube_part
); input clk ;
input reset ;
input [31:0]disp_num_all ;
output [7:0]dg_tube ;
output [7:0]tube_part ; parameter one_dis_t = 25'd1_000_000 ;//每个晶体管显示时间(计数) reg [16:0]counter1 ;
reg [2:0] counter2 ; always @ ( posedge clk or negedge reset )//分频
begin
if (! reset )
counter1 <= 17'd0 ;
else if ( (one_dis_t-1) <= counter1 )
counter1 <= 17'd0 ;
else
counter1 <= counter1 +1'b1 ;
end always @ ( posedge clk or negedge reset )//循环
begin
if (! reset )
counter2 <= 3'd0 ;
else if ( (one_dis_t-1) <= counter1 )
counter2 <= counter2 +1'b1 ;
end wire [3:0]disp_num_one ; //3-8译码器 控制哪个数码管显示
decoder_3_8 tube_select(//控制
.a(counter2[2] ),
.b(counter2[1]),
.c(counter2[0]),
.out(dg_tube)
); //需要一个八选一选通器,对应哪个数码管显示什么内容
mux8 tube_display(//选通
.sel(counter2),
.data(disp_num_all),
.out(disp_num_one)
); //真值表对应显示数字
LUT_truth translator(//控制
.num(disp_num_one),
.out(tube_part)
);
endmodule
module decoder_3_8(
a,
b,
c,
out
);
input a;
input b;
input c;
output reg [7:0]out; always@(*)begin//等价于always({a,b,c})a是高位,c是低位
case({a,b,c})
3'b000:out=8'b0000_0001;
3'b001:out=8'b0000_0010;
3'b010:out=8'b0000_0100;
3'b011:out=8'b0000_1000;
3'b100:out=8'b0001_0000;
3'b101:out=8'b0010_0000;
3'b110:out=8'b0100_0000;
3'b111:out=8'b1000_0000;
endcase
end endmodule
module mux8(
sel,
data,
out
); input [2:0]sel ;
input [31:0]data ;
output reg [3:0]out ; always@(*)
begin
case(sel) 3'b000 : out = data[3:0] ;
3'b001 : out = data[7:4] ;
3'b010 : out = data[11:8] ;
3'b011 : out = data[15:12] ;
3'b100 : out = data[19:16] ;
3'b101 : out = data[23:20] ;
3'b110 : out = data[27:24] ;
3'b111 : out = data[31:28] ; endcase
end
endmodule
module LUT_truth(
num,
out
); input [3:0]num ;
output reg [7:0]out ; always@(num)
begin
case(num)
4'h0 : out = 8'hc0 ;
4'h1 : out = 8'hf9 ;
4'h2 : out = 8'ha4 ;
4'h3 : out = 8'hb0 ;
4'h4 : out = 8'h99 ;
4'h5 : out = 8'h92 ;
4'h6 : out = 8'h82 ;
4'h7 : out = 8'hf8 ;
4'h8 : out = 8'h80 ;
4'h9 : out = 8'h90 ;
4'ha : out = 8'h88 ;
4'hb : out = 8'h83 ;
4'hc : out = 8'hc6 ;
4'hd : out = 8'ha1 ;
4'he : out = 8'h86 ;
4'hf : out = 8'h8e ;
endcase
end
endmodule
`timescale 1ns / 1ns
module digital_tube_tb(); reg clk ;
reg reset ;
reg [31:0]disp_num_all;
wire [7:0]dg_tube ;
wire [7:0]tube_part ; digital_tube
#(
.one_dis_t( 100 )
)
digital_tube_im(//八个数码管显示
clk,
reset,
disp_num_all,
dg_tube,
tube_part
); initial clk = 1 ;
always #10 clk = ! clk ;
initial
begin
reset = 0 ;
disp_num_all = 32'd0 ;
#201 ;
reset = 1 ;
#200 ;
disp_num_all = 32'habb02525 ;
#20000;
disp_num_all = 32'h52520bba ;
#30000;
$stop;
end endmodule
数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)的更多相关文章
- 10-8位7段数码管驱动实验——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的: 1.实现FPGA驱动数码管动态显示: 2.使用In system sources and probes editor工具,输入需要显示在数码管上的的数据, ...
- 【小梅哥FPGA进阶教程】串口发送图片数据到SRAM在TFT屏上显示
十五.串口发送图片数据到SRAM在TFT屏上显示 之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够.小梅哥给了个方案,利 ...
- 【小梅哥FPGA进阶教程】第十二章 数字密码锁设计
十二.数字密码锁设计 本文由山东大学研友袁卓贡献,特此感谢 实验目的 实现数字密码锁设计,要求矩阵按键输出且数码管显示输入密码,密码输入正确与否均会有相应标志信号产生. 实验平台 芯航线FPGA核心板 ...
- 【小梅哥FPGA进阶教程】MC8051软核在FPGA上的使用
十.MC8051软核在FPGA上的使用 本教程内容力求以详细的步骤和讲解让读者以最快的方式学会 MC8051 IP core 的应用以及相关设计软件的使用,并激起读者对 SOPC 技术的兴趣.本实验重 ...
- 小梅哥FPGA数字逻辑设计教程——基于线性序列机的TLC5620型DAC驱动设计
基于线性序列机的TLC5620型DAC驱动设计 目录 TLC5620型DAC芯片概述: 2 TLC5620型DAC芯片引脚说明: 2 TLC5620型DAC芯片详细介绍: 3 TLC ...
- 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器
九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...
- 【小梅哥SOPC学习笔记】SOPC开发常见问题及解决办法集锦
SOPC开发常见问题及解决办法集锦 一.Symbol 'NULL' could not be resolved 近期在评估使用NIOS II处理器进行项目的开发,我使用的软件是Quartus II 1 ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- 【小梅哥FPGA进阶教程】第十四章 TFT屏显示图片
十四.TFT屏显示图片 本文由杭电网友曾凯峰贡献,特此感谢 学习了小梅哥的TFT显示屏驱动设计后,想着在此基础上通过TFT屏显示一张图片,有了这个想法就开始动工了.首先想到是利用FPGA内部ROM存储 ...
随机推荐
- iNeuOS工业互联网操作系统,数据点、设备和业务的计算与预警
目 录 1. 概述... 2 2. 概念解释... 2 3. 数据点的计算与预警... 2 4. 设备的计算与预警... 3 5. 业务的 ...
- 一文搞懂 Linux 的 inode!
一个执着于技术的公众号 1.inode 是什么 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于 ...
- css的flex布局调试
学习经验-css的flex布局 今天遇到一个小问题 在给三个div布局时,设置父元素display:flex 此时三个div的宽度均为50%,他们并没有超出屏幕的宽度,还是撑满了父元素. 为什么呢? ...
- Golang:手撸一个支持六种级别的日志库
Golang标准日志库提供的日志输出方法有Print.Fatal.Panic等,没有常见的Debug.Info.Error等日志级别,用起来不太顺手.这篇文章就来手撸一个自己的日志库,可以记录不同级别 ...
- 【FAQ】申请华为运动健康服务授权的4个常见问题及解决方法
华为运动健康服务(HUAWEI Health Kit)提供原子化数据开放,在获取用户对数据的授权后,应用可通过接口访问运动健康数据,对用户数据进行增.删.改.查等操作,为用户提供运动健康类数据服务.这 ...
- 解决 js aysnc await try-catch 地狱
- drools规则属性(rule attributes)的使用
一.介绍 规则属性是您可以添加到业务规则以修改规则行为的附加规范. 在 DRL 文件中,您通常在规则条件和操作的上方定义规则属性,多个属性位于单独的行中,格式如下: rule "rule_n ...
- 【多线程】线程强制执行 join()
线程强制执行 join() Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞 : 可以想象成插队. 代码示例: /** * @Description 测试join方法 * @Auth ...
- 【算法】基数排序(Radix Sort)(十)
基数排序(Radix Sort) 基数排序是按照低位先排序,然后收集:再按照高位排序,然后再收集:依次类推,直到最高位.有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序.最后的次序就 ...
- 好客租房9-jsx的学习目标
1能够知道什么是jsx 2能够使用jsx创建react元素 3能够在jsx使用javascript表达式 4能够使用jsx的条件渲染和列表渲染 5能够给jsx添加样式 jsx的基本使用 jsx中使用j ...