Verilog 实现74138译码器
代码编写
首先明确有哪些输入和输出:
Enable 使能 En0 En1 En2
Input 输入 I0 I1 I2
Output 输出 O0 ~ O7
然后把数据类型用Verilog实现:
//使能端为三个 只有当使能为1 0 0的时候芯片才正常译码
input wire[2:0] En;
//输入端为三个二进制位,对应2^3 = 8,即3-8译码器
input wire[2:0] I;
//输出为八个二进制位
output wire[7:0] O;
再分析业务逻辑:
什么是业务逻辑?哎呀就是代码的流程啦,说的高端点🤭
- 要想有正常的译码结果,首先En == 100b
- 然后译码过程实际上就是个左移的过程数学表达式为 O = 1 << I
- 如果 En满足条件就输出2结果 否则 输出 0
- 没了吧
根据业务逻辑分析编写代码:
//直接接线,然后输出,方便快捷
assign O = (En==3'b100) ? ~(8'b0000_0001 << I) : 8'b0000_0000;
将以上代码组合在一起:
module x74138(En, I, O);
input wire[2:0] En;
input wire[2:0] I;
output wire[7:0] O;
assign O = (En==3'b100) ? ~(8'b0000_0001 << I) : 8'b0000_0000;
endmodule
哒哒~大功告成!
仿真
嗐!仿真博主就不🦐起劲了,直接给上仿真结果吧,怎么配置仿真,其他博主的文章已经写的很完美了,就不再赘述了。
En使能的区域
RTL级电路
结尾:
没啦~o(* ̄▽ ̄*)ブ
补:
有聪明的读者发现文章中计算结果的代码少了一个非号,感谢指正。因为该文章写于作者本科时期,现在已经离该专业比较远了,文章中的图都是按照错误的代码生成的,也不方便修改。还是很感谢读者的指正🙏。正确的代码应该为:
module x74138(En, I, O);
input wire[2:0] En;
input wire[2:0] I;
output wire[7:0] O;
assign O = (En==3'b100) ? ~(8'b0000_0001 << I) : 8'b1111_1111;
endmodule