5. 简单组合逻辑

您所在的位置:网站首页 24译码器转38译码器实验报告 5. 简单组合逻辑

5. 简单组合逻辑

2024-07-06 02:04| 来源: 网络整理| 查看: 265

5.3.2. 程序设计¶ 5.3.2.1. 模块框图¶

根据功能分析,该工程只需实现一个3-8译码器的功能,所以设计成一个模块即可。模块命名decoder3_8,模块的输入为3个1bit信号,输出为1个8bit信号,实现通过输入3个信号组成的二进制的8种情况来控制对应输出8bit的8种不同状态。根据上面的分析设计出的Visio框图如图 11‑1所示。

图 11‑1 模块框图

端口列表与功能描述如表格 11‑1所示。

表格 11‑1 输入输出信号描述

信号

位宽

类型

功能描述

in1

1Bit

Input

输入信号1

in2

1Bit

Input

输入信号2

in3

1Bit

Input

输入信号3

out

8Bit

Output

译码后的输出信号

5.3.2.2. 波形图绘制¶

和之前一样,框图结构设计完毕后就可以通过波形图的方式来描述输入和输出之间具体的映射关系。经分析得,输入为3个1bit信号,其任意二进制组合有8种情况,每种组合与out输出8bit的 8种状态一一对应,实现由3种输入控制对应的8种输出的译码效果。我们根据上面的分析列出如表格 11‑2所示的真值表,然后再根据真值表的输入与输出的对应关系画波形图。其波形如图 11‑2所示,与真值表的关系一一对应。

表格 11‑2 3-8译码器真值表

输入(input)

输出(output)

in1

in2

in3

out

0

0

0

0000_0001

0

0

1

0000_0010

0

1

0

0000_0100

0

1

1

0000_1000

1

0

0

0001_0000

1

0

1

0010_0000

1

1

0

0100_0000

1

1

1

1000_0000

图 11‑2 信号波形关系图

5.3.2.3. 代码编写¶

实现3-8译码器功能的Verilog代码形式也有很多种,我们这里主要列举两种最容易理解的方法,通过这两种方法的用法对比,使学习者能对if-else和case这两种语法有一个比较深刻的理解。

always中if-else实现方法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36module decoder3_8 ( input wire in1 , //输入信号in1 input wire in2 , //输入信号in2 input wire in3 , //输入信号in3 output reg [7:0] out //输出信号out ); //out:根据3个输入信号选择输出对应的8bit out信号 always@(*) //使用"{}"位拼接符将3个1bit数据按照顺序拼成一个3bit数据 if({in1, in2, in3} == 3'b000) out = 8'b0000_0001; else if({in1, in2, in3} == 3'b001) out = 8'b0000_0010; else if({in1, in2, in3} == 3'b010) out = 8'b0000_0100; else if({in1, in2, in3} == 3'b011) out = 8'b0000_1000; else if({in1, in2, in3} == 3'b100) out = 8'b0001_0000; else if({in1, in2, in3} == 3'b101) out = 8'b0010_0000; else if({in1, in2, in3} == 3'b110) out = 8'b0100_0000; else if({in1, in2, in3} == 3'b111) out = 8'b1000_0000; else //最后一个else对应的if中的条件只有一种情况,还可能产生以上另外的7种情况 //如果不加这个else综合器会把不符合该if中条件的上面另外7种情况都考虑进去 //会产生大量的冗余逻辑并产生latch(锁存器),所以在组合逻辑中最后一个if //后一定要加上else,并任意指定一种确定的输出情况 out = 8'b0000_0001; endmodule

根据上面RTL代码综合出的RTL视图如图 11‑3所示。

图 11‑3 RTL视图(一)

(2)always中case实现方法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27module decoder3_8 ( input wire in1 , //输入信号in1 input wire in2 , //输入信号in2 input wire in3 , //输入信号in3 output reg [7:0] out //输出信号out ); //out:根据输入的3bit in信号选择输出对应的8bit out信号 always@(*) case({in1, in2, in3}) 3'b000 : out = 8'b0000_0001; //输入与输出的8种译码对应关系 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; //因为case中列举了in所有可能输入的8种情况,且每种情况都有对应确定的输出 //所以此处default可以省略,但是为了以后因不能够完全列举而产生latch //所以我们默认一定要加上default,并任意指定一种确定的输出情况 default: out = 8'b0000_0001; endcase endmodule

根据上面RTL代码综合出的RTL视图如图 11‑4所示。

图 11‑4 RTL视图(二)

有了上一章中多路选择器的例子后,我们再使用if-else和case想必大家已经不再陌生,对如何编写一个模块的基本结构也有了大概的了解。通过以上两种不同的代码编写方式,我们进行一个总结:经过验证对比发现两种方法虽然最后实现的功能是一样的,而所得到的RTL视图差别较大,但最后的逻辑资源使用却是相同的(时 序逻辑中不一定相同),说明综合器进行了适当的优化。if-else的这种写法是存在优先级的,即第一个if中的条件的优先级最高,后面的if中的条件的优先级依次递减,好在该if中的条件只有一个,也只会产生一种情况,并不会产生优先级的冲突,所以这里优先级的高低关系并不会对最后的功能产生任何影响。而case在 任何时候都不存在优先级的问题,而是通过判断case中的条件来选择对应的输出。

通过RTL视图我们也能够发现if括号里面的条件会生成名为“EQUAL”的比较器单元,而case则会生成名为“DECODER”的译码器单元,这些单元并不是FPGA硬件底层中最小单元,而只是一种用于RTL视图中易于表达的抽象后的图形,使之更易于我们观察、理解其代码所实现功能的硬件结构的大致样子,也符合了 “HDL(硬件描述语言)”所表述的含义。

5.3.2.4. 仿真验证¶

仿真文件编写

仿真参考代码如下所示:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45\`timescale 1ns/1ns module tb_decoder3_8(); //reg define reg in1; reg in2; reg in3; //wire define wire [7:0] out; //初始化输入信号 initial begin in1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3