【FPGA】Verilog:组合逻辑电路应用 | 数码管 | 8421BCD编码 | 转换七段数码管段码

news2025/1/15 22:43:16

前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载

示例:数码管的使用

  • 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 
  • 配置方式:USB-JTAG/SPI Flash
  • 高达100MHz 的内部时钟速度 
  • 存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A)
  • 通用IO:Switch :x8LED:x16Button:x5DIP:x8   通用扩展IO:32pin
  • 音视频/显示: 7段数码管:x8 VGA视频输出接口 Audio音频接口 
  • 通信接口:UART:USB转UART   Bluetooth:蓝牙模块 
  • 模拟接口: DAC:8-bit分辨率   XADC:2路12bit 1Msps ADC

目录

 Ⅰ. 前置知识

0x01 七段数码管工作原理

 0x01 多位数码管工作原理

Ⅱ. Verilog实现

0x00 实现内容

0x01  设计代码文件

0x02 仿真代码文件

0x03 观察记录仿真波形

 0x04 添加引脚约束

 Ⅳ 知识扩展

0x00 扩展实验


 Ⅰ. 前置知识

0x01 七段数码管工作原理

共阴极七段数码管内部结构如图。七个线形LED灯a~g构成七段,其位置序号如图:

一端并接称为位码;一端分别接收电平信号以控制灯的亮灭,称为段码。

点亮要求为:共阴型数码管位码接低电平,需点亮的段码接高电平。若数码管类型为共阳极,其点亮要求的电平正好相反。

BCD码转七段数码管的电路作用是将BCD码表示的十进制数转换成七段LED数码管的7个驱动段码端。

如输入DB(A3、A2、A1、A0),输出g-a。如输入数据为0000,则控制数码管显示“0”形,即f~a灯亮,g灯灭,若设计的译码器用于控制共阴极数码管,则输出的g~a的信号为0111111。

以8421BCD码转七段数码管段码为例,说明电路原理:

8421BCD码转七段数码管段码是将BCD码表示的十进制数转换成七段LED数码管的7个驱动段码,真值表如下

数字

输入

输出

B8

B4

B2

B1

a

b

c

d

e

f

g

0

0

0

0

0

1

1

1

1

1

1

0

1

0

0

0

1

0

1

1

0

0

0

0

2

0

0

1

0

1

1

0

1

1

0

1

3

0

0

1

1

1

1

1

1

0

0

1

4

0

1

0

0

0

1

1

0

0

1

1

5

0

1

0

1

1

0

1

1

0

1

1

6

0

1

1

0

1

0

1

1

1

1

1

7

0

1

1

1

1

1

1

0

0

0

0

8

1

0

0

0

1

1

1

1

1

1

1

9

1

0

0

1

1

1

1

1

0

1

1

10

1

0

1

0

d

d

d

d

d

d

d

...

15

1

1

1

1

d

d

d

d

d

d

d

下面以a为例介绍原理与过程。首先绘制输出a的卡诺图如下表:

B2B1

B8B4

00

01

11

10

00

1

0

1

1

01

0

1

1

1

10

1

1

d

d

11

d

d

d

d

然后考虑无关项的必要质蕴含项,如图:

接着就可以得到最简与或式了。

同样方法,根据真值表画出每个输出项的卡诺图,化简得到b-g的逻辑表达式。a-g的逻辑表达式如下:

 根据上述逻辑表达式,可用Verilog语言编写设计源代码

或用IP包搭建电路如图:

 0x01 多位数码管工作原理

下图示意了四个数码管组合的结构:

由于实验板内部采用驱动电路控制数码管,其内部结构和控制方法采用以下规则:四个数码管的段码引脚按序号分别并接,用位码控制某一个数码管的亮灭。

如:要让图中第1、3个数码管显示“0”,其他2、4数码管全灭,可以给a~g送段码8'b11111100,给1~4送位码4'b1010。

这里我们EG01 实验板卡为 FPGA 板级验证平台:

实验板上共有8个八段数码管,分为两组,因此段码a~h的连接方案有两种,分别为:B4、A4、A3、B1、A1、B3、B2、D5(0组);D4、E3、D3、F4、F3、E2、D2、H2(1组)。位码1-8的引脚编号分别为:G2、C2、C1、H1、G1、F1、E1、G6。在编写引脚约束时,也可结合实验板丝印进行填写。

Ⅱ. Verilog实现

0x00 实现内容

采用Verilog设计一个编码转换电路,将输入的8421BCD编码转换七段数码管段码,并利用EGO1实验板上的数码管上显示与输入数据对应的十进制值。

0x01  设计代码文件

Veriog HDL 共有三种建模方式。

其描述风格分为结构描述、数据流描述、行为描述以及混合描述。

为了方便读者,本篇博客使用行为描述和数据流描述两种建模方法进行建模

