记得之前读书时候学门电路就是用门电路搭三人表决器,虽然已经过了很久,但这个还是比较经典的,咱们就用SIMterix-simplis来复现下。
首先新建一个 voter.v的文件,如果用的是VScode记得安装下相关的Verilog插件。使用verilog编程像我这样的新手可以参考夏宇闻老师的书。
图1:使用VScode打开Voter.v
首先咱们先确定下输入输出,如下所示
输入:A,B,C, 输出:D \\当大多数人同意时候输出D为高。
确定输入输出逻辑后直接开始撸。
图2:参考代码1
参考代码1:
module Voter (
input wire a,
input wire b,
input wire c,
output wire d
);
// 使用1个&代表按位&
// 使用两个|代表逻辑或
// assign 用来实现wire型的输出
assign d=(a&b)||(b&c)||(c&a);
endmodule
|
根据以上代码参考SIMterix-simplis~4~构建完的电路如下图所示。
图3:三人表决器电路图
图4:三人表决器仿真结果
虽然直接使用电压源就可以做仿真,但是这样整太麻烦了,咱们在写个测试三人表决器的module。
当时钟输入时候,a,b,c各种花样变一下就好了。咱们就新建一个文件脚vocter_tb.v。
参考代码2:
module vocter_tb (
input wire clk,
output reg a,
output reg b,
output reg c
);
//定义一个3位的寄存器
reg [2:0]temp;
//初始化 abc 让abc一开始等于0
//避免错误触发
initial begin
a=1'b0;
b=1'b0;
c=1'b0;
temp=3'b000;
end
//每当时钟来临temp+1
always @( negedge clk) begin
temp<=temp+1'b1;
a<=temp[0];
b<=temp[1];
c<=temp[2];
end
endmodule
|
图5:参考代码2
图6:参考电路
图7:仿真结果
直接使用Verilog编写驱动代码就省事多了,我们只需要一个信号源直接就能得到3个变换的信号,相比改电源发生器的逻辑简单了许多。
突然发觉这个test的发生器适用于测试HC138,咱们就在撸一个138译码器。刚好复习以下Verilog的语法。
参考代码3:
module HC_138(
input A,
input B,
input C,
input EN,
output reg [7:0] Q
);
always @( A or B or C or EN) begin
case({A,B,C,EN})
4'b0001 : Q <= 8'b00000001;
4'b0011 : Q <= 8'b00000010;
4'b0101 : Q <= 8'b00000100;
4'b0111 : Q <= 8'b00001000;
4'b1001 : Q <= 8'b00010000;
4'b1011 : Q <= 8'b00100000;
4'b1101 : Q <= 8'b01000000;
4'b1111 : Q <= 8'b10000000;
default : Q <= 8'b00000000;
endcase
end
endmodule
|
图8:接上138 decoder的图纸
图9:Probe 要选择 bus probe
图10:HC138仿真结果
今天的仿真就到此为止吧~