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

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

写在前面:本章将理解编码器与解码器、多路复用器与多路分解器的概念,通过使用 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 / 1psmodule 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 / 1psmodule 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;
endendmodule

🚩 运行结果如下:

0x01 4 to 2 Encoder

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

💬 Design source:

`timescale 1ns / 1psmodule four_to_two_encoder(input a, b, c, d,output e0, e1);assign e0 = a|b;assign e1 = a|c;endmodule

💬 Testbench:

`timescale 1ns / 1psmodule 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;
endendmodule

🚩 运行结果如下:

0x02 BCD to Decimal Decoder

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

💬 Design source:

`timescale 1ns / 1psmodule 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 / 1psmodule 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;
endendmodule

🚩 运行结果如下:

0x03 4 to 1 line MUX

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

💬 Design source:

`timescale 1ns / 1psmodule 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 / 1psmodule 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;
endendmodule

🚩 运行结果如下:

0x04 1 to 4 line deMUX

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

💬 Design source:

`timescale 1ns / 1psmodule 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 / 1psmodule 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;
endendmodule

🚩 运行结果如下:

📌 [ 笔者 ]   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.lryc.cn/news/31248.html

相关文章:

  • 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架
  • 一、策略模式的使用
  • Verilog使用always块实现时序逻辑
  • 面向对象设计模式:行为型模式之迭代器模式
  • 如何快速在企业网盘中找到想要的文件
  • 香橙派5使用NPU加速yolov5的实时视频推理(二)
  • 算法练习-二分查找(一)
  • 通用业务平台设计(五):预警平台建设
  • Windows openssl-1.1.1d vs2017编译
  • 【深蓝学院】手写VIO第2章--IMU传感器--笔记
  • 网络基础(二)之HTTP与HTTPS
  • Python每日一练(20230306)
  • C/C++每日一练(20230305)
  • SAS字典的应用
  • Mysql中的函数和触发器
  • 分布式架构之(Zookeeper原理)
  • Java框架学习 | MyBatis
  • Cookie+Session详解
  • CAPL脚本要注意区分elcount和strlen求数组长度的区别,不然要吃大亏
  • CSS常用选择器
  • Registry与DGC的攻击利用
  • 赛道持续降温!又一家自动驾驶公司裁员,市值曾超50亿美元
  • 路径规划 | 图解动态A*(D*)算法(附ROS C++/Python/Matlab仿真)
  • GraphCut、最大流最小割定理
  • Word文档的密码忘记了怎么办?
  • Java分布式事务(二)
  • 游戏项目中的程序化生成(PCG):算法之外的问题与问题
  • 【C++】位图+哈希切割+布隆过滤器
  • python实现网络游戏NPC任务脚本引擎(带限时任务功能)
  • C语言的原子操作(待完善)