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系列芯片中,数字越小,速度越快;对于赛琳斯公司的器件,数字越大,速度越快。

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

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

相关文章

jmeter常用配置元件介绍总结之断言

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之断言 9.断言9.1.响应断言9.2.JSON断言9.3.大小断言9.4.JSON JMESPath Assertion9.5.断言持续时间9.6.MD5Hex断言9.7.XPath断言9.8.XPath2 Assertion 9.断言 检查测试中得到的响应数据结果是否符合预期 9.1.响应断言 功…

莱特币转型MEME币:背后隐含的加密市场现象

随着加密市场的风云变幻&#xff0c;莱特币&#xff08;LTC&#xff09;这款曾经的“老牌矿币”近日以自嘲式推文宣布“自己是一个MEME币”&#xff0c;迅速引发了市场的广泛关注和一波围绕MEME币的炒作浪潮。这一举动看似玩笑&#xff0c;却反映出当前加密市场的一种微妙转变&…

【网页设计】CSS3 进阶(动画篇)

1. CSS3 2D 转换 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 转换&#xff08;transform&#xff09;你可以简单理解为变形 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xf…

系统架构设计师:软件架构的演化和维护

软件架构一般会经历初始设计、实际使用、修改完善和退化弃用的过程&#xff0c;其中修改完善的过程实际上就是软件架构的演化和维护过程&#xff0c;演化和维护的目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等。 软件架构的演化和维护过程是一个不断…

如何在 Ubuntu 上安装 Jupyter Notebook

本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook&#xff0c;并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…

IoT [remote electricity meter]

IoT [remote electricity meter] 物联网&#xff0c;远程抄表&#xff0c;电表数据&#xff0c;举个例子

使用ivew-ui-plus 的Submit组件踩坑 injection “LoginInstance“ not found 记录 问题原因分析与解决方案

问题描述: 在下面这个页面中 注册按钮使用了view-ui-plus的Submit组件 结果控制台报错 runtime-core.esm-bundler.js:257 Uncaught TypeError: Cannot read properties of undefined (reading handleSubmit)at Proxy.handleSubmit (viewuiplus.min.esm.js:32610:26)at callW…

力扣 LeetCode 1047. 删除字符串中的所有相邻重复项(Day5:栈与队列)

解题思路&#xff1a; 方法一&#xff1a;栈 class Solution {public String removeDuplicates(String s) {Deque<Character> stack new ArrayDeque<>();for (char c : s.toCharArray()) {if (stack.isEmpty() || stack.peek() ! c) stack.push(c);else stack.p…

无人机检测车辆——多目标检测

目录 YOLOv3&#xff08;You Only Look Once version 3&#xff09;简介 YOLOv3 的主要特点 YOLOv3 的结构 1. 特征提取网络&#xff08;Backbone&#xff09; 2. 检测头&#xff08;Head&#xff09; 3. 输出层 YOLOv3 损失函数 YOLOv3 的优势 YOLOv3 的应用 YOLOv3…

集群搭建高可用

contos7.9 部署3节点 hadoop3.4 高可用集群 contos7.9 部署3节点 hadoop3.4 高可用集群环境信息Hadoop与Zookeeper的版本对应关系服务器角色分配使用端口服务器配置配置免密登录服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 hadoop 安装环境配置下载安…

网络IP地址会经常换吗?深入解析与实操指南

在互联网的生态系统中&#xff0c;IP地址&#xff08;Internet Protocol Address&#xff09;是每台连接设备的唯一标识符&#xff0c;它在网络通信中起着至关重要的作用。然而&#xff0c;不少用户观察到自己的IP地址有时会发生变化&#xff0c;这引发了诸多疑问。本文旨在详细…

AI测试的主要研究方向介绍

随着AI技术的不断进步和应用场景的日益广泛&#xff0c;如何确保人工智能系统的可靠性和安全性&#xff0c; 变得日益重要。人工智能测试作为保障AI系统质量的关键环节&#xff0c;也随着AI技术不断向前发展。本文将介绍当前AI测试的主要研究方向&#xff0c;以期为大家提供一个…

Python3中str和bytes

参考文章&#xff1a;浅析Python3中的bytes和str类型 - Chown-Jane-Y - 博客园 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode&#xff0c;由str类型表示&#xff0c;二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str…

比特币前景再度不明,剧烈波动性恐即将回归

比特币市场降温&#xff0c;波动性增加 自特朗普赢得美国总统大选以来&#xff0c;比特币市场的投机狂热有所降温&#xff0c;现货和衍生品市场的活跃度开始减弱。比特币在上周五跌破87000美元&#xff0c;较之前创下的历史高点低了约6500美元。这一变化受到美联储主席鲍威尔讲…

node对接ChatGpt的流式输出的配置

node对接ChatGpt的流式输出的配置 首先看一下效果 将数据用流的方式返回给客户端,这种技术需求在传统的管理项目中不多见,但是在媒体或者有实时消息等功能上就会用到,这个知识点对于前端还是很重要的。 即时你不写服务端,但是服务端如果给你这样的接口,你也得知道怎么去使用联…

esp32c3安装micropython环境

esp32c3竟然支持micropython环境&#xff0c;真的太让人高兴了。主要是python开发比较友好&#xff0c;开发速度要快于C和C&#xff0c; 可以用来快速创意验证。 下载 首先到官网&#xff1a;MicroPython - Python for microcontrollers 点击“download”进入下载页面&#…

Linux运维工程师推荐学习的开发语言

前言&#xff1a;会开发的运维和不会开发的运维可以说是两个世界的运维。 个人推荐python和go&#xff0c;前者可以做自动化运维&#xff0c;后者可以深挖k8s&#xff1b;最近就不先演示运维服务技术的部署和架构搭建了&#xff0c;在深挖自动化运维&#xff0c;为了让现在的工…

新手小白学习docker第八弹------实现MySQL主从复制搭建

目录 0 引言1 实操1.1 新建主服务器容器1.2 书写配置文件1.3 重启master实例1.4 进入mysql-master容器master容器实例内创建数据同步用户 1.5 新建从服务器容器1.6 书写配置文件1.7 重启slave实例1.8 查看主从同步状态1.9 进入mysql-slave容器1.9.1 配置主从复制1.9.2 查看主从…

我谈二值形态学基本运算——腐蚀、膨胀、开运算、闭运算

Gonzalez从集合角度定义膨胀和腐蚀&#xff0c;不易理解。 Through these definitions, you can interpret dilation and erosion as sliding neighborhood operations analogous to convolution (or spatial filtering). 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向…

力扣题目解析--合并两个链表

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff…