所使用EDA软件:VIVADO2019.1.3

FPGA型号:xc7a35tcsg325-2

看完这篇文章你将收获以下内容:

  • 理解MUX中输出与地址码,数据输入的关系。
  • 理解硬件描述语言与MUX的对应关系。
  • 理解FPGA中用LUT6组成的MUX4:1。LUT6和MUXF7,MUXF8组成的MUX8:1,MUX16:1。

说实话上一节课的DRAM,移位寄存器的确是让有些同学脑阔疼滴。那么这一节我们学点简单点的内容放松下----MUX(多路数据选择器),其基本结构如图1。

图1:多路数据选择器

它是四选一数据选择器(MUX4_1),这里的四指的是数据输入有4位(D0-D3),一指的是数据输出有1位(Q),地址码是用来决定将哪一位输入传送到输出。表1是MUX4_1的对应表,它阐明了输出与地址码,数据输入的关系。将地址码(A)二进制的转为十进制,这个十进制的结果就决定将哪一路的输入(D)传送到输出(Q)。

标表1:MUX4_1的对应表题

接下来我们来看一看FPGA用LUT6做成MUX4_1的(图2红框部分)。

图2:MUX4_1的结构标题

其实MUX4_1本质上还是一个LUT6,只不过它有着特定的连线方式,它将2位地址输入,以及4位数据输入连入到LUT6的地址输入端。从前面的课程中,我们知道LUT6的输出O6是由6位地址输入以及存放在LUT6中的64个初始值决定的。现在我们已经知道了LUT6的地址输入,那么只要配上相应的初始值就可以做成MUX4_1了,那么它的初始值是什么呢?下面我们通过例1以及它所导出的网表看一下LUT6里的初始值。

//以下是例1
module MUX4_1(input [3:0]d,input [1:0]a,output reg q);always@(*)
begincase(a)2'b00:q<=d[0];2'b01:q<=d[1];2'b10:q<=d[2];2'b11:q<=d[3];endcase
end
endmodule
 //以下是例1导出的网表,这里本来是有IBUF,OBUF的,为避免混淆视线我把它删了LUT6 #(.INIT(64'hF0AAFFCCF0AA00CC)) q_OBUF_inst_i_1(.I0(d[1]),.I1(d[0]),.I2(d[3]),.I3(a[1]),.I4(a[0]),.I5(d[2]),.O(q));

很不幸,综合后的结果不是d0~d3对应LUT6的I0~I3,a0~a1对应LUT6的I4~I5。而是乱序的,木有办法,我们就通过python的代码将这个值给求出来并与网表中的INIT值对比,同时加深对MUX的印象。

代码思路如下:

  • 当a[1:0]=2'b00时,d[3:0]=4'bxxx0对应的INIT位或上0,d[3:0]=4'bxxx1对应的INIT位或上1
  • 当a[1:0]=2'b01时,d[3:0]=4'bxx0x对应的INIT位或上0,d[3:0]=4'bxx1x对应的INIT位或上1
  • 当a[1:0]=2'b10时,d[3:0]=4'bx0xx对应的INIT位或上0,d[3:0]=4'bx1xx对应的INIT位或上1
  • 当a[1:0]=2'b11时,d[3:0]=4'b0xxx对应的INIT位或上0,d[3:0]=4'b1xxx对应的INIT位或上1
  • 因为INIT或上0还是INIT ,所以我们只关注INIT位或上1的情况。
#coding=UTF-8
I = range(0,64)result=0x0000000000000000def calc_shift(i):add=0add+=2**0*((i>>0)&0b000001)add+=2**1*((i>>1)&0b000001)add+=2**2*((i>>2)&0b000001)add+=2**3*((i>>3)&0b000001)add+=2**4*((i>>4)&0b000001)add+=2**5*((i>>5)&0b000001)return add#!!!特别要注意对应关系  i[0]->d[1] , i[1]->d[0]
#i[2]->d[3] , i[3]->a[1] , i[4]->a[0] , i[5]->d[2]
for i in range(0,64):if(i&0b011010==0b000010):        #a[1:0]=2'b00 ,d[0]=1'b1result|=1<<(calc_shift(i))   elif(i&0b011001==0b010001):       #a[1:0]=2'b01 ,d[1]=1'b1result|=1<<(calc_shift(i))elif(i&0b111000==0b101000):      #a[1:0]=2'b10 ,d[2]=1'b1result|=1<<(calc_shift(i))elif(i&0b011100==0b011100):      #a[1:0]=2'b11 ,d[3]=1'b1result|=1<<(calc_shift(i))# %#x代表16进制输出
print("result is %#x \n"%result)#打印结果:result is 0xf0aaffccf0aa00cc

