目录

  • 1、实验平台
  • 2、实验目的
    • 2.1、实验内容
  • 3、实验流程
    • 3.1、实验原理
    • 3.2、系统架构
    • 3.3、功能模块划分
      • 3.3.1、数据产生模块
        • 模块框图
        • 信号定义
        • 设计文件
      • 3.3.2、数码管驱动模块
        • 模块框图
        • 信号定义
        • 设计文件
      • 3.3.3、顶层文件
    • 3.4、板级验证
  • 4、总结

1、实验平台

软件:PC、Quartus Prime 18.1、Modelsim 10.5b
硬件:Altera FPGA开发板(EP4CE6E22F17C8)

2、实验目的

  • 1、掌握数码管的静态显示与动态刷新
  • 2、计数器练习

2.1、实验内容

静态显示 0~F
动态显示-秒表设计

3、实验流程

3.1、实验原理

根据开发板的原理图,可得到以下资料

数码管:本质上为一组发光二极管按照一定顺序排列而成,其显示原理与LED无异。

根据硬件原理图所示,发光二极管,所有的阳极都接通3.3V的正电压,也即—高电平,所以如果我们想要
发光二极管导通的话,需要在阴极接通低电平,就可以让LED亮起来。

3.2、系统架构

根据系统要求,可以得到以下框架分布

3.3、功能模块划分

根据系统构建,可得到以下模块

3.3.1、数据产生模块

模块框图

