一年后,天南和地北,一厢情愿却难忘
简报
众所周知,74ls151是和74ls138一样应用广泛的电子元器件,其本体共有1+3+8+2+1+1=16根引脚。鉴于电源和接地引脚并没有什么亮点,笔者将使用Verilog HDL在Vivado上面实现74ls151其余14根引脚对应的功能。
引脚
74ls151的逻辑符号共有14根引脚,具体如下:
- 使能端:共1根,低电平有效,输入使能信号。
- 地址段:共3根,通过组成二进制编码来进行0~7的编号,以对应8个不同的数据输入端。
- 数据输入端:共8根,为地址段输入数据组成的二进制代码所对应,输入数字信号,在内部电路作用下在输出端输出。
- 输出端:共2根,一根输出原信号,一根输出原信号的反码信号。看似用处不大,但在某些方面是有巨大用途的。至于是在哪些方面,笔者只是一个自学FPGA的菜鸡,或许以后会知道的[doge]。
代码
直接上。
module text_2(
input g,
input [2:0] a,
input [7:0] d,
output reg y,
output y2
);
always @ *
begin
if(~g)
case(a)
3'b111 : y = d[7];
3'b110 : y = d[6];
3'b101 : y = d[5];
3'b100 : y = d[4];
3'b011 : y = d[3];
3'b010 : y = d[2];
3'b001 : y = d[1];
3'b000 : y = d[0];
endcase
else
y=0;
end
assign y2=~y;
endmodule
下面为在Vivado环境下编写的仿真代码。因为元器件的功能限制,笔者将输入信号y[7]~y[0]规定为八位二进制码10101010。
module SIM;
reg g;
reg [2:0] a;
reg [7:0] d;
wire y;
wire y2;
x74x151 u1(g,a,d,y,y2);
initial begin
g=1;
d=8'b10101010;
a=3'b000;
#100;
g=0;
end
always #100
a=a+1;
endmodule
规定在初始阶段,使能端输入高电平,阻止功能的实现,输入信号自高位到低位为10101010,地址端信号为三位二进制000,100ns后改变状态,使能端输入由高电平转为低电平,并每隔100ns,令地址端信号a加1,从而实现对应不同输入端的效果。
仿真效果
根据仿真的波形图,我们可以看出在使能端输入低电平时输出端在地址段的变化下输出了对应的输入端信号及其反码信号,实现74ls151的功能,符合我们的预期。
小结
用Verilog HDL对这些小元件进行编写确实有些大材小用,但是我们的眼光不应当仅仅停留在这个层面。相反,笔者认为,大家应当时不时地通过编写这些最基础的代码来规范自己的风格,纠正自己的习惯。而这些东西正是各位在学习过程中一定会出现的问题。所以,不管什么语言,C程序也好,Python也好,一定要把习惯养好,不然,懂的都懂[doge]
另外,本系列文章也适合和笔者一样的萌新解决在学习Verilog时遇到的,基础到基本没有人会回答的问题。由于笔者也是刚开始学习Verilog HDL与FPGA,所以最懂自学的萌新们会遇到什么样的问题!当然,如若有幸遇到各路大神的指正,笔者将会不胜感激。
最后,为什么我们学校的数电课本那么简陋啊…上面什么都没有…附录竟然还是试卷…历届学长是怎么自学的啊[崩溃]