基于FPGA的多路选择器设计

描述

组合逻辑电路的输出信号只与当前时刻的输入信号有关,与其他时刻的输入状态无关,无存储电路或反馈电路。 多路选择器是在多路数据传送过程中,根据需要选择一条电路。 如果还没看懂功能,结合真值表就好理解了。

FPGA

FPGA

A1A0是选择线,D0-D3是数据线,A1A0构成00-11共4种选择,对应着D的下标,被选中的数据线作为输出。 8选1,16选1同理。 在本例中,选择最简单的2选1电路。

设计规划

这个示例中,采用两个按键作为信号输入,一个按键作为信号选择,LED作为数据输出。 需要实现的功能是,当按下按键sel时(sel=0),LED灯状态取决于按键in2,当不按下sel时(sel=1),LED灯状态取决于按键in1。 h绘制波形图如图所示。

FPGA

编写代码

module mux2_1(
input wire in1,
input wire in2,
input wire sel,
output wire out);
assign out=(sel==1'b1)?in1:in2;
endmodule

这里的组合逻辑电路可以采用always中if-else实现方法,always中case实现方法,assign中条件运算符(三元运算符)实现方法。 涉及到always的语句还没进行总结,这里采用最简单的assign语句,用到了很熟悉的三元运算符。 编写好.v文件后编译通过。

点击RTL viewer可以查看设计的硬件电路结构,和我们设计所表达的意思相同。

FPGA

编写testbench

`timescale 1ns/1ns
module tb_mux2_1();
//在testbench中待测试RTL模块的输入永远是reg型变量
reg in1;
reg in2;
reg sel;
//在testbench中待测试RTL模块的输出永远是wire型变量
wire out;
initial 
  begin
    in1 <=1'b0;
    in2 <=1'b0;
    sel  <=1'b0;
  end


//每隔10ns产生输入随机数0或1
always #10 in1 <= {$random} % 2;
always #10 in2 <= {$random} % 2;
always #10 sel <= {$random} % 2;


//------------------------mux2_1_inst------------------------
mux2_1 mux2_1_inst
(
.in1(in1), //input in1
.in2(in2), //input in2
.sel(sel), //inputsel
.out(out) //output out
);
endmodule

和上一节中结构类似,tb_mux2_1模块中,首先定义初始的输入信号in_1,in_2,sel为低电平(一般时序电路使用非阻塞赋值<=),延迟10个时间单位(ns)产生随机数0或1赋值给输入,就完成了输入信号的波形设计。 根据实例化的讲解,第2-6行和第22-28行完成的功能是将上一个mux2_1.v文件中mux2_1模块与tb_mux2_1模块相连。 这样随机生成的输入信号就被加到mux2_1模块上,并得到输出mux2_1_out,通过验证mux2_1_out与我们期望的输出是否一致,就知道我们的设计是否正确。

对比波形

FPGA

波形显示当sel为高电平时,out与in1一致,sel为低电平时,out与in2一致。

分配管脚

FPGA

FPGA

全编译后上板验证

FPGA

FPGA

按下S2(sel=0)时,按下S1(in2=0)LED就亮(out=in2=0),只按下S0(in1=0)LED就亮(out=in1=0)。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分