可算是放寒假了。。。泪目!
简报
众所周知,74ls138是一种应用广泛的电子元器件。其本体共有3+3+8+1+1=16根引脚,其中,电源与接地口我们直接忽略掉吧(毕竟这兄弟俩也没什么大用处。。。也许吧)。 因此,本篇文章将利用Verilog HDL对 74ls138 16个接口中的14个接口功能进行实现。
引脚
74ls138逻辑符号中的14个引脚及其功能如下:
- 地址端:共3个,按高低顺序组成二进制代码,通过数字的先后顺序对应8个数据输出端,为主要实现功能的端口之一。
- 输出端:为主要实现功能的端口之一,共8个,根据地址段输入的信息,不同的输出端将会作出相应反应(比如电平由高转低)注意:74ls138的8个输出端输出的为最小项的反,即默认状态下输出均为1。
- 选通端:共3个,为原件功能的开关。当且仅当一个选通端为高电平,其余两个选通端为低电平时,允许原件进行正常工作。
代码
根据上述内容,我们可以很容易地在Vivado上面利用Verilog HDL语言实现74ls138的功能。废话不多说,我们直接上代码。
module x74x138(
g1,g2,g3,a,y
); //定义模块
input g1,g2,g3;
input [2:0] a;
output [7:0] y; //声明输入输出量 这一步不能放到定义模块中去
reg [7:0] y=0; //作为变量要声明为reg
always @ *
begin
if(g1 && ~g2 && ~g3) //选通端
case(a)
7:y= 8'b01111111;
6:y= 8'b10111111;
5:y= 8'b11011111;
4:y= 8'b11101111;
3:y= 8'b11110111;
2:y= 8'b11111011;
1:y= 8'b11111101;
0:y= 8'b11111110;
default: y= 8'b11111111;
endcase
else
y= 8'b11111111;
end
endmodule
以上为74ls138的Verilog HDL代码。我用的FPGA设计套件是Vivado,下面是对应的仿真文件。
module SIM;
reg g1;
reg g2;
reg g3;
reg [2:0] a;
wire [7:0] y;
x74x138 u1(g1,g2,g3,a,y);
initial begin
g1=0;
g2=0;
g3=0;
a=0;
#100;
g1=1;
g2=0;
g3=0;
end
always #100 a=a+1;
endmodule
在仿真文件里,我们先令选通端均为低电平,在100ns后,改变电平状态,启动原件,并在每100ns将a的数值+1,以便验证功能。
仿真效果
仿真显示当选通端不符合规定时,原件并不会实现功能。在选通端符合规定后,根据地址段对应的数字的变化,输出端相应位置的电平会由高转低,符合我们的预期。
小结
讲真的,我自己都感觉这个东西写上去有点简单,不会有多少人会看。但是,我还是要把它认真的写出来,毕竟,这是我设计的第一个硬件,懂的都懂(刚学的时候这些东西都是能让我抓狂的。。。),所以将他们写出来。一来便于对硬件的理解,二来帮助刚刚接触到Verilog HDL的同仁更好的对代码和仿真文件进行一定的理解。就这样吧。这几天要是有时间我会把我初期写的一些代码发出来,正好当做我博客的头几篇文章(别说,还真合适)。各位,拜拜喽!