【FPGA初级】4选一数据选择器的verilog实现(含testbench与波形)

数据选择器

数据选择器,可根据给定的输入地址代码,从一组输入信号中选出指定的一个,送至输出端
四选一数据选择器,从四个端口中任意选择一个,送至输出端。设定四个端口为din[0]、din[1]、din[2]、din[3],表示四个端口需要两个选择信号(22 =4),设为del[0]、del[1],将输出信号设为dout。

verilog实现

代码如下

module MUX(
din,
sel,
dout

);

input[3:0] din;//四个端口,故位宽为4
input[1:0] sel;//两个选择信号,故位宽为2
output dout;
reg dout;

always @(*)begin

if(sel==2'b00)
   
	dout=din[0];
	
if(sel==2'b01)
   
	dout=din[1];
	
if(sel==2'b10)
   
	dout=din[2];

if(sel==2'b11)
   
   dout=din[3];
	
end


endmodule

testbench

代码如下

`timescale 1ns/1ns
module MUX_test;   //MUX_test为测试文件名字

reg [3:0]din;      //输入信号对应reg类型
reg [1:0]sel;
wire dout;         //输出信号对应wire类型

MUX u_MUX(        //MUX为被例化的模块名,u_MUX为例化模块名
    .din(din),    //括号外为被例化的端口名,括号内为例化端口名
	 .sel(sel),
	 .dout(dout)

);

//以下四个always颇为巧妙,具体看下方解释
always # 10 din[0]=~din[0];
always # 20 din[1]=~din[1];
always # 40 din[2]=~din[2];
always # 80 din[3]=~din[3];

initial
       begin
		    sel=1'b0;
			 din=4'b0;
			 #160 $stop;
		 end
always #10 sel=sel+1;//din的值10ns变换一次,故而将sel的每一个值延时10ns

endmodule

四个always实现了din四个端口的值从0000变化到了1111,如下表所示

时间变化信号变化din
00000
10nsdin[0]取反0001
20nsdin[0]取反,din[1]取反0010
30nsdin[0]取反0011
40nsdin[0]取反,din[1]取反,din[2]取反0100
50nsdin[0]取反0101
60nsdin[0]取反,din[1]取反0110
70nsdin[0]取反0111
80nsdin[0]取反,din[1]取反,din[2]取反,din[3]取反1000
90nsdin[0]取反1001
100nsdin[0]取反,din[1]取反1010
110nsdin[0]取反1011
120nsdin[0]取反,din[1]取反,din[2]取反1100
130nsdin[0]取反1101
140nsdin[0]取反,din[1]取反1110
150nsdin[0]取反1111

使得din的值有多种取值并无多意,只想体现del的选择功能,无论din的值如何,由del的值决定输出哪个端口,也可以将din的值固定为一个值,也可以体现选择功能。

del的值与端口号的对应如下:

deldout
00din[0]
01din[1]
10din[2]
11din[3]

假定某时din的值为1101,而此时del的值为10,故而din[2]为输出端口,输出的值与din的值无关,但波形图一致(输出与被选端口的波形)。

波形图如下:
波形图
对准一个时间段,可观察到被选定的端口号的波形,与输出波形一致。

以上均为学习笔记,若有错误,欢迎大家指出,一定积极讨论并予以改正

  • 19
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了演示四选一数据选择器的仿真波形,我们需要编写一个测试台模块,用于模拟输入信号,并将输出信号进行记录。下面是一个简单的测试台模块,用于测试四选一数据选择器。 ``` module mux4x1_tb; // 时钟信号 reg clk = 0; always #5 clk = ~clk; // 输入信号 reg [3:0] data_in; reg [1:0] sel; // 输出信号 wire out; // 实例化四选一数据选择器 mux4x1 mux(.data_in(data_in), .sel(sel), .out(out)); // 测试信号生成 initial begin data_in = 4'b0000; sel = 2'b00; #10; data_in = 4'b0001; sel = 2'b00; #10; data_in = 4'b0010; sel = 2'b01; #10; data_in = 4'b0100; sel = 2'b10; #10; data_in = 4'b1000; sel = 2'b11; #10; data_in = 4'b1111; sel = 2'b10; #10; $finish; end // 记录输出信号 always @(posedge clk) begin $display("data_in=%b sel=%b out=%b", data_in, sel, out); end endmodule ``` 在测试台模块中,我们使用了一个时钟信号 `clk`,以及一个计数器 `data_in` 和一个选择器 `sel`,用于模拟输入信号。同时,我们将输出信号 `out` 连接到了四选一数据选择器的输出端口。在模拟过程中,我们会改变 `data_in` 和 `sel` 的值,然后记录输出信号 `out` 的值。 下面是这个测试台模块的仿真波形: ![mux4x1仿真波形](https://img-blog.csdnimg.cn/20211205171543261.png) 可以看到,在测试过程中,我们改变了 `data_in` 和 `sel` 的值,然后记录了输出信号 `out` 的值。通过观察波形,我们可以验证四选一数据选择器的功能是否正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值