与"开发板实战篇1 LED点灯(开篇)" 的区别,增加模式切换

 总结:

模块例化思想: 定时器模块 + 点灯模块

根据自己思路编写代码,调试仿真代码,同时熟悉环境.加深细节理解

segled_static_driver.v 实现不够简洁,感觉还可以优化,后面有思路再搞

注意:

若进行了QuartusII_13.0 和 Notepad++软件的关联,在modelsim中无法双击打开.v文件,只能通过工具栏的open文件夹图标打开, 我的电脑会打开altium designer软件 ,取消关联可恢复正常

每次打开modelsim时需要切换工作空间,否则可能创建工程添加的源码会是上一个仿真工程的代码,导致出错

一. 实现的功能

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

二. 功能框图

定时器模块:加计数器,计数到了产生overflow信号

segled控制模块:根据en使能信号,点亮数码管

打开方法:  tools -> netlist viewers -> rtl viewer

三. RTL代码

segled_static_top.v

与led_top.v基本相同。

COUNT_OVERFLOW = 26'd50_000_000,即闪烁周期为1S。

module segled_static_top (input clk,input reset,output [5:0] sel,output [7:0] seg_led
);parameter COUNT_OVERFLOW = 26'd50_000_000;wire   overflow;                 // 定时时间到timer #(.COUNT_OVERFLOW (COUNT_OVERFLOW))u_timer(.clk      (clk),.reset    (reset),.overflow (overflow)
);segled_static_driver u_segled_static_driver(clk,reset,overflow,sel,seg_led);endmodule

timer.v

除将overflow <=修改为非阻塞赋值外,其它与led点灯工程的相同。

/*
*********************************************************************************Copyright ©, 2018, CunXin_ All Rights Reserved*文 件 名: key_led.v*说    明: 程序功能无按键按下时, LED灯全灭; 按键1按下时, LED灯显示自右向左的流水效果;按键2按下时, LED灯显示自左向右的流水效果;按键3按下时,四个LED灯同时闪烁;按键4按下时, LED灯全亮*版    本: V000B00D00*创建日期: 2018年4月3日     下午12:16:49*创 建 人: wansaiyon*修改信息:
================================================================================*修 改 人            修改日期            修改内容 *<作者/修改者>      <YYYY/MM/DD>        <修改内容>
********************************************************************************
*/module timer #(parameter COUNT_OVERFLOW = 26'd10_000_000
) (input clk,input reset,output reg overflow
);localparam period = COUNT_OVERFLOW;reg [25:0] cnt;always @(posedge clk,negedge reset) beginif(!reset) begincnt <= 26'd0;overflow <= 1'b0;end        else if(cnt < period) begincnt <= cnt + 1'd1;overflow <= 1'b0;end        else begincnt <= 26'd0;overflow <= 1'b1;endendendmodule

segled_static_driver.v

主要功能:定义16个字符、显示字符状态切换、、seg_led显示输出。

