个人网站有前途吗,app页面模板,wordpress 搜索没有按钮,网站建设平台信息时间#xff1a;2024.11.15
一、学习内容
1.译码器 译码是编码的逆过程#xff0c;在编码时#xff0c;每一种二进制代码#xff0c;都赋予了特定的含义#xff0c;即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码#xff0c;实现译码操…时间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}3b000) //{in_1,in_2,in_3}对三路信号进行拼接out 8b0000_0001;else if({in_1,in_2,in_3}3b001) out 8b0000_0010;else if({in_1,in_2,in_3}3b010) out 8b0000_0100;else if({in_1,in_2,in_3}3b011) out 8b0000_1000;else if({in_1,in_2,in_3}3b100) out 8b0001_0000;else if({in_1,in_2,in_3}3b101) out 8b0010_0000;else if({in_1,in_2,in_3}3b110) out 8b0100_0000;else if({in_1,in_2,in_3}3b111) out 8b1000_0000;
else
out 8b0000_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}3b000) //{in_1,in_2,in_3}对三路信号进行拼接out 8b0000_0001;else if({in_1,in_2,in_3}3b001) out 8b0000_0010;else if({in_1,in_2,in_3}3b010) out 8b0000_0100;else if({in_1,in_2,in_3}3b011) out 8b0000_1000;else if({in_1,in_2,in_3}3b100) out 8b0001_0000;else if({in_1,in_2,in_3}3b101) out 8b0010_0000;else if({in_1,in_2,in_3}3b110) out 8b0100_0000;else if({in_1,in_2,in_3}3b111) out 8b1000_0000;
else
out 8b0000_0001; */
always(*)case({in_1,in_2,in_3})3b000:out 8b0000_0001;3b001:out 8b0000_0010;3b010:out 8b0000_0100;3b011:out 8b0000_1000;3b100:out 8b0001_0000;3b101:out 8b0010_0000;3b110:out 8b0100_0000;3b111:out 8b1000_0000;default:out 8b1000_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 1b0;in_2 1b0;in_3 1b0;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系列芯片中数字越小速度越快对于赛琳斯公司的器件数字越大速度越快。