当前位置: 首页 > news >正文

FPGA开发——数码管的使用(二)

一、概述

     在上一篇文章中我们针对单个数码管的静态显示和动态显示进行了一个设计和实现,这篇文章中我们针对多个数码管同时显示进行一个设计。这里和上一篇文章唯一不同的是就是数码管位选进行了一个改变,原来是单个数码管的显示,所以位选就直接赋值就可以了,但在本篇文章中一次性使用了多个数码管,所以在位选信号中我们就需要进行一个更改。

实验的重难点

在进行多位数码管的显示时,最大的难点就是怎样选择每个数码管的位选,以及每个数码管之间显示的时间间隔,这时本次设计中所设计的两个重难点,只要掌握着两个点,设计也就变得非常简单。

二、工程实现

1、设计文件的编写

       在针对上面的两个难点,我们在编写代码时拼接语法的方式实现位选的循环移动,将不同数码管显示的值使用位选变量作为条件写在一个case语句中,以实现我们预设的012345的字符显示。这里在对8段发光二极管显示字符进行设计时,我们和前一篇文章一样需要先确认时共阴极还是共阳极(这里使用的是共阳极),如果时共阴极就是高电平驱动,反之,就是低电平驱动。通过给8段对应的二极管进行0或者1的赋值,共同组成不同的字符。

module seg0(input  clk,input  rst_n,output reg [5:0] seg_sel,//位选output reg [7:0] seg_dual//段选
);
localparam  ZERO  = 8'b1100_0000, //共阳极段码ONE   = 8'b1111_1001,TWO   = 8'b1010_0100,THREE = 8'b1011_0000,FOUR  = 8'b1001_1001,FIVE  = 8'b1001_0010;
reg [15:0] cnt;//ms计数器
wire       add_cnt;
wire       end_cnt;
reg     [4:0]   flag;
wire            add_flag;
wire            end_flag;always @(posedge clk or negedge rst_n)beginif(!rst_n)cnt<=0;else if(add_cnt)beginif(end_cnt)cnt<=0;elsecnt<=cnt+1'b1;end
end
assign add_cnt=1'b1;
assign end_cnt=add_cnt && (cnt==50_000-1);always @(posedge clk or negedge rst_n)beginif(!rst_n)seg_sel<=6'b111_110;else if(end_cnt)seg_sel<={seg_sel[4:0],seg_sel[5]};
endalways @(posedge clk or negedge rst_n)beginif(!rst_n)seg_dual<=8'b1111_1111;else begincase (seg_sel)6'b111_110:seg_dual<=ZERO ;6'b111_101:seg_dual<=ONE  ;6'b111_011:seg_dual<=TWO  ; 6'b110_111:seg_dual<=THREE;6'b101_111:seg_dual<=FOUR ;6'b011_111:seg_dual<=FIVE ;default: ;endcaseend 
end
endmodule 

2、测试文件编写

这里很简单,我就不进行波形仿真了,下面是测试文件,感兴趣的可以去仿真一下,我就直接在后面给出下板验证的结果。

//定义时间尺度
`timescale 1ns/1ns
module seg0_tb ;//输入信号定义
reg  clk;
reg rst_n;
wire [7:0] seg_dual;
wire [5:0] seg_sel;
//模块例化
seg0 seg_inst(/*input */.clk      (clk     ),/*input */.rst_n    (rst_n   ),/*output*/.seg_sel  (seg_sel ),/*output*/.seg_dual (seg_dual));
//激励信号产生
parameter CLK_CLY = 20;
//时钟
initial clk=1;
always #(CLK_CLY/2)clk=~clk;//复位
initial beginrst_n= 1'b0;#(CLK_CLY*3);#5;//复位结束避开时钟上升沿rst_n= 1'b1;
end
endmodule

3、下板验证

图片中我们可以看到6个数码管从0显示到5,成功设计成多个数码管同时显示。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 敏捷开发笔记(第14章节)--TEMPLATE METHOD模式和STRATEGY模式:继承与委托
  • 【第四节】python面向对象
  • 基于 LangChain 开发应用程序第七章-代理
  • 781页 | 2024全国数据资产政策法规汇编(可下载)
  • 富唯智能转运机器人:高效、智能、未来的选择
  • 代码随想录算法训练营第二十六天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
  • 11部门公布第二批国家数字乡村试点地区名单
  • uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功
  • K8S Service-NodePort:固定端口
  • 数据化项目中如何优化数据分析报表的响应速度
  • 宠物伴侣应用
  • Redisson中RSemaphore的使用场景及例子
  • 【微服务】微服务架构概念
  • 前端如何实现更换项目主题色的功能?
  • 全面整理人工智能(AI)学习路线图及资源推荐
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • C++类中的特殊成员函数
  • echarts的各种常用效果展示
  • EventListener原理
  • iOS小技巧之UIImagePickerController实现头像选择
  • React-生命周期杂记
  • Redis的resp协议
  • Swift 中的尾递归和蹦床
  • Twitter赢在开放,三年创造奇迹
  • VUE es6技巧写法(持续更新中~~~)
  • Vue.js 移动端适配之 vw 解决方案
  • - 概述 - 《设计模式(极简c++版)》
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 前端性能优化--懒加载和预加载
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 通信类
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习JavaScript数据结构与算法 — 树
  • 栈实现走出迷宫(C++)
  • 走向全栈之MongoDB的使用
  • 最近的计划
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​Java基础复习笔记 第16章:网络编程
  • #Z2294. 打印树的直径
  • #职场发展#其他
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (理论篇)httpmoudle和httphandler一览
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)kafka实战——kafka源码编译启动
  • (原)Matlab的svmtrain和svmclassify
  • (转)Unity3DUnity3D在android下调试
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ./configure,make,make install的作用
  • .gitignore文件忽略的内容不生效问题解决
  • .NET 使用 XPath 来读写 XML 文件
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池