⼀ 实验⽬的
1. 掌握组合逻辑电路的设计⽅法
2. 掌握“连续赋值”和“过程赋值”设计的流程
⼆ 实验内容
设计与74138功能完全相同的译码器电路
2.1 设计输⼊
1. 模块名称:Decode138
2. 输⼊输出:C、B、A、G1、G2An、G2Bn 、Y[7:0] ;
2.2 引脚约束
1. 输⼊端 ⾃定义
2. 输出端 ⾃定义
2.3 设计要求
1. 使⽤“连续赋值”和“过程赋值”(包含case和if-else)两种⽅案分别实现
2. 使⽤RTL View分析电路的区别
2.4 电路仿真1. 激励⽂件
2. 功能仿真
三、实验报告
1. 设计代码、RTL视图
2. 仿真结果
3. 报告中附代码和仿真结果截图
实验步骤:
1. 参考74ls138的真值表
2. verilog代码&编译
module Decode138(C,B,A,G1,G2An,G2Bn,Y); //连续赋值
input C,B,A,G1,G2An,G2Bn;
output [7:0]Y;
assign Y = ({G1,G2An,G2Bn} == 3'b100) ?
~(8'b0000_0001 << {C,B,A}) : 8'b1111_1111;
endmodule
//module Decode138(C,B,A,G1,G2An,G2Bn,Y); //过程赋值
// input C,B,A,G1,G2An,G2Bn;
// output reg [7:0]Y;
// always@(*)
// begin
// if({G1,G2An,G2Bn} == 3'b100)
// case({C,B,A})
// 3'b000: Y=8'b1111_1110;
// 3'b001: Y=8'b1111_1101;
// 3'b010: Y=8'b1111_1011;
// 3'b011: Y=8'b1111_0111;
// 3'b100: Y=8'b1110_1111;
// 3'b101: Y=8'b1101_1111;
// 3'b110: Y=8'b1011_1111;
// 3'b111: Y=8'b0111_1111;
// endcase
// else
// Y = 8'b1111_1111;
// end
//endmodule
连续赋值和过程赋值前期判断和数据选择器是一样的,判断{G1,G2An,G2Bn}是否是3'b 100 (即RTL图中Equal的3'h 4)
但是两者的数据选择器的输入是不一样的,当控制端为1时, 过程赋值用到了Decoder(这里是3-8译码器),而连续赋值中用到了ShiftLeft,即左移运算符
仿真时设置G1=1,G2An=0,G2Bn=0
C , B , A从000增加到111(设置三者自增周期之比为 :4:2:1) ,C是高位