信号定义
信号名 端口类型 数据位宽 信号说明
Clk i 1 输入时钟信号,50MHz
Rst_n i 1 输入复位信号,低电平有效
data_o O 32 输出待显示数据,8位数码管可显示32位16进制数据
设计文件
/*================================================*\Filename ﹕data_gen.vAuthor ﹕AdolphDescription  ﹕产生数码管需要显示的数据. 32'h11111111~32'h33333333;Called by ﹕seg_top.v
Revision History   ﹕ 2022-6-6 15:49:24Revision 1.0Email﹕adolph1354238998@gmail.comCompany﹕
\*================================================*/
module data_gen(input   clk ,input  rst_n,output    reg [31:0] data_dis
);parameter TIME_DELAY = 25'd2500;reg     [24:0]  cnt_delay;always@(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_delay <= 25'd0;endelse if(cnt_delay >= TIME_DELAY - 25'd1)begincnt_delay <= 25'd0;endelse begincnt_delay <= cnt_delay + 25'd1;endendalways@(posedge clk or negedge rst_n)beginif(!rst_n)begindata_dis <= 32'h1111_1111;endelse if(data_dis == 32'h3333_3333)begindata_dis <= 32'h1111_1111;endelse if(cnt_delay >= TIME_DELAY - 25'd1)begindata_dis <= data_dis + 32'h1;endelse begindata_dis <= data_dis;endendendmodule

本模块较为简单,此处不做仿真验证,如有兴趣可自行验证

3.3.2、数码管驱动模块

模块框图

信号定义
信号名 端口类型 数据位宽 信号说明
Clk i 1 输入时钟信号,50MHz
Rst_n i 1 输入复位信号,低电平有效
data_in i 32 输入按键消抖信号,高电平有效
dig_sel O 8 数码管位选信号,由原理图可知,低电平有效
dig_seg O 8 数码管段选信号,由原理图可知,低电平有效
设计文件
/*================================================*\Filename ﹕seg_driver.vAuthor ﹕AdolphDescription  ﹕对输入的数据译码,并驱动数码管显示对应数据Called by ﹕seg_top.v
Revision History   ﹕ 2022-5-30 14:27:22Revision 1.0Email﹕adolph1354238998@gmail.comCompany﹕
\*================================================*/
module seg_driver(input         clk     ,input          rst_n   ,input    [31:0]dis_data,//待显示的数据output reg[7:0]    dig_sel ,output reg[7:0]    dig_seg
);
//wire  [31:0]dis_data;//   assign dig_seg = 8'd0;
//  assign dig_sel = 1'b0;localparamNUM_0     = 8'hC0,NUM_1     = 8'hF9,NUM_2     = 8'hA4,NUM_3     = 8'hB0,NUM_4     = 8'h99,NUM_5     = 8'h92,NUM_6     = 8'h82,NUM_7     = 8'hF8,NUM_8     = 8'h80,NUM_9     = 8'h90,NUM_A     = 8'h88,NUM_B     = 8'h83,NUM_C     = 8'hC6,NUM_D     = 8'hA1,NUM_E     = 8'h86,NUM_F     = 8'h8E,LIT_ALL   = 8'h00,BLC_ALL   = 8'hFF;parameter CNT_REF = 25'd1000;reg    [9:0]   cnt_20us; //20us计数器reg  [3:0]   data_tmp; //用于取出不同位选的显示数据// assign dis_data = 32'hABCD_4413;
//描述位选信号切换//描述刷新计数器always@(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_20us <= 25'd0;endelse if(cnt_20us >= CNT_REF - 25'd1)begincnt_20us <= 25'd0;endelse begincnt_20us <= cnt_20us + 25'd1;endendalways@(posedge clk or negedge rst_n)beginif(!rst_n)begindig_sel <= 8'hfe;//8'b1111_1110endelse if(cnt_20us >= CNT_REF - 25'd1)begindig_sel <= {dig_sel[6:0],dig_sel[7]};endelse begindig_sel <= dig_sel;endend//段选信号描述always@(posedge clk or negedge rst_n)beginif(!rst_n)begindata_tmp <= 4'd0;endelse begincase(dig_sel)8'b1111_1110:data_tmp <= dis_data[ 3-:4];8'b1111_1101:data_tmp <= dis_data[ 7-:4];8'b1111_1011:data_tmp <= dis_data[11-:4];8'b1111_0111:data_tmp <= dis_data[15-:4];8'b1110_1111:data_tmp <= dis_data[19-:4];8'b1101_1111:data_tmp <= dis_data[23-:4];8'b1011_1111:data_tmp <= dis_data[27-:4];8'b0111_1111:data_tmp <= dis_data[31-:4];default: data_tmp <= 4'hF;endcaseendendalways@(posedge clk or negedge rst_n)beginif(!rst_n)begindig_seg <= BLC_ALL;endelse begincase(data_tmp)4'h0 : dig_seg <= NUM_0;4'h1 : dig_seg <= NUM_1;4'h2 : dig_seg <= NUM_2;4'h3 : dig_seg <= NUM_3;4'h4 : dig_seg <= NUM_4;4'h5 : dig_seg <= NUM_5;4'h6 : dig_seg <= NUM_6;4'h7 : dig_seg <= NUM_7;4'h8 : dig_seg <= NUM_8;4'h9 : dig_seg <= NUM_9;4'hA : dig_seg <= NUM_A;4'hB : dig_seg <= NUM_B;4'hC : dig_seg <= NUM_C;4'hD : dig_seg <= NUM_D;4'hE : dig_seg <= NUM_E;4'hF : dig_seg <= NUM_F;default: ;endcase endendendmodule

仿真验证

`timescale 1ns/1nsmodule tb_dig;reg     clk;reg     rst_n;wire  [7:0]   dig_sel;wire    [7:0]   dig_seg;reg     [39:0]  CHARAC;//1个 ASCII 码,需要8bit 二进制表示defparam seg_driver.CNT_REF = 100;localparamNUM_0 = 8'hC0,NUM_1 = 8'hF9,NUM_2 = 8'hA4,NUM_3 = 8'hB0,NUM_4 = 8'h99,NUM_5 = 8'h92,NUM_6 = 8'h82,NUM_7 = 8'hF8,NUM_8 = 8'h80,NUM_9 = 8'h90,NUM_A = 8'h88,NUM_B = 8'h83,NUM_C = 8'hC6,NUM_D = 8'hA1,NUM_E = 8'h86,NUM_F = 8'h8E;always@(*)begincase(dig_seg)NUM_0 : CHARAC = "NUM_0";NUM_1 : CHARAC = "NUM_1";NUM_2 : CHARAC = "NUM_2";NUM_3 : CHARAC = "NUM_3";NUM_4 : CHARAC = "NUM_4";NUM_5 : CHARAC = "NUM_5";NUM_6 : CHARAC = "NUM_6";NUM_7 : CHARAC = "NUM_7";NUM_8 : CHARAC = "NUM_8";NUM_9 : CHARAC = "NUM_9";NUM_A : CHARAC = "NUM_A";NUM_B : CHARAC = "NUM_B";NUM_C : CHARAC = "NUM_C";NUM_D : CHARAC = "NUM_D";NUM_E : CHARAC = "NUM_E";NUM_F : CHARAC = "NUM_F";default : CHARAC = "NUM_0";endcaseendseg_driver     seg_driver(/*input              */.clk      (clk    ),/*input               */.rst_n    (rst_n  ),/*output reg[7:0] */.dig_sel  (dig_sel),/*output reg[7:0] */.dig_seg  (dig_seg)
);initial clk = 1'b0;always #10 clk = ~clk;initial beginrst_n = 1'b0;#36 rst_n = 1'b1;wait (seg_driver.lut == 15);#(20 * seg_driver.CNT_REF * 3);$stop(2);endendmodule

3.3.3、顶层文件

顶层文件在此不作讲解,根据下列RTL视图,相信读者可以很轻易的完成相应代码设计

RTL视图

3.4、板级验证

可以看到数码管由32‘h11111111每次自增1,在数据生成模块中可以调整变化速率。

4、总结

本设计实现了基本的字符显示,动态扫描
大家可以基于自己的理解完成秒表、数字钟之类的设计,相信聪明的你一定可以,加油!

Verilog 实现数码管显视驱动【附源码】相关推荐

  1. 02【Verilog实战】异步FIFO设计(附源码RTL/TB)

    脚 本:makefile 工 具:vcs 和 verdi 文 章:1. 同步FIFO的设计和功能验证(附源码)     2. Verilog的亚稳态现象和跨时钟域处理方法 写在前面 这个专栏的内容记录 ...

  2. 01 【Verilog实战】同步FIFO的设计(附源码RTL/TB)

    虚拟机:VMware -14.0.0.24051 环 境:ubuntu 18.04.1 脚 本:makefile(点击查看) 应用工具:vcs 和 verdi 写在前面 这个专栏的内容记录的是个人学习 ...

  3. 04【Verilog实战】SPI协议底层硬件接口设计(附源码RTL/TB)

    脚  本:makefile 工  具:vcs 和 verdi 写在前面 这个专栏的内容记录的是个人学习过程,博文中贴出来的代码是调试前的代码,方便bug重现. 调试后的程序提供下载,[下载地址] 发现 ...

  4. 03【Verilog实战】UART通信协议,半双工通信方式(附源码)

    脚 本:makefile(点击直达) 应用工具:vcs 和 verdi 写在前面 这个专栏的内容记录的是个人学习过程,博文中贴出来的代码是调试前的代码,方便bug重现. 调试后的程序提供下载,[下载地 ...

  5. 05【Verilog实战】AMBA 3 APB接口设计(附源码RTL/TB)

    官方手册:点击下载 脚  本:makefile 工  具:vcs & verdi 写在前面 这个专栏的内容记录的是个人学习过程,博文中贴出来的代码是调试前的代码,方便bug重现. 调试后的程序 ...

  6. devexpress表格控件gridcontrol设置隔行变色、焦点行颜色、设置(改变)显示值、固定列不移动(附源码)...

    介绍一些常用的gridcontrol设置. 1.设置隔行变色.首先设置显示隔行变色,步骤:OptionsView-->EnableAppearanceEvenRow-->true和Opti ...

  7. Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)

    文章目录 全系列传送门 引言 驱动介绍 Hello World 1. 包含头文件 2. 驱动模块的入口和出口 3. 声明信息 4. 功能实现 完整代码 编译 第一种方法 第二种方法 编译成模块 第一步 ...

  8. web python 自动化是什么_Selenium 凭什么成为 Web 自动化测试的首选?(内附源码)...

    原标题:Selenium 凭什么成为 Web 自动化测试的首选?(内附源码) 自动化 · 工具 1.QTP QTP是一个商业化的功能测试工具,收费,支持web,桌面自动化测试. 2. Selenium ...

  9. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码...

    C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 原文:C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 前言 系列 ...

最新文章

  1. Centos7下安装Docker1.8
  2. C++ 数值的整数次方 (最小int取反,递归实现乘方)
  3. 非常完善的Log4net详细说明(转)
  4. [翻译]用于.NET Core的Windows窗体设计器发布
  5. 电脑键盘下划线怎么打_电脑键盘失灵怎么办?你应该学会的四种方法
  6. nacos 配置动态刷新_使用 Spring Cloud Alibaba Nacos Config 作为配置中心
  7. 淘宝直播应关注哪些方面?
  8. STM32——库函数流水灯程序
  9. Nachos LAB1 线程机制和线程调度实现
  10. 离心泵CAE_2_ICEM剖分网格_2_叶轮流道
  11. python怎么打开cmd-python中调用cmd
  12. 双稳态电路的两个稳定状态是什么_555时基电路内部结构及其工作原理
  13. 苹果服务器关闭微信,为什么苹果手机关闭微信也能收到消息?这就是国内安卓耗电高的原因...
  14. Oracle 调优确定存在问题的SQL
  15. Java-彩票游戏例题
  16. 开不开心,都要让自己开心
  17. 投影法字符分割matlab,利用投影法进行字符分割
  18. DES_3DES_AES_IDES_RSA密码算法比较
  19. 图形学/OpenGL/3D数学/Unity
  20. 混合高斯模型去除背景

热门文章

  1. 一颗躁动的心---下决心从SLAM开始,不钻研嵌入式底层了
  2. html5水调歌头代码,词牌名《水调歌头》5首
  3. 计算机固态硬盘怎么当u盘使用方法,固态硬盘也能当U盘用?这样做几秒钟就能传一部电影...
  4. 量子伪心灵感应实验表明:现实居然在你观察到它之前并不存在?
  5. Vue前端开发——微信登录
  6. JAVA开发地图编辑器_用Java写一个地图编辑器
  7. 【上电即上华为云】华为云openCPU智联模组_Cat.1_MC615-CN-L610-CN_云喇叭TTS语音
  8. 产品,开发,业务的科学吵架指南:每次吵完架后都觉得自己没发挥好怎么办?...
  9. voc数据 map f1计算
  10. py文件打包成exe Failed to import module __PyInstaller_hooks_0_skimage_io required by hook for module 已解决