【FPGA】Verilog:MSI/LSI 组合电路之解码器 | 多路分解器

news2024/10/7 0:27:09

写在前面:本章将理解编码器与解码器、多路复用器与多路分解器的概念,通过使用 Verilog 实现多样的解码器与多路分解器,通过 FPGA 并使用 Verilog 实现。


Ⅰ. 前置知识

0x00 解码器与编码器(Decoder / Encoder)

解码器 (Decoder):执行转换和处理过程以将 Encoding 数据恢复到之前的电路。

编码器 (Encoder):将特定数据转换和处理为其他形式或格式的电路,以确保安全或缩小数据的大小。

编码器和解码器用于将任意两种符号体系相互转换。

0x01 多路复用器 MUX 与 多路分解器 DeMUX

多路复用器 MUX (Multiplexer),能接收多个输入信号,按每个输入信号可恢复方式合成单个输出信号。复用器是一种综合系统,通常包含一定数目的数据输入,有一个单独的输出。

多路分解器 DeMUX (DeMultiplexer),是从一个输入接收资料,根据多条输出线中的输入,连接到预先选定的一条输出线的电路。

通常与带有 enable line 的解码器相同。

由于各自的功能特性,MUX 也被称为 Data Selctor(数据选择器),DeMUX 也被称为 Data Distributor(数据分配器)。

Ⅱ.  练习(Assignment)

0x00 2 to 4 Decoder

使用 AND 对电路进行 Verilog 编码,使用 NAND 结构对电路进行 Verilog 编码,通过 Verilog 的模拟结果完成真值表(2种),并比较两种形式的解码器。

💬 Design source:

`timescale 1ns / 1ps

module two_to_four_decoder(
    input A, B,
    output D1, D2, D3, D4
    );
    
    assign D1 = ~A&~B;
    assign D2 = ~A&B;
    assign D3 = A&~B;
    assign D4 = A&B;

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module two_to_four_decode_tb;
reg AA, BB;
wire D1, D2, D3, D4;

two_to_four_decoder u_two_to_four_decoder(
    .A(AA),
    .B(BB),
    .D1(D2),
    .D2(D2),
    .D3(D3),
    .D4(D4)
    );
    
initial AA = 1'b0;
initial BB = 1'b0;

always AA = #100 ~AA;
always BB = #200 ~BB;

initial begin
   #1000
   $finish;
end

endmodule

🚩 运行结果如下:

0x01 4 to 2 Encoder

使用 OR 对电路进行 Verilog 编码,通过 Verilog 的仿真结果完成真值表。

💬 Design source:

`timescale 1ns / 1ps

module four_to_two_encoder(
    input a, b, c, d,
    output e0, e1
    );
    assign e0 = a|b;
    assign e1 = a|c;

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module four_to_two_encoder_tb;
reg aa, bb, cc, dd;
wire e0, e1;

four_to_two_encoder u_four_to_two_encoder(
   .a(aa),
   .b(bb),
   .c(cc),
   .d(dd),
   .e0(e0),
   .e1(e1)
    );

initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;
    
always aa = #100 ~aa;
always bb = #200 ~bb;
always cc = #400 ~cc;
always dd = #800 ~dd;
    
initial begin
   #1000
   $finish;
end

endmodule

🚩 运行结果如下:

0x02 BCD to Decimal Decoder

通过 Verilog 编码实现(A)的结构,通过 Verilog 的仿真结果完成真值表,并确认是否与理论中的Boolean 函数一致。

💬 Design source:

`timescale 1ns / 1ps

module bcd_decoder(
    input a3, a2, a1, a0,
   output o1, o2, o3, o4, o5, o6, o7, o8, o9
   );
   assign o1 = ~a3&~a2&~a1&a0;
   assign o2 = ~a3&~a2&a1&~a0;
   assign o3 = ~a3&~a2&a1&a0;
   assign o4 = ~a3&a2&~a1&~a0;
   assign o5 = ~a3&a2&~a1&a0;
   assign o6 = ~a3&a2&a1&~a0;
   assign o7 = ~a3&a2&a1&a0;
   assign o8 = a3&~a2&~a1&~a0;
   assign o9 = a3&~a2&~a1&a0;

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module bcd_decoder_tb;
reg aa3, aa2, aa1, aa0;
wire o1, o2, o3, o4, o5, o6, o7, o8, o9;

bcd_decoder u_bcd_decoder(
    .a3(aa3),
    .a2(aa2),
    .a1(aa1),
    .a0(aa0),
    .o1(o1),
    .o2(o2),
    .o3(o3),
    .o4(o4),
    .o5(o5),
    .o6(o6),
    .o7(o7),
    .o8(o8),
    .o9(o9)
    );

initial aa3 = 1'b0;
initial aa2 = 1'b0;
initial aa1 = 1'b0;
initial aa0 = 1'b0;

always aa3 = #100 ~aa3;
always aa2 = #200 ~aa2;
always aa1 = #400 ~aa1;
always aa0 = #800 ~aa0;

initial begin
   #1000
   $finish;
end

endmodule

🚩 运行结果如下:

0x03 4 to 1 line MUX

以(A)的结构对电路进行 Verilog 编码,通过 Verilog 的仿真结果完成真值表。并确认是否与理论中的 Boolean 函数一致。

💬 Design source:

`timescale 1ns / 1ps

