FPGA 第7讲 简单组合逻辑译码器
时间:2024.11.15
一、学习内容
1.译码器
译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码,实现译码操作的电路称为译码器。或者说,译码器是可以将输入二进制代码的状态翻译成输出信号,以表示其原来含义的电路。
译码器(decoder)是一类多输入多输出组合逻辑电路器件,其可以分为:变量译码和显示译码两类。
1.1变量译码器
变量译码器一般是一种较少输入变为较多输出的器件,常见的有 n 线-2^n线译码和 8421BCD 码译码两类。
1.2显示译码器
显示译码器用来将二进制数转换成对应的七段码,一般其可分为驱动 LED 和驱动 LCD 两类。
2.实验目标
设计并仿真验证 3-8 译码器。
注:3-8 译码器的上板验证需要用到 8 个 led 灯或者数码管,因为板卡 led 灯数目不够且数码管部分还未作讲解,3-8 译码器只进行仿真验证,不再上板测试。
二、实验
1.准备工作
建立文件夹存放工程,进行文件体系的构建,建立visio文件
2.绘制波形和框图
在visio软件里绘制波形和框图
2.1模块框图
根据功能分析,工程只需实现一个 3-8 译码器的功能,所以设计成一个模块即可。
模块命名 decoder3_8,模块的输入为 3 个 1bit 信号,输出为 1 个 8bit 信号,实现通过输入3 个信号组成的二进制的 8 种情况来控制对应输出 8bit 的 8 种不同状态。

TIPS:
输出信号定义为8位宽,在框图里要进行加粗处理,用以区别

2.2波形图绘制
输入为 3 个 1bit 信号,其任意二进制组合有 8 种情况,每种组合与 out 输出 8bit 的 8 种状态一一对应,实现由 3 种输入控制对应的 8 种输出的译码效果。