行为描述建模:

module hex7seg(input wire [3:0] x,output reg [6:0] a_to_g);
always @ (x)
	case(x)
		0:a_to_g=7'b1111110;
		1:a_to_g=7'b0110000;
		2:a_to_g=7'b1101101;
		3:a_to_g=7'b1111001;
		4:a_to_g=7'b0110011;
		5:a_to_g=7'b1011011;
		6:a_to_g=7'b1011111;
		7:a_to_g=7'b1110000;
		8:a_to_g=7'b1111111;
		9:a_to_g=7'b1111011;
		default:a_to_g=7'b0000001;
	endcase
endmodule



module hex7seg_top(sw,a_to_g,an,dp);
	input wire [3:0] sw;
	output wire [6:0] a_to_g;
	output wire [3:0] an;
	output wire dp;
		assign an=4'b1111;
		assign dp=0;
	hex7seg D4(.x(sw),.a_to_g(a_to_g));
endmodule

数据流描述建模:

module Nixielight(input[3:0] B,output [7:0]SEG,output [3:0]bC);
 assign SEG[0]=B[3]|((~B[2])&(~B[0]))|B[1]|(B[2]&B[0]);
 assign SEG[1]=(~B[2])|(B[1]&B[0])|((~B[1]&(~B[0])));
 assign SEG[2]=B[2]|(~B[1])|B[0];
 assign SEG[3]=B[3]|((~B[2])&(~B[0]))|((~B[2])&B[1])|(B[1]&(~B[0]))|(B[2]&(~B[1])&B[0]);
 assign SEG[4]=((~B[2])&(~B[0]))|(B[1]&(~B[0]));
 assign SEG[5]=B[3]|((~B[1])&(~B[0]))|(B[2]&(~B[1]))|(B[2]&(~B[0]));
 assign SEG[6]=B[3]|(B[1]&(~B[0]))|((~B[2])&B[1])|(B[2]&(~B[1])); 
 assign SEG[7]=0;
 assign bC=15;
endmodule

0x02 仿真代码文件

行为描述建模:

module sim1();
reg [3:0] sw;
wire [6:0] a_to_g;
wire [3:0] an;
wire dp;
hex7seg_top uu1(sw,a_to_g,an,dp);
initial sw=4'b0000;
always #100 sw=sw+1;
endmodule

数据流描述建模:

module sim_Nixielight();
 reg [3:0]B;
 wire [7:0]SEG;
 wire [3:0]bC;
 Nixielight test(.B(B),.SEG(SEG),.bC(bC));
 always begin
 B[3]=0;B[2]=0;B[1]=0;B[0]=0;#100;
 B[3]=0;B[2]=0;B[1]=0;B[0]=1;#100;
 B[3]=0;B[2]=0;B[1]=1;B[0]=0;#100;
 B[3]=0;B[2]=0;B[1]=1;B[0]=1;#100;
 B[3]=0;B[2]=1;B[1]=0;B[0]=0;#100;
 B[3]=0;B[2]=1;B[1]=0;B[0]=1;#100;
 B[3]=0;B[2]=1;B[1]=1;B[0]=0;#100;
 B[3]=0;B[2]=1;B[1]=1;B[0]=1;#100; 
 B[3]=1;B[2]=0;B[1]=0;B[0]=0;#100;
 B[3]=1;B[2]=0;B[1]=0;B[0]=1;#100; 
 end
endmodule

0x03 观察记录仿真波形

 分析仿真波形,记录输出结果,对所设计的电路功能是否满足设计要求给出结论。

 0x04 添加引脚约束

按照 EG01 硬件手册提供的资料,选择输入和输出设备,设置引脚约束。

设置完毕,保存管脚约束文件。

本次实验利用 SW7-SW4 作为数据输入,DK5-8 及对应的八个段码作为显示电路输出.

引脚约束关系如下:

引脚约束设置完成后,综合,点击“PROGRAM AND DEBUG”选项中的“Generate Bitstream”在经过综合、实现两个阶段后,可生成 bit 文件。

下载 bit 文件到 FPGA

正确得到 bit 文件后,将 EG01 板与电脑用板卡包里提供 USB 数据线进行连接。

连接完毕,打开 EG01 电源开关,可看到电源指示灯点亮。

随后,点击“Open Hardware Manager”选择 “Auto Connect”,连接 EG01

连接成功后,点击“Program Device”bit 文件下载至 EG01 FPGA

下载完毕,利用设计时选择的开关输入不同的值,对电路进行测试

 

 Ⅳ 知识扩展

0x00 扩展实验

结合前期实验内容,实现能完成下列功能的电路,

要求在Vivado中完成设计与仿真,并下载至EGO1实验板进行验证与分析。