module four_to_one_mux(
    input a, b, c, d, A, B,
    output q
    );
    assign q = (a&~B&~A)|(b&B&~A)|(c&~B&A)|(d&B&A);

endmodule

 💬 Testbench:

`timescale 1ns / 1ps

module four_to_one_mux_tb;
reg aa, bb, cc, dd, AA, BB;
wire q;

four_to_one_mux u_four_to_one_mux(
   .a(aa),
   .b(bb),
   .c(cc),
   .d(dd),
   .A(AA),
   .B(BB),
   .q(q)
   );
   
initial aa = 1'b0;
initial bb = 1'b0;
initial cc = 1'b0;
initial dd = 1'b0;
initial AA = 1'b0;
initial BB = 1'b0;
   
always aa = #50 ~aa;
always bb = #100 ~bb;
always cc = #200 ~cc;
always dd = #400 ~dd;
always AA = #800 ~AA;
always BB = #1600 ~BB;

initial begin
   #2000
   $finish;
end

endmodule

🚩 运行结果如下:

0x04 1 to 4 line deMUX

以(A)的结构对电路进行 Verilog 编码,通过 Verilog 的仿真结果完成真值表,确认是否与理论中的 Boolean 函数一致。

💬 Design source:

`timescale 1ns / 1ps

module one_to_four_mux(
    input A, B, f,
    output a, b, c, d
    );
    assign a = f&(~A&~B);
    assign b = f&(~A&B);
    assign c = f&(A&~B);
    assign d = f&(A&B);

endmodule

💬 Testbench:

