(1)FPGA开发实战——二选一数据选择器

这篇具有很好参考价值的文章主要介绍了(1)FPGA开发实战——二选一数据选择器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据选择器设计

数据选择器是指经过选择,把多个通道的数据传送到唯一的公共数据通道上去,实现数据选择功能的逻辑电路称为数据选择器。在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关。在选择变量n控制下,从多路数据输入中某一路数据送至输出端。对于一个具有 2^n 个输入和 1 个输出的多路选择器,有 n 个选择变量。多路选择器也是 FPGA 内部的一个基本资源,主要用于内部信号的选通。简单的多路选择器还可以通过级联生成更大的多路选择器。

下边举例来说明一下数据选择器,不妨设选择器为2输入in1,in2,选择端为sel,输出out。
选择器的逻辑是这样的,如果sel=0,选择in2信号输出,即out=in2,如果sel=1,选择in1信号输出,sel=in1。而在数字电路当中,一个变量可以有两个状态0和1,所以两输入变量对应四种不同的结果,如果考虑选择端sel,则可以列出如下真值表所示。

sel in1 in2 out
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 1

这样得到输出out的表达式为out=sel’&in2+sel&in1('表示反变量的意思)

根据上述真值表可以得到下边基本门电路组成的二选一数据选择器的电路图
(1)FPGA开发实战——二选一数据选择器
但是在数字电路当中,我们不需要在门电路设计电路,只需要知道电路的逻辑功能,直接使用封装好的芯片即可,封装好的芯片就是把能实现一定功能的门电路封装起来,比如我们要实现的数据选择器,直接用比如说74HC153即可。并且verilog是在寄存器级的描述语言,只要你告诉它你要实现的功能,便会自动给出搭电路,我们下边的RTL视图就是软件实现我们描述的逻辑功能的电路。所以我们通常用下边的框图表示二选一数据选择器。

(1)FPGA开发实战——二选一数据选择器

比如,常见的双二选一数据选择器的芯片如下图示

(1)FPGA开发实战——二选一数据选择器

而在verilog语言里边,实现上述电路有三种方法,if语句和case语句,以及三目运算符实现。

下边分别给出三种不同实现方法的代码,以及对应的RTL视图,方便读者了解这三种实现方法的不同,尽管使用的语法不一样,但是最后电路实现的功能是一样的。所以大家在代码的实现上就有很多的选择,看到别人不同的写法也不要大惊小怪,我们要关注的是最后的功能,在不考虑资源使用的情况下只要功能满足要求,代码的灵活性可以随意控制。通过对比发现以上三种不同代码方式实现的 2 选 1 多路选择器对应综合出的 RTL 视图虽有所差别,但综合工具在布局布线和最后映射 FPGA 资源时会自动优化,使最终的功能和占用的逻辑资源都是相同的。

这里介绍2输入的数据选择器,对于输入个数更大的数据选择器,请读者类推。

下边给出三种实现方法和对应的RTL视图以及仿真波形(三种实现方式波形一致),读者可以挑其中一种实现方法即可。

如果不记得软件的操作和仿真设置可以点击下边链接查看。

软件的使用和仿真设置看这里

代码实现和仿真波形

一、if-else语句实现代码

module mux2_1(
	input wire in1,in2,//两个输入变量
	input wire sel,//数据选择端
	output reg out//输出信号端

);

	always @ (*)
		if(sel==1'b1)
			out=in1;
		else
			out=in2;
endmodule

RTL视图
(1)FPGA开发实战——二选一数据选择器
二、case语句实现

module mux2_1(
	input wire in1,in2,//两个输入变量
	input wire sel,//数据选择端
	output reg out//输出信号端

);

always @ (*)
	case(sel)
		1'b0:out=in1;
		1'b1:out=in2;
		default:out=in1;
	endcase

endmodule

RTL视图

(1)FPGA开发实战——二选一数据选择器
三、三目运算符实现

module mux2_1(
	input wire in1,in2,//两个输入变量
	input wire sel,//数据选择端
	output wire out//输出信号端

);

	assign out=(sel==1'b1)? in1:in2;
	
endmodule

RTL视图
(1)FPGA开发实战——二选一数据选择器

三、仿真文件编写

`timescale 1ns/1ns

module tb_mux2_1();

	reg in1,in2,sel;
	wire out;

initial
begin//将变量赋初值为0
	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;

//下边的initial块的语句可以不要,只是方便波形的观察
initial begin
	$timeformat(-9,0,"ns",6);//设置显示的时间格式,此处表示的是(打印时间单位为纳秒,
//小数点后打印的小数位为 0 位,时间值
//后打印的字符串为“ns”,打印的最小数量字符为 6 个)
	$monitor("@time %t:in1=%b in2=%b sel=%b out=%b",$time,in1,in2,sel,out);
	//只要监测的变量(时间、in1, in2, sel, out)发生变化,就会打印出相应的信息
end

mux2_1 mux2_1_inst(//模块实例化
.in1(in1),
.in2(in2),
.sel(sel),
.out(out)

);
endmodule

这里使用了 $monitor系统函数来输出变量的值, 用法如下 $monitor(“%b+%b=%d”,a,b,c); //“%b+%b=%d” 格式控制,未指定时默认十进制
%h 或%H //以十六进制的形式输出
%d 或%D //以十进制的形式输出
%o 或%O //以八进制的形式输出
%b 或%B //以二进制的形式输出

$time 为时间函数,返回 64 位当前仿真时间; $random 用于产生随机函数,返回随机
数,{ $random} % n返回一个0到n-1的随机数。

系统函数的用法比较固定,如果不理解,也不影响输出的波形,直接方便读者观看结果而已

波形图
(1)FPGA开发实战——二选一数据选择器

根据波形图sel的取值,看sel=1时,out是否等于in1,sel=0时,out是否等于in2,即可验证波形的正确性。

为了观看变量在不同时刻的值,可以选择Modelsim的”View“下”Transcript“,即可观看变量在不同时刻的值

(1)FPGA开发实战——二选一数据选择器
比如550ns(下图第5行)时,sel=1,此时应该选择sel,所以out和in1输出一致,尽管in2=1,但是out选择的是in1
(1)FPGA开发实战——二选一数据选择器文章来源地址https://www.toymoban.com/news/detail-479154.html

下节内容——3-8译码器

到了这里,关于(1)FPGA开发实战——二选一数据选择器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA 中的多路选择器综述:实现八选一功能

    FPGA 中的多路选择器综述:实现八选一功能 多路选择器是FPGA中常见的基础电路之一,也叫做数据选择器,用于从多个输入信号中选择一个输出信号。选择器的输入端通常有一个选择控制端,来决定哪一个输入信号会被输出。在本文中,我们将详细介绍FPGA中的多路选择器实现

    2024年02月08日
    浏览(103)
  • FPGA四选一的多路选择器(用三元运算符?:解决)

           ?:符号通常用于条件运算符,表示条件判断。它类似于C语言中的三元运算符,用于根据条件选择不同的操作或值。         例如,在Verilog中,条件运算符?:可以用于if-else语句的简写形式。它的一般语法格式如下:         如果表达式为真,则结果为结果1;否

    2024年01月21日
    浏览(51)
  • Docker官方文档学习笔记(一):安装Docker Engine(和安装Docker Desktop for Linux二选一)

    参考官方文档 /var/lib/docker 中的内容会被保留,如果要完全删除,继续参考文章最后的卸载教程完成卸载 三种方法,通过仓库安装(推荐),通过DEB包手动安装,以及使用脚本安装。 在安装之前,请让自己熟悉脚本安装的潜在风险和限制: 该脚本需要root或sudo特权才能运行。

    2024年02月12日
    浏览(42)
  • Docker官方文档学习笔记(一):安装、升级、卸载Docker Desktop for Linux(和安装Docker Engine二选一,推荐Docker Engine)

    参考自官方文档Install Docker Desktop on Linux和Install Docker Desktop on Ubuntu 本教程所用系统为Ubuntu22.04 对新手来说有个图形化界面还是挺方便的,可以装上跟着学习笔记(二)熟悉Docker,我是练完手之后卸载了Docker Desktop转而装了Docker Engine,因为当时发现DD4L好像不支持容器内运行图

    2024年02月10日
    浏览(47)
  • 【Verilog实现8个输入1个输出的选择器】--FPGA开发

    【Verilog实现8个输入1个输出的选择器】–FPGA开发 在FPGA开发中,选择器是一种重要的电路,它可以将多个输入端口上的数据选择一个输出端口进行传输。通过Verilog语言实现选择器,我们可以灵活地根据实际需求来配置输入和输出端口,提高FPGA的功能和性能。 下面,我们将讨

    2024年02月07日
    浏览(44)
  • flutter开发实战-生日等日期选择器DatePicker

    flutter开发实战-生日等日期选择器DatePicker 在开发遇到设置生日等信息需要选择日期,这里用到的是CupertinoDatePicker iOS效果的日期、时间选择器 运行后效果图如下 我们需要调用底部弹窗显示 生日日期选择 ProfileBirthdayPicker flutter开发实战-生日等日期选择器DatePicker。iOS效果风格

    2024年02月16日
    浏览(40)
  • FPGA原理与结构(4)——数据选择器MUX(Multiplexers)

    系列文章目录:FPGA原理与结构(0)——目录与传送门         数据选择器MUX是一种非常经典的组合逻辑电路,它是一个多输入,单输出的器件,功能是可以根据选择信号,选择出需要的输入信号作为输出。         MUX在FPGA中的CLB中,我们打开device视图放大观察可以看到  

    2024年02月08日
    浏览(43)
  • FPGA实战开发-基于DDR的图像缓存(下)

    文章目录 概要 整体架构流程 技术名词解释 技术细节 小结 例如: 基于米联科的学习资料,分享和学习同步,欢迎大家一起探讨。 提示:这里可以添加技术整体架构 例如:       image_data_gen产生了测试图片,之后进入过W0 FIFO进行视频缓存。每次缓存1024个像素,就往通过F

    2024年02月17日
    浏览(41)
  • FPGA实战开发-基于的ddr图像缓存设计(上)

    目录 概要 整体架构流程 技术名词解释 技术细节 ​编辑 小结 提示:这里可以添加技术概要 本文主要基于DDR的图像缓存设计。 提示:这里可以添加技术整体架构 先用图像产生模块产生一个1080P60Hz的测试图像,然后经过FDMA进入ddr3,缓存3帧后在读出来。然后在经过HDMI显示。

    2024年02月08日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包