用1个数码管显示开关的编号,电路功能如下:

开关1按下,在第一个数码管显示1;开关2按下,在第二个数码管显示2;开关3按下,在第三个数码管显示3;开关4按下,在第四个数码管显示4。参考真值表如下:

输入

输出

SW1

SW2

SW3

SW4

a

b

c

d

e

f

g

h

1

0

0

0

0

1

1

0

0

0

0

0

0

1

0

0

1

1

0

1

1

0

1

0

0

0

1

0

1

1

1

1

0

0

1

0

0

0

0

1

0

1

1

0

0

1

1

0

x

x

x

x

d

d

d

d

d

d

d

d

根据真值表,写出设计代码如下:

module SY3_KZ(input [3:0]b,output [7:0]seg,output [3:0]bc);
assign seg[0]=(~b[0])&(~b[3]);
assign seg[1]=1;
assign seg[2]=(~b[1])&(~b[3])|((~b[0])&(~b[1])&(~b[2]));
assign seg[3]=(~b[0])&(~b[3]);
assign seg[4]=b[1];
assign seg[5]=b[3];
assign seg[6]=((~b[0])&(~b[3]))|((~b[0])&(~b[1])&(~b[2]));
assign seg[7]=0;
assign bc=b;
endmodule

仿真代码:

module sim_SY3_KZ();
 reg [3:0]b;
 wire [7:0]seg;
 SY3_KZ test(.b(b),.seg(seg));
 always begin
 b[0]=1;b[1]=0;b[2]=0;b[3]=0;#100;
 b[0]=0;b[1]=1;b[2]=0;b[3]=0;#100;
 b[0]=0;b[1]=0;b[2]=1;b[3]=0;#100;
 b[0]=0;b[1]=0;b[2]=0;b[3]=1;#100;
 end
endmodule

引脚约束:

 波形图:

引脚约束设置完成后,综合,点击“PROGRAM AND DEBUG”选项中的“Generate Bitstream”在经过综合、实现两个阶段后,可生成 bit 文件。

下载 bit 文件到 FPGA

正确得到 bit 文件后,将 EG01 实验板与电脑用板卡包里提供 USB 数据线进行连接。

连接完毕,打开 EG01 电源开关,可看到电源指示灯点亮。

随后,点击“Open Hardware Manager”选择 “Auto Connect”,连接 EG01。连接成功后,点击“Program Device”bit 文件下载至 EG01 FPGA

下载完毕,利用设计时选择的开关输入不同的值,对电路进行测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/273629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue-VueRouter

前言 Vue Router 是 Vue.js (opens new window)官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有: 嵌套的路由/视图表模块化的、基于组件的路由配置路由参数、查询、通配符基于 Vue.js 过渡系统的视图过渡效果…

SPSS聚类分析(含k-均值聚类,系统聚类和二阶聚类)

本篇博客主要是根据1、聚类的基本知识点_哔哩哔哩_bilibili系列视频进行的学习记录一、SPSS聚类分析的基本知识点1、什么是聚类分析?聚类分析(Cluster analysis)又叫做群集分析,通过一些属性将对象或变量分成不同的组别,在同一类下的对象或变量在这些属性上具有一些…

最全面的SpringBoot教程(四)——数据库连接

前言 本文为 最全面的SpringBoot教程(四)——数据库连接 相关知识,下边将对JDBC连接配置,与使用Druid数据源,从添加依赖到修改配置项再到测试进行详尽介绍~ 📌博主主页:小新要变强 的主页 &…

C语言深度解剖-关键字(5)

目录 if else 组合 if else 的基本用法 注释 深入理解bool float(double)与浮点数的比较 写在最后&#xff1a; if else 组合 if else 的基本用法 #include <stdio.h>int main() {int flag 1;if (flag 1){printf("flag %d\n", flag);}else if (flag…

crmeb pro多门店版二次开发

重启一下swool 新创建的数据库表 ALTER TABLE eb_store_cart ADD price DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT 单独改价 AFTER status;ALTER TABLE eb_store_order ADD car_no VARCHAR(255) NOT NULL DEFAULT COMMENT 车牌号 AFTER erp_order_id, ADD frame_no VARCHA…

2023软考系统集成项目管理工程师易混淆知识点~(7)

将2023上半年软考《系统集成项目管理工程师》易混淆知识点&#xff0c;分享给大家&#xff0c;快来跟着一起打卡学习吧&#xff01;概念辨析 1:项目、运营概念:(1)项目:项目是为达到特定目的&#xff0c;使用一定资源&#xff0c;在确定的期间内&#xff0c;为特定发起人而提供…

Linux perf的使用(一)