TIPS:
用X表示初始波形未知
3.代码编写
方法一:always 中 if-else 实现方法
module decorder
(//编写输入输出列表input wire in_1,input wire in_2,input wire in_3,output reg [7:0] out);
//进行输入输出的赋值
always@(*)
//if-else条件分支语句
if({in_1,in_2,in_3}==3'b000) //{in_1,in_2,in_3}对三路信号进行拼接out = 8'b0000_0001;else if({in_1,in_2,in_3}==3'b001) out = 8'b0000_0010;else if({in_1,in_2,in_3}==3'b010) out = 8'b0000_0100;else if({in_1,in_2,in_3}==3'b011) out = 8'b0000_1000;else if({in_1,in_2,in_3}==3'b100) out = 8'b0001_0000;else if({in_1,in_2,in_3}==3'b101) out = 8'b0010_0000;else if({in_1,in_2,in_3}==3'b110) out = 8'b0100_0000;else if({in_1,in_2,in_3}==3'b111) out = 8'b1000_0000;
else
out = 8'b0000_0001;endmodule
TIPS:
最后一个 else 对应的 if 中的条件只有一种情况,还可能产生以上另外的 7 种情况,如果不加这个else 综合器会把不符合该 if 中条件的上面另外 7 种情况都考虑进去,会产生大量的冗余逻辑并产生 latch(锁存器),所以在组合逻辑中最后一个 if后一定要加上 else,并任意指定一种确定的输出情况


方法二:always 中 case 实现方法
module decorder
(//编写输入输出列表input wire in_1,input wire in_2,input wire in_3,output reg [7:0] out);
//进行输入输出的赋值
/* always@(*)
//if-else条件分支语句
if({in_1,in_2,in_3}==3'b000) //{in_1,in_2,in_3}对三路信号进行拼接out = 8'b0000_0001;else if({in_1,in_2,in_3}==3'b001) out = 8'b0000_0010;else if({in_1,in_2,in_3}==3'b010) out = 8'b0000_0100;else if({in_1,in_2,in_3}==3'b011) out = 8'b0000_1000;else if({in_1,in_2,in_3}==3'b100) out = 8'b0001_0000;else if({in_1,in_2,in_3}==3'b101) out = 8'b0010_0000;else if({in_1,in_2,in_3}==3'b110) out = 8'b0100_0000;else if({in_1,in_2,in_3}==3'b111) out = 8'b1000_0000;
else
out = 8'b0000_0001; */
always@(*)case({in_1,in_2,in_3})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;default:out = 8'b1000_0000; //避免latchendcaseendmodule

总结:
经过验证对比发现两种方法虽然最后实现的功能是一样的,而所得到的 RTL 视图差别较大,但最后的逻辑资源使用却是相同的(时序逻辑中不一定相同),说明综合器进行了适当的优化。
if-else 的这种写法是存在优先级的,即第一个 if 中的条件的优先级最高,后面的 if 中的条件的优先级依次递减,好在该 if 中的条件只有一个,也只会产生一种情况,并不会产生优先级的冲突,所以这里优先级的高低关系并不会对最后的功能产生任何影响。而 case 在任何时候都不存在优先级的问题,而是通过判断case 中的条件来选择对应的输出。
通过 RTL 视图我们也能够发现 if 括号里面的条件会生成名为“EQUAL”的比较器单元,而 case 则会生成名为“DECODER”的译码器单元,这些单元并不是 FPGA 硬件底层中最小单元,而只是一种用于 RTL 视图中易于表达的抽象后的图形,使之更易于我们观察、理解其代码所实现功能的硬件结构的大致样子,也符合了“HDL(硬件描述语言)”所表述的含义。
4.仿真验证
`timescale 1ns/1ns
module tb_decorder();
reg in_1;
reg in_2;
reg in_3;
wire [7:0] out;
//输入信号的初始化
initial
beginin_1 <= 1'b0;in_2 <= 1'b0;in_3 <= 1'b0;end
//使用always进行随机数的赋值
always #10 in_1 <={$random}%2;
always #10 in_2 <={$random}%2;
always #10 in_2 <={$random}%2;initial
begin$timeformat(-9,0,"ns",6);//时间格式的设置$monitor("@time %t:in_1=%b in_2=%b in_3=%b out=%b",$time,in_1,in_2,in_3,out); //监测函数
end
//实例化
decorder decorder_inst
(
.in_1(in_1),
.in_2(in_2),
.in_3(in_3),
.out (out)
);
endmodule

三、实验结果
打印信息

波形结果

四、知识点和小技巧
输出等级
速度等级表示的是FPGA芯片在正常工作时速度的快慢,在ultra系列芯片中,数字越小,速度越快;对于赛琳斯公司的器件,数字越大,速度越快。
相关文章:
FPGA 第7讲 简单组合逻辑译码器
时间:2024.11.15 一、学习内容 1.译码器 译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码,实现译码操…...
opencv kdtree pcl kdtree 效率对比
由于项目中以一个环节需要使用kdtree ,对性能要求比较严苛,所以看看那个kdtree效率高一些。对比了opencv和pcl。 #include <array> #include <deque> #include <fstream> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp…...
1+X应急响应(网络)系统备份:
系统备份: 系统备份概述: 备份种类: 灾难恢复等级划分: 执行一次备份: 创建备份计划: 恢复备份:...
python os.path.dirname(path) 详解
dirname 是一个用于处理文件路径的 Python 函数,通常用于获取给定路径的目录部分。它是 os.path 模块中的一部分。下面是对 dirname 函数的详细解释和使用示例。 1、导入模块 首先,你需要导入 os 模块,因为 dirname 是 os.path 模块的一部分…...
深度解析 Feign
一、引言 在当今微服务架构盛行的时代,众多微服务相互协作构成了复杂的分布式系统。然而,各个微服务之间的调用往往涉及到诸多繁琐的细节,比如网络请求的构建、参数的处理、响应的解析等。为了让开发人员能够更加专注于业务逻辑的实现&#x…...
AI工业大模型报告:体系架构、关键技术与典型应用
研究意义 随着新一代人工智能的发展, 大模型(如 GPT-4o 等)凭借大规模训练数据、网络参数和算 力涌现出强大的生成能力、泛化能力和自然交互能力, 展现出改变工业世界的巨大潜力. 尽管大模型 已在自然语言等多个领域取得突破性进展, 但其在工业应用中的…...
深入理解接口测试:实用指南与最佳实践5.0(五)
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
常用List工具类(取交集、并集等等)
支持操作: 根据指定字段,获取两个对象集合的交集、补集、并集等将对象中的多个字段值,抽取到一个List中 import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function…...
4 C++ 复合类型:引用和指针
复合类型是指基于其它类型定义的类型。C 有几种复合类型,包括引用、指针。 1 引用 引用(reference)为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量…...
ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD
网上搜关于CJ20N的屏幕增强,基本都是关于项目定义(CI_PROJ)、项目WBS(CI_PRPS)、项目网络活动工序(CI_AFVU)的字段与屏幕增强,几乎没有关于项目物料(CI_RSADD)的字段屏幕增强,我在这里做一个分享。 主要逻辑:实现badi增强,并自建一个函数组后创建屏幕,在badi里面调用…...
探索IDE的无限可能:使用技巧与插件推荐
在软件开发的世界里,集成开发环境(IDE)是开发者的得力助手,它不仅提供了代码编辑、编译、调试等功能,还通过各种插件扩展了其功能,使得开发工作更加高效和便捷。本文将带你探索IDE的使用技巧和一些实用的插…...
自动化生成测试用例:利用OpenAI提升电商网站测试覆盖率
导语 自动化生成测试用例是软件测试领域一个强大的应用,通过OpenAI的语言模型,测试工程师可以快速生成高质量的测试用例,尤其是在处理边界条件和极端情况时,提升测试覆盖率。本篇文章将结合一个典型的电商网站案例,介绍…...
时间序列关于可解释性值得关注的论文汇总-第2篇
前言 这是时序可解释性论文汇总的第二篇,第一篇见这里(后台回复:“论文合集”可直接获取整理的文章)。深度学习的可解释性研究一直是热门,而时间序列的可解释性同样非常重要。这是因为时序模型被大量应用到特定领域&a…...
Vulnhub:DC-4靶机渗透——土豆片的靶机渗透练习
攻击机:kali 靶机:DC-4 一,信息收集 1.主机发现 找寻同网段下存活的主机 arp-scan -l2.端口扫描 查看此主机上有哪些开放端口 nmap -sV -p- 192.168.126.136发现22,80端口,远程连接跟网站(大概&…...
【云原生系列--Longhorn的部署】
Longhorn部署手册 1.部署longhorn longhorn架构图: 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi ,Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…...
Java集合(Collection+Map)
Java集合(CollectionMap) 为什么要使用集合?泛型 <>集合框架单列集合CollectionCollection遍历方式List:有序、可重复、有索引ArrayListLinkedListVector(已经淘汰,不会再用) Set…...
微信小程序02-页面制作
微信小程序页面制作指南 目录 微信小程序页面制作 1. 个人信息展示小程序 案例分析 需求背景:许多大学生毕业后需要求职,因此制作一个展示个人信息的微信小程序对招聘人员快速了解求职者非常有帮助。页面布局:页面分为头像区域和详细信息…...
zabbix监控端界面时间与服务器时间不对应
1. 修改系统时间 # tzselect Please select a continent, ocean, "coord", or "TZ".1) Africa2) Americas3) Antarctica4) Asia5) Atlantic Ocean6) Australia7) Europe8) Indian Ocean9) Pacific Ocean 10) coord - I want to use geographical coordina…...
端对端加密是如何通过SDK防御实现的?
端对端加密(End-to-End Encryption,E2EE)是一种确保数据在传输过程中不被第三方截获和篡改的技术。随着网络安全威胁的日益增多,端对端加密在即时通讯、文件传输等领域变得越来越重要。本文将详细介绍如何通过SDK(Soft…...
Flutter:input输入框
输入框: // 是否显示关闭按钮 bool _showClear false; // 文字编辑控制器,监听搜索框的变化。 final TextEditingController _controller TextEditingController(); // 输入框发生变化事件 void _onChange(String value){if(value.length > 0){setS…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