`timescale 1ns / 1ps

module one_to_four_mux_tb;
reg AA, BB, ff;
wire a, b, c, d;

one_to_four_mux u_one_to_four_mux(
   .A(AA),
   .B(BB),
   .f(ff),
   .a(a),
   .b(b),
   .c(c),
   .d(d)
    );
    
initial AA = 1'b0;
initial BB = 1'b0;
initial ff = 1'b0;
    
always AA = #100 ~AA;
always BB = #200 ~BB;
always ff = #400 ~ff;
    
initial begin
   #1000
   $finish;
end

endmodule

🚩 运行结果如下:

📌 [ 笔者 ]   Foxny,Akam
📃 [ 更新 ]   2023.3.5
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Introduction to Logic and Computer Design, Alan Marcovitz, McGrawHill, 2008

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

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

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

相关文章

素数分类的猜想==素数,划分分类,就分为真素质数与非真素质数

素数分类的猜想 根据哥德巴赫公理(我暂不称之为猜想了),普通素数加一,成为合数,必可分解成两个素数,所以,两个素数Pi,Pj相加减一,是有可能为素数Pn的,这样的素数Pi,Pj&am…

扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目,diffusion model】

扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目,diffusion model】一、简介二、扩散过程:输入是x_0和时刻num_steps,输出是x_t三、逆扩散过程:输入x_t,不断采样最终输出x_0四、具体参考算法流程图五、模型mo…

Android Framework 启动流程必知必会

课前预习在了解启动流程之前先了解一下下面两个概念:1、子进程与父进程的区别1.除了文件锁以外,其他的锁都会被继承2.各自的进程ID和父进程ID不同3.子进程的未决告警被清除4.子进程的未决信号集设置为空集2、什么是写时拷贝(copy-on-write)Linux 的 fork() 使用是通过「写时拷贝…

【Linux】Linux项目自动化构建工具make makefile

文章目录1. 背景2.实例3.原理4.项目清理5. 文件属性中的三个时间6. Linux下第一个小程序——进度条6.1 前置知识1:缓冲区6.2前置知识2:回车换行6.3进度条的实现7 Linux下git的”三板斧“1. 背景 一个工程中的源文件不计其数,其按类型、功能、…

【C++】位图+哈希切割+布隆过滤器

文章目录一、位图1.1 位图概念1.2 位图实现1.2.1 把x对应比特位0置11.2.2 把x对应比特位1置01.2.1 查看x对应比特位1.3 位图源码1.4 位图的应用二、哈希切割(处理海量数据)三、布隆过滤器3.1 布隆过滤器的概念3.2 布隆过滤器的应用场景3.3 布隆过滤器的实…

zookeeper安装使用

一、因使用kafka 需使用zookeeper,此处使用单节点 ZooKeeper有两种安装模式,最简单的方式是单机模式(standalone mode),它只需要在一台机器上面运行,另一种方式是集群模式,集群模式需要多台服务器部署。 Z…

Java中垃圾回收(GC)基本概念

如果想真正理解GC,则需要循序渐进,由浅入深的了解GC,从本篇文章开始我们详细介绍Java中的GC,本篇文章我们通过4个主题先介绍垃圾回收的基本概念一、Java中什么是GC,为什么需要GC二、早期垃圾回收三、Java垃圾回收机制四…

DockQuery x 达梦 国产数据库生态“加速跑”

「数字化」是当今社会最先进和最具穿透力的生产力,近十年里开展着气势磅礴的发展。而信创产业则是保障中国经济数字化转型平稳健康发展的基础。 随着信创产业规模不断扩大,国产数据库市场释放出前所未有的活力。达梦作为国产数据库领头羊,坚…

Redis进阶之事物持久化

Reis进阶Redis事物Redis管道Redis持久化RDB持久化RDB持久化优缺点分析RBD文件修复&禁用RDB快照AOF持久化AOF优缺点&AOF重写机制AOF&RDB混合写机制Redis事物 什么是事物?相信学过数据库的铁子们都知道事物是什么。在MySQL当中事物是指和数据库连接的一次…

在面试时候,如何简明扼要简述产品流程

下面这个图是我今天总结的,我把它上传到这里来,然后逐一按点来解释,为了迎合面试,所以每个点尽量不超过140字。(觉得OK的,请点赞哦!)图片过大,请点击放大后按“F”键查看原图。或下载后查看&…

IT项目经理的自我修养手册

在不断进步的时代,任何岗位职责都是一个责任、权力与义务的综合体,有多大的权力就应该承担多大的责任,有多大的权力和责任应该尽多大的义务,任何割裂开来的做法都会发生问题。那么作为IT项目经理的岗位职责,我大概列举…

vue实现输入框中输完后光标自动跳到下一个输入框中

前言 最近接到这么一个需求,做一个安全码的输入框,限制为6位数,但是每一个写入的值都是一个输入框,共计6个输入框,当前输入框写入值后,光标自动跳到下一个输入框中,删除当前输入框写入的值后再自…

秒懂算法 | 基于主成分分析法、随机森林算法和SVM算法的人脸识别问题

本文的任务与手写数字识别非常相似,都是基于图片的多分类任务,也都是有监督的。 01、数据集介绍与分析 ORL人脸数据集共包含40个不同人的400张图像,是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。 此数据集下包含40个目录,每个目录下有10张图像,每个…

Mysql下载安装详细笔记

MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。 一、下载mysql安装包 1. 登录官方网站https://www.mysql.com/ 2. 进入Down…

[Latex]参考文献的格式:数字,作者+年份

参考资料: 《使用 natbib 进行参考文献管理》 《bibliographystyle类型》 《\usepackage{natbib}在latex模板写作》 《LaTeX中的参考文献——作者年代引用》 文章目录[TOC]一、共同的参考文献和正文二、参考文献的引入方法2.1 声明引入的使用包(usepackage)2.2 正文的引用\…

C语言-基础了解-09-C循环

C循环 一、C循环 循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图: 二、循环类型 2.1 while 循环 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。 语法 while(condition) { …

【虹科案例】虹科任意波形发生器在量子计算中的应用

虹科AWG在量子计算中的应用精度在研究中始终很重要,很少有研究领域需要比量子研究更高的精度。奥地利因斯布鲁克大学的量子光学和量子信息研究所需要一个任意波形发生器(AWG)来为他们的研究生成各种各样的信号。01无线电频率第一个应用是在射…

C++——类型转换

目录 C语言中的类型转换 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast 延伸问题 RTTI(了解) C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或…

JAVA开发(Spring Gateway 的原理和使用)

在springCloud的架构中,业务服务都是以微服务来划分的,每个服务可能都有自己的地址和端口。如果前端或者说是客户端直接去调用不同的微服务的话,就要配置不同的地址。其实这是一个解耦和去中心化出现的弊端。所以springCloud体系中&#xff0…

aws apigateway 使用restapi集成http

参考资料 https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/services-apigateway-tutorial.html restapi代理集成http 在 HTTP 代理集成中,apigateway会将客户端提交的方法请求传递至后端。传递的请求数据包括请求标头、查询字符串参数、URL 路径变量和paylo…