注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
xutong的个人空间 https://home.eeworld.com.cn/space-uid-540784.html [收藏] [复制] [分享] [RSS]
日志

SIMterix-Simplis~8~

已有 494 次阅读2022-10-29 15:53

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

今天的仿真就到此为止吧~

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章