第一篇博客,纪念学习verilog的日子

这篇文章是基于王金明先生的书籍《verilog HDL 程序设计教程》,在该书籍上的源代码上改进,实现的MUX4选1数据选择器。


首先是基于case语句的4选1数据选择器(书籍上的源代码)

module mux(IN0,IN1,IN2,IN3,SEL0,SEL1,OUT);//端口说明
input[1:0] IN0,IN1,IN2,IN3;
input SEL0,SEL1;
output OUT;

reg[1:0] OUT;

always @(IN0 or IN1 or IN2 or IN3 or SEL0 or SEL1)
    begin
    case ({SEL0,SEL1})//case语句
    2'b00:OUT = IN0;
    2'b01:OUT = IN1;
    2'b10:OUT = IN2;
    2'b11:OUT = IN3;
    endcase
    end
endmodule

然后是仿真测试程序

`timescale 1ns/1ns
module mux_test;

reg[1:0] u_IN0,u_IN1,u_IN2,u_IN3;
reg u_SEL0,u_SEL1;//寄存器变量,注意不要对源代码中的in0等输入值进行赋值,而要对寄存器变量进行赋值操作
wire[1:0] u_OUT;
mux u_mux(u_IN0,u_IN1,u_IN2,u_IN3,u_SEL0,u_SEL1,u_OUT);//位置关联

initial
    begin
        u_IN0<=2'b00;
        u_IN1<=2'b01;
        u_IN2<=2'b11;
        u_IN3<=2'b10;
        u_SEL0<=0;
        u_SEL1<=0;
    end
always #1 u_IN0=~u_IN0;//使用always模块对寄存器变量进行赋值
always #2 u_IN1=~u_IN1;
always #4 u_IN2=~u_IN2;
always #8 u_IN3=~u_IN3;
always #16 u_SEL0=~u_SEL0;
always #32 u_SEL1=~u_SEL1;

endmodule

这个测试程序中出现了太多always模块,不符合实际需求,因此,我自己写了个新的测试程序:

首先是源代码,这里我先用图片形式插入:

然后是我自己写的测试程序:

这里的测试程序,通过添加时序电路,可以实现一个“动态输入”的效果,经测试,时序图如下

 

时序图中可以看出,确实实现了“动态输入”的效果。

在编写程序时,一开始我在源代码中对输入in0等进行赋值,发现这样不可取,后来在测试程序中通过“寄存器变量”实现了“动态输入”的效果,与书籍上的测试程序相比,使用的always模块数量更少,实现效果有更棒! 

猜你喜欢

转载自blog.csdn.net/zhenhuagege/article/details/85275485