/*
6位数码管
sel[0]  output  N16 第一个数码管位选信号
sel[1]  output  N15 第二个数码管位选信号
sel[2]  output  P16 第三个数码管位选信号
sel[3]  output  P15 第四个数码管位选信号
sel[4]  output  R16 第五个数码管位选信号
sel[5]  output  T15 第六个数码管位选信号
seg_led[0]  output  M11 数码管段选a
seg_led[1]  output  N12 数码管段选b
seg_led[2]  output  C9  数码管段选c
seg_led[3]  output  N13 数码管段选d
seg_led[4]  output  M10 数码管段选e
seg_led[5]  output  N11 数码管段选f
seg_led[6]  output  P11 数码管段选g
seg_led[7]  output  D9  数码管段选h
*/module segled_static_driver (input clk,input reset,input en,output reg [5:0] sel,output reg [7:0] seg_led
);// param define
localparam CHAR_0 = 8'b0100_0000;
localparam CHAR_1 = 8'b0111_1001;
localparam CHAR_2 = 8'b0010_0100;
localparam CHAR_3 = 8'b0011_0000;
localparam CHAR_4 = 8'b0001_1001;
localparam CHAR_5 = 8'b0001_0010;
localparam CHAR_6 = 8'b0000_0010;
localparam CHAR_7 = 8'b0111_1000;
localparam CHAR_8 = 8'b0000_0000;
localparam CHAR_9 = 8'b0001_0000;
localparam CHAR_a = 8'b0000_1000;
localparam CHAR_b = 8'b0000_0011;
localparam CHAR_c = 8'b0100_0110;
localparam CHAR_d = 8'b0010_0001;
localparam CHAR_e = 8'b0000_0110;
localparam CHAR_f = 8'b0000_1110;//reg define
reg [3:0] segled_ctrl;// 显示状态切换
always @(posedge clk,negedge reset ) beginif(!reset) beginsegled_ctrl <= 4'b0000;endelse if(en) beginsegled_ctrl <= segled_ctrl + 1'b1;endelse beginsegled_ctrl <= segled_ctrl;end
end// seg_led 输出显示
always @(posedge clk ,negedge reset) beginif(!reset) beginsel <= 6'b00_0000;seg_led <= CHAR_8;endelse if(en) beginsel <= 6'b00_0000;casex (segled_ctrl)4'b0000: begin seg_led <= CHAR_0;end4'b0001: begin seg_led <= CHAR_1;end4'b0010: begin seg_led <= CHAR_2;end4'b0011: begin seg_led <= CHAR_3;end4'b0100: begin seg_led <= CHAR_4;end4'b0101: begin seg_led <= CHAR_5;end4'b0110: begin seg_led <= CHAR_6;end4'b0111: begin seg_led <= CHAR_7;end4'b1000: begin seg_led <= CHAR_8;end4'b1001: begin seg_led <= CHAR_9;end4'b1010: begin seg_led <= CHAR_a;end4'b1011: begin seg_led <= CHAR_b;end4'b1100: begin seg_led <= CHAR_c;end4'b1101: begin seg_led <= CHAR_d;end4'b1110: begin seg_led <= CHAR_e;end4'b1111: begin seg_led <= CHAR_f;enddefault: beginseg_led <= CHAR_0;endendcaseendelse beginsel <= 6'b00_0000;seg_led <= seg_led;end
endendmodule

四.modelsim前仿真(功能仿真)

每次打开modelsim时需要切换工作空间,否则可能创建工程添加的源码会是上一个仿真工程的代码,导致出错 。

使用vscode打开segled_static_top.v, ctrl+shift+p,输入testbench,在terminal生成了segled_static_top_tb.v代码,需要安装插件verilog_testbench, 初始生成时可能提示失败,需要安装 python 库(根据错误提示自行百度)。

生成的代码有点错误,需要自己再做点修改。

segled_static_top_tb.v,

为了方便减小了计数器周期为26'd10。

`timescale  1ns / 1nsmodule tb_segled_static_top;// segled_static_top Parameters
parameter PERIOD          = 10            ;
parameter COUNT_OVERFLOW  = 26'd10;     // segled_static_top Inputs
reg   clk                                  = 0 ;
reg   reset                                = 0 ;// segled_static_top Outputs
wire  [5:0]  sel                           ;
wire  [7:0]  seg_led                       ;    initial
beginforever #(PERIOD/2)  clk=~clk;
endinitial
begin#(PERIOD*2) reset  =  1;
endsegled_static_top #(.COUNT_OVERFLOW ( COUNT_OVERFLOW ))u_segled_static_top (.clk                     ( clk            ),.reset                   ( reset          ),.sel                     ( sel      [5:0] ),.seg_led                 ( seg_led  [7:0] )
);endmodule

仿真波形

五.下载验证

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

但是发现4个LED有微弱的亮度,需要配置好未使用管脚的状态为高阻输入,同时将nCEO管脚修改为Use as regular I/0,修改后LED变为熄灭状态了。

在 Quartus 软件中默认未使用管脚的状态为弱上拉输入,所以未使用到的管脚上也是有电压的,只是驱动能力很弱,这往往会导致一些不安全的隐患,所以我们需要将未使用管脚的状态设置为三态输入。

在左侧Category一栏中选择Dual-Purpose Pin。对于需要使用EPCS器件的引脚时,需要将下图页面中所有的引脚都改成Use as regular IO,如果大家不确定工程中是否用到EPCS器件时,可以全部修改。本次实验只修改了nCEO一栏中, 将Use as programming pin修改为Use as regular I/0。

开发板实战篇2 6位数码管静态显示相关推荐

  1. 开发板实战篇3 6位数码管动态显示

    总结: 模块例化思想: 例化2个定时器模块 + 数码管驱动 根据自己思路编写代码,调试仿真代码,同时熟悉环境.加深细节理解 刚开始写得很乱,代码完全就是用modelsim仿真调试出来的 注意: 一. ...

  2. S3C2440 开发板实战(8):中断驱动

    中断驱动 一.查询方式 1.驱动程序 2.应用程序 3.结果测试 二.中断方式 1.中断内部函数实现方式(理论框架) 1.1. 异常处理结构 (1)设置异常向量表 (2)异常服务函数调用 1.2. 中 ...

  3. 嵌入式端音频开发(实战篇)之 4.2 把很多音频合成一个bin文件并统计每个音频文件的大小的方法(内含转换脚本)

    查看本系列全部文章请点击:嵌入式端音频开发系列汇总(持续更新) 查看本文全部内容:嵌入式端音频开发(实战篇)之 4.2 把很多音频合成一个bin文件并统计每个音频文件的大小的方法(内含转换脚本) 文件 ...

  4. C# Xamarin For Android移动开发项目实战篇

    一.课程介绍 在前面阿笨的<C# Xamarin移动开发基础进修篇>课程中,大家已经熟悉和了解了Xamarin移动App开发的基础知识和原理.本次分享课<C# Xamarin移动开发 ...

  5. fpga供电电压偏低会怎样_[走近FPGA]之开发板介绍篇

    开发板概述 在走近FPGA预告篇中,我们已经提到了系列文章使用的开发平台,硬木课堂Xilinx Artix 7 FPGA板,如下图所示.它使用的FPGA芯片型号为Xilinx Artix-7 XC7A ...

  6. 黑金AX301开发板学习(3)——动态数码管的时钟实验

    开发板的使用是AX301,学习资料可以在我的另一篇文章中找到.链接在如下:https://blog.csdn.net/qq_24213087/article/details/108238682 一.动 ...

  7. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--数码管电路驱动(八)

    声明:本文为原创作品,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 3.1 ...

  8. 黑金AX301开发板学习(2)——静态数码管的加法器实验

    开发板的使用是AX301,学习资料可以在我的另一篇文章中找到.链接在如下:https://blog.csdn.net/qq_24213087/article/details/108238682 一.静 ...

  9. 玩转mini2440开发板之【在64位WIN7/WIN10系统中安装USB驱动】

    玩mini2440开发板已经很多年了,虽然玩的不怎么精通,但是一直都有在弄.而电脑的操作系统也从最终的32位WinXP提升到了32位的Win7,而今更是到了64位的Win10.然后,却带来了一个很严重 ...

最新文章

  1. POJ_2001_Shortest Prefixes
  2. 可以插卡的ipad_ipad哪个可以插手机卡上网的?
  3. C++中的union(联合体,共用体,数据变量可以共享内存,以节省内存空间)
  4. wxWidgets:wxSplitterWindow类用法
  5. BackGroundWorker用法
  6. 【“互联网+”大赛华为云赛道】API命题攻略:厘清三步解题思路,用好开发工具
  7. 精雕道路怎么遍弧形_有网友私信我问郑州融信奥体世纪这个楼盘怎么样他今天来...
  8. java arraylist线程安全_面试题1:ArrayList 是线程安全的吗?如果要实现一个线程安全的List应该怎么做?...
  9. Ubuntu16下载tomcat8
  10. mdui前端插件,有菜单对话框等
  11. 相关性和显著性检验学习笔记
  12. BMS 中的安规设计
  13. 数组的扁平化方法总结
  14. 中国用于先天性代谢错误的医用食品市场深度研究分析报告
  15. css元素点击后变色,且点击别的地方不会颜色消失
  16. verilog验证平台技巧(避免竞争的办法)
  17. 自己整理的Opencore引导版本升级教程【保姆级详细】
  18. 今天才发现,手机外放声音小,这样设置一下,轻松增大手机音量
  19. MIB Browser使用方法
  20. Jetson Nano、TX2等 conda 虚拟环境中使用TensorRT、gi等

热门文章

  1. 基于 Sodor 的矩阵乘法加速器设计之C++
  2. 苏享茂事件,公众可以遗忘,但我们不能遗忘!
  3. android 特效相机实现,安卓特效相机(三) OpenGL ES 特效渲染
  4. 【数据结构】八大经典排序(两万字大总结)
  5. 惊现,thinkphp也可以生成格式化图片了
  6. Xpath-彼岸图网高清图片获取
  7. css做出圆角矩形边框
  8. 绘制地铁线路html,基于HTML5技术绘制上海地铁图
  9. react 生命周期
  10. Angular14 Visual Studio Code作为Angular开发工具常用插件安装、json-server安装与使用、angular/cli安装失败问题、emmet安装...