从python代码运行后结果为0xf0aaffccf0aa00cc,与INIT的64'hF0AAFFCCF0AA00CC相同,初始化值是怎么来的我相信上面的代码已经阐述的挺清楚的,我就不过多累赘了。

然后我来解释一下用2个LUT6加一个MUXF7组成一个MUX16_1的情况,MUX8_1的结构如图3红框部分所示。

图3:MUX8_1结构标题

看到这里,难免会有小伙伴会好奇,为什么这里明明是8位数据输入端,理应3位地址输入就够了,然而却会有4位地址(SELDC[2:0]+SEL D[2:0]),下面我们用一个例子(例2)以及它综合后的原理图(图4)来讲解有关MUX8_1有关地址输入的连线。

//以下是例2
module MUX8_1(input [7:0]d,input [2:0]a,output reg q);always@(*)
begincase(a)3'b000:q<=d[0];3'b001:q<=d[1];3'b010:q<=d[2];3'b011:q<=d[3];3'b100:q<=d[4];3'b101:q<=d[5];3'b110:q<=d[6];3'b111:q<=d[7];endcase
end
endmodule

图4:MUX8_1的结构原理图标题

从图4我们看到,3位地址线,低2位(蓝线,黄线)是连到两个LUT6的同一位置的(也就是说2个LUT6的4个地址输入只占用了MUX8_1的低两位地址),高1位是连到去MUXF7的数据选择端。两个LUT6各做为MUX4_1,8位数据输入经过2个MUX4_1后选剩2位数据,这2位数据作为MUXF7的输入I0 I1,再由a[2]决定将哪一位输出到O。简单而言就是从8个里面选2个,再从2个里面选1个

MUX16_1的结构(图5)与MUX8_1类似,先用低2位地址将16数据通过4个MUX4_1选出4个,再通过MUXF7在4个数据中选2个(用次高位地址),最后再通过MUXF8在2个数据中选1个(用最高位地址),从而实现16选1的功能。就是16个里选4个,再从4个里选2个,再从2个里选1个

图5:MUX16_1的结构标题

说到这里可能就有人会问为什么不先用4个LUT6在16个里选4个,再用1个LUT6从4个里选1个呢。这是一个好问题,我们先看看这两种方法在FPGA内部的实现方式,红线是只用LUT6,绿线是LUT6+MUX结构。我们也很容易看出只用LUT6(红线)这种做法做无法保证从输入到输出走线延迟的一致性,走的线越长造成线与线之间延迟偏差就会越大,因而会造成多路输出信号到下一级输入时间不一致,到达时间不一致很容易产生毛刺,造成逻辑错误。这也是为啥F7MUX和F8MUX做与LUT6靠的那么,还做成对称结构的原因,它本身就是为了多路选择器设计的。

图6:两种方法在FPGA内部的实现MUX16_1,红线是只用LUT6,绿线是LUT6+MUX结构标题

这节课讲到这里也差不多结束了。相信很多人上大学时的与硬件描述语言或者EDA的第一堂实验课都是MUX。然而在那时,很多同学都是拿着老师的模板复制,粘贴,运行,烧录,灯亮起来。再然后,就没有然后了。当然也会有探索精神的同学会去理解地址码与数据输入的关系,但这是极少部分。所以在这里我必须吐槽下大学里的挺多实验课,很多老师都是只要求学生按着步骤做,得出结果就好,中间极少讲述其中原理。长期下来就会让很多同学就会认为上个实验课,就是按着操作说明书接接线,调调仪器,得出结果,最后写份报告而已。这种类型的实验课是有违高等教育的初衷的,本人希望后面会有所改善吧。同时,我也希望本科里的学生能够认真地去对待实验课,课程设计。毕竟这应该是大多数学生把课本所学的知识转换到实践当中为数不多的机会,只有在这些实验,课设中将所学知识消化了,吸收了,才能取得更大的进步。

我的公众号二维码,你的关注将会引来更多优质好文标题

FPGA从入门到精通(4) - MUX相关推荐

  1. FPGA从入门到精通(8)-BRAM

    所使用EDA软件:VIVADO2018.3 FPGA型号:xc7a35tcsg325-2 很久没写了,随便写一篇BRAM的吧.说到BRAM ,很多人都喜欢拿它来DRAM比较 ,两者都有啥优缺点,其实我 ...

  2. FPGA从入门到精通(2) - LUT

    LUT:(look up table) 查找表 今天我要讲的与FPGA CLB相关的第一节LUT.根据上一节课的课程大纲,讲CLB应该是讲SLICEL(SLICEM).不过当我打开用户手册,看了一下S ...

  3. FPGA从入门到精通(番外篇1)-AXI VIP的使用

    所使用EDA软件:VIVADO2018.3 FPGA型号:xc7a35tcsg325-2 注意:看懂这篇文章的某些概念可能需要一点点systemverilog的基础 在上一节中我大概讲了下有关BRAM ...

  4. python写cadance skill_《Cadence 16.6电路设计与仿真从入门到精通》——2.4 Design Entry CIS原理图图形界面...

    本节书摘来自异步社区<Cadence 16.6电路设计与仿真从入门到精通>一书中的第2章,第2.4节,作者: 王超 , 胡仁喜等 更多章节内容可以访问云栖社区"异步社区" ...

  5. 雷达通信 技术《相控阵入门到精通》 视频教程 代码 下载

    雷达通信 技术<相控阵入门到精通> 视频 代码 下载 01 电扫阵列_MATLAB建模与仿真(含全书源码) 02 相控阵天线的基础理论(含源码) 03 宽带阵列信号处理 04 无源和有源相 ...

  6. FFmpeg从入门到精通-云享读书会

    前言 FFmpeg是一款开源软件,用于生成处理多媒体数据的各类库和程序.FFmpeg可以转码.处理视频和图片(调整视频.图片大小,去噪等).打包.传输及播放视频.作为最受欢迎的视频和图像处理软件,它被 ...

  7. 安全多方计算从入门到精通:MPC简介JUGO平台

    安全多方计算从入门到精通:MPC简介&JUGO平台 转自:http://blog.51cto.com/13701316/2136084 简介:今天我们来介绍一下基于安全多方计算所设计出来的产品 ...

  8. 【带你上手云原生体系】第二部分:Go语言从入门到精通

    [带你上手云原生体系]第一部分:文章简介 及 云原生思维概览 [带你上手云原生体系]第二部分:Go语言从入门到精通 [带你上手云原生体系]第三部分:Docker从入门到精通 [带你上手云原生体系]第四 ...

  9. 4 FFmpeg从入门到精通-FFmpeg转码

    1 FFmpeg从入门到精通-FFmpeg简介 2 FFmpeg从入门到精通-FFmpeg工具使用基础 3 FFmpeg从入门到精通-FFmpeg转封装 4 FFmpeg从入门到精通-FFmpeg转码 ...

最新文章

  1. POJ 3469 Dual Core CPU (最小割建模)
  2. 爱情麻辣烫防骗子—骗子谎称学生出事让家长汇款
  3. outlook advanced find 快捷键不起作用
  4. 归纳推理测试没做完_朋友买了1斤紫菜,2年还没吃完,我教他这样做,2个月就吃完了...
  5. linux fedora14 u盘运行,Fedora Linux系统下挂载U盘和Windows盘
  6. python 切片_零基础学python_11_列表(切片+遍历切片+复制)
  7. elk错误:Too Many Requests
  8. 校验码的计算方法说明
  9. gensim实现TF-IDF和LDA模型、sklearn实现聚类
  10. 树莓派——CSI摄像头和USB摄像头的配置与调试
  11. 100m光纤测速多少正常_100m宽带wifi测速多少为正常
  12. unity 检测电脑摄像头_unity3d调用手机或电脑摄像头
  13. 脊髓空洞症先知先觉早期症状
  14. [原创]安全系列之端口敲门服务(Port Knocking for Ubuntu 14.04 Server)
  15. GIS定位和自定义图标
  16. Linux系统磁盘高级应用适合初学者
  17. 自定义组件使用el-dialog,且内含表单时,表单提交时字段报错undefined
  18. mp2格式怎么转换mp3?
  19. sprintf与snprintf区别
  20. 怎么将微博图片中的水印去掉

热门文章

  1. 在计算机技能大赛上的总结发言,我院在全省职业院校技能大赛工作总结交流会上作典型发言...
  2. 三菱四节传送带控制梯形图_三菱plc控制传送带三级 编程 fx2n 模拟四节传送带控制实验三菱...
  3. 十种免费网站访问分析工具
  4. 猜灯谜、送福字 广西高速“返乡路”上年味浓
  5. winows 10 下离线安装dapr
  6. java工具类怎么写_常用的Java工具类——十六种
  7. 【Linux】结合当前软件工程技术的背景,评价当前市面上流行的操作系统的局限性
  8. 大一初学c语言——程序设计基础
  9. 计算机审计终结与报告,审计个人总结范文
  10. 点击链接跳出微信下载app如何实现