文章目录前言一、perf简介二、perf子命令简介三、perf工作模式3.1 计数3.2 采样参考资料前言 系统级性能优化通常包括两个阶段&#xff1a;性能剖析&#xff08;performance profiling&#xff09;和代码优化。 &#xff08;1&#xff09;性能剖析的目标是寻找性能瓶颈&#x…

python(13)--字典(Dict)

一、字典的基本操作 1.定义字典 字典也是一个列表型的数据结构&#xff0c;字典的数据是用“{ }”装的&#xff08;列表&#xff1a;[ ]&#xff0c;元组&#xff1a;( )&#xff09;&#xff0c;字典的元素是一一对应的关系“key-value”。 格式&#xff1a; Dictname{ key1…

vue中父子组件的传值

1. 父组件给子组件传值 主要两个步骤&#xff1a; 1. 在父组件调用子组件的时候绑定数据 2. 在子组件里面通过props接收父组件传过来的数据 2. 子组件给父组件传值 主要三个步骤&#xff1a; 1.在子组件中创建一个按钮&#xff0c;给按钮绑定一个点击事件 2.在响应该点击事件…

NSSRound#7

[NSSRound#7 Team]ec_RCE 源码: <?PHPif(!isset($_POST["action"]) && !isset($_POST["data"]))show_source(__FILE__);putenv(LANGzh_TW.utf8); $action $_POST["action"];$data "".$_POST["data"]."…

Java综合实验1题目: 猜心术---猜姓氏游戏

一、 实验内容及要求 假设游戏者共有十人&#xff0c;且有10个不同的姓&#xff1a;张、王、李、赵、刘、于、许、金、钱、孙&#xff0c;魔术师将十个姓写在四张纸牌上&#xff0c;游戏者只需指出那几张纸上有自己的姓&#xff0c;魔术师就能准确的说出游戏者的姓&#xff0c…

ChatGPT 为我制作了一张地图

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 今天在刷视频的时候看到了…

Java 并发在项目中的使用场景

1、并发编程的三个核心问题&#xff1a;&#xff08;1&#xff09;分工&#xff1a;所谓分工指的是如何高效地拆解任务并分配给线程&#xff08;2&#xff09;同步&#xff1a;而同步指的是线程之间如何协作&#xff08;3&#xff09;互斥&#xff1a;互斥则是保证同一时刻只允…

本科大数据专业能找到大数据开发的工作么

本科大数据专业能不能找到大数据开发的工作取决于你在校期间大数据学科学习的怎么样~ 目前大二就还有时间去学习&#xff0c;趁着空余时间找个完整的学习路线去学习&#xff0c;争取能够在校招的时候就找到心仪的工作技术过关的话是完全没有问题的&#xff0c;而且加上你还有兴…

PythonWeb开发基础(三)类Flask框架请求封装

课程地址&#xff1a;Python 工程师进阶技术图谱 文章目录类Flask框架请求封装HTTP请求解析的python实现1、解析查询字符串2、多值问题使用webob库解析请求Bug记录bug&#xff1a;AttributeError: module cgi has no attribute parse_qs类Flask框架请求封装 Web服务器 本质是…

【C++提高编程】list 容器详解(附测试用例与结果图)

目录1. list容器1.1 list基本概念1.2 list构造函数&#xff08;初始化&#xff09;1.3 list 赋值和交换1.4 list 大小操作1.5 list 插入和删除1.6 list 数据存取1.7 list 反转&#xff08;reverse&#xff09;、排序&#xff08;sort&#xff09;和去重&#xff08;unique&…

电脑技巧:电脑状态监控神器TrafficMonitor介绍

有的时候我们为了解决某些电脑问题&#xff0c;需要监控电脑的实时网速、CPU、内存等的占用情况。一般情况下我们可以打开电脑任务管理器&#xff0c;就可以实时监控硬件状态&#xff0c;但如果查看频率较高的话&#xff0c;需要每次进入任务管理器就显得比较麻烦。今天小编分享…

【漏洞修复】 CVE Linux 系统应用漏洞修复笔记

这里写自定义目录标题说明SSL/TLS协议信息泄露漏洞(CVE-2016-2183)漏洞信息解决办法验证方法修复步骤说明查询当前使用的openssl版本号下载并安装新版本的openssl替换nginx中使用的openssl到最新版说明 此文章主要记录工作中遇到的漏洞以及修复过程。 SSL/TLS协议信息泄露漏洞…

【LeetCode】员工的重要性 | 图像渲染 | 岛屿问题

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《阿亮爱刷题》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;员工的重…

力扣SQL刷题4

目录1158. 市场分析 I1280. 学生们参加各科测试的次数1174. 即时食物配送 II585. 2016年的投资1158. 市场分析 I 题型&#xff1a;表1和表2连接时&#xff0c;如何把没有对应数据输出来。即表1中所有id列对应的表2数据输出&#xff0c;没用的输出0 解答1&#xff1a;left join…