记得之前读书时候学门电路就是用门电路搭三人表决器,虽然已经过了很久,但这个还是比较经典的,咱们就用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仿真结果
今天的仿真就到此为止吧~