文章目录

  • 用选择器实现总线
  • 用三态门实现总线

用选择器实现总线

用选择器的思想来实现总线:总线从宏观上看是“多写多读”的,但是从微观上来看是“一写多读”,因为系统中的各个部件只能分时使用总线,而无法同时使用。也就是在某一固定时刻,总线是“一写多读”的,只不过通过一写控制电路,我们貌似可以在不同时刻为总线分配不同的驱动源,以达到宏观上的“多写多读”。

下面用FPGA来简单地实现总线:

利用多路选择器的选通特性,可以实现总线的功能,这也是FPGA芯片内部设计总线时最常用的方法,因为FPGA芯片内部有些非常丰富的MUX资源。

原理就是通过MUX的选通特性,通过改变选通信号的值来改变写入总线数据的来源。

module Bus(input request0,input request1,input request2,input request3,input [7:0] device0Out,input [7:0] device1Out,input [7:0] device2Out,input [7:0] device3Out,output [7:0] device0In,output [7:0] device1In,output [7:0] device2In,output [7:0] device3In);reg [1:0] sel;reg [7:0] bus;//generate selalways@(request0,request1,request2,request3)begin//Priority decodercase({request0,request1,request2,request3})4'b0001: sel = 2'b11;4'b0010 - 4'b0011: sel = 2'b10;4'b0100 - 4'b0111: sel = 2'b01;default: sel = 2'b00;endcaseend//write busalways@(sel,device0Out,device1Out,device2Out,device3Out)begincase(sel)2'b00: bus = device0Out;2'b01: bus = device1Out;2'b10: bus = device2Out;2'b11: bus = device3Out;default: bus = device0Out;endcaseend//read busassign device0In = bus;assign device1In = bus;assign device2In = bus;assign device3In = bus;
endmodule

使用liberoSoc综合之后的Technology Schematic map如下:
MicroSemi芯片内部通过大量选择器实现该总线。

用三态门实现总线

三态门(Three-state gate)是一种重要的总线接口电路。

三态指其输出既可以是一般二值逻辑电路,即正常的高电平(逻辑1)或低电平(逻辑0),又可以保持特有的高阻抗状态。高阻态相当于隔断状态(电阻很大,相当于开路)。

高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定。

处于高阻抗状态时,输出电阻很大,相当于开路,没有任何逻辑控制功能。高阻态的意义在于实际电路中不可能断开电路。三态电路的输出逻辑状态的控制,是通过一个输入引脚实现的。

三态门都有一个EN控制使能端,来控制门电路的通断。 可以具备这三种状态的器件就叫做三态器件。当EN有效时,三态电路呈现正常的“0”或“1”的输出;当EN无效时,三态电路给出高阻态输出。

三态门的高阻特性,实际上就是为这里利用这个特性做准备的。

两种总线(选择器实现和三态门实现)的实现方式类似,也就是二者的硬件描述都是分为三个部分:

1、选择器控制信号产生部分,采用抢占式优先级译码器(【 FPGA 】抢占式优先级译码器电路)的思路,根据四个外围器件的请求信号产生多路选择器的选择控制信号。

2、写总线部分,即将四个三态门的输出连接到总线上。

3、读总线部分,各个外围器件根据自己的情况将总线数据读入器件内部进行运算和处理。

下面讲讲三态门的东西:

利用三态门的高阻特性,可以实现总线的功能。由于三态门资源大多存在于FPGA芯片的接口资源中而非FPGA内部,因此一般当总线位于FPGA芯片外部时,常采用这种方式。

再讲讲代码中的赋值冲突问题:

下面的代码是错误的,存在赋值冲突:

assign c = (sel[0] == 1'b1) ? a:1'b0;
assign c = (sel[1] == 1'b1) ? b:1'b1;

这个例子代码,两条赋值语句肯定都是一直有效的,因此必然产生赋值冲突,从而导致出错。下面的代码就是对的:

assign c = (sel[0] == 1'b1) ? a:1'bz;
assign c = (sel[1] == 1'b1) ? b:1'bz;

这个代码的写法和上面的唯一区别就是高组态的使用,为什么使用了高阻态,代码就是正确的了呢?

这是因为高阻态实际上就是电路中的断路,通过合理切换到高阻态,可以让上述有高阻态的例子中的两条赋值语句不会在同一时刻生效,因此不会产生赋值冲突。

下面给出三态门实现总线的代码:

module Bus_Three(input request0,input request1,input request2,input request3,input [7:0] device0Out,input [7:0] device1Out,input [7:0] device2Out,input [7:0] device3Out,output [7:0] device0In,output [7:0] device1In,output [7:0] device2In,output [7:0] device3In);reg [3:0] en;wire [7:0] bus;//generate selalways@(request0,request1,request2,request3)begincase({request0,request1,request2,request3})4'b0000: en = 4'b0000;4'b0001: en = 4'b1000;     // the most high bit of en is available when request3 is high4'b0010-4'b0011: en = 4'b0100;  // the second bit of en is available when request2 is high 4'b0100-4'b0111: en = 4'b0010;  // the first bit of en is available when request1 is high default: en = 4'b0001;  // the zero bit of en is available when request0 is high endcaseend//write busassign bus = (en[0] == 1'b1) ? device0Out:8'hzz;assign bus = (en[1] == 1'b1) ? device1Out:8'hzz;assign bus = (en[2] == 1'b1) ? device2Out:8'hzz;assign bus = (en[3] == 1'b1) ? device3Out:8'hzz;//read bus assign device0In = bus;assign device1In = bus;assign device2In = bus;assign device3In = bus;
endmodule

综合后的视图和选择器实现的总线视图基本一样:
————————————————
版权声明:本文为CSDN博主「李锐博恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Reborn_Lee/article/details/83753290

FPGA总线实现形式相关推荐

  1. 【 FPGA 】总线实现形式之三态门

    上篇博文讲了三态门:https://blog.csdn.net/Reborn_Lee/article/details/83753290 姊妹篇:[ FPGA ]总线实现形式之选择器 三态门的高阻特性, ...

  2. 【 FPGA 】总线实现形式之选择器

    用选择器的思想来实现总线: 总线从宏观上看是"多写多读"的,但是从微观上来看是"一写多读",因为系统中的各个部件只能分时使用总线,而无法同时使用.也就是在某一固 ...

  3. LIN总线uart形式实现lin通信

    LIN是Local Interconnect Network的缩写,是基于UART/SCI(Universal Asynchronous Receiver-Transmitter/Serial Com ...

  4. 【乌拉喵.教程】IIC总线介绍及FPGA编程

    最近将多年来收集到的教学视频.国内外图书.源码等整理整合拿出来,涉及arm.Linux.python.信号完整性.FPFA.DSP.算法.stm32.单片机.制图.电子模块.kali.出版社图书等.资 ...

  5. FPGA之道(45)正确的变量访问思路

    文章目录 前言 正确的变量访问思路 变量访问思路概述 访问思路简述 写变量注意事项 读变量注意事项 赋值冲突 两个以上并行语句赋值冲突 两个以上串行语句赋值冲突 组合并行语句内串行语句的赋值冲突 时序 ...

  6. 【 FPGA 】抢占式优先级译码器电路

    今天看用选择器实现总线设计的程序中([ FPGA ]总线实现形式之选择器),选择器控制信号部分用到了抢占式优先级译码器,这里单独把这个抢先式优先级译码器抽出来讲讲看: 高位优先,下面是Verilog ...

  7. 紫光同创国产FPGA学习之Fabric Inserter

    这一篇文章也是从紫光同创那边拷贝过来的.这个是在线逻辑分析仪调试,和xilinx的也差不多,所以,基本看过就能用了.具体有什么新的功能添加.我就不知道了.我看看,如果有特别的就在用另外的文章写了. 一 ...

  8. 实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计

    实验三 基于FPGA的数码管动态扫描电路设计 源文件的链接放在最后啦 实验目的: (1) 熟悉7段数码管显示译码电路的设计. (2) 掌握数码管显示原理及静态.动态扫描电路的设计. 实验任务: (1) ...

  9. 片上总线Wishbone 学习—— 转载请注明出处:http://blog.csdn.net/ce123

    片上总线Wishbone 学习(零)前言 声明:版权所有,欢迎转载! 转载请注明出处:http://blog.csdn.net/ce123 为了更加升入的理解片上系统,比如S3C2440等,今天开始学 ...

最新文章

  1. ORB_SLAM2代码阅读(5)——Bundle Adjustment
  2. Mybatis缓存配置
  3. 判断form表单里面的元素属性是否有数据_html form标签的action属性是什么意思?又有哪些用法?(附实例)...
  4. “抗疫”新战术:世卫组织联合IBM、甲骨文、微软构建了一个开放数据的区块链项目!...
  5. C语言头文件#includestdlib.h的作用
  6. totalspider爬虫批量重启报错Connection Error
  7. python免费教程视频-Python免费视频教程
  8. python参考手册下载_python3.8.4官方中文文档 API手册 PDF 高质量版
  9. 探索性测试的分类与测试用例
  10. MAC在window下禁用触摸板
  11. 【ASP.NET】第十课——网站的配制与部署
  12. CentOS 7查看源代码
  13. GitHub爆火 金九银十巨作:拼多多/蚂蚁/百度面经分享
  14. clappr:可扩展网页媒体播放器使用(在vue中的使用)
  15. 葡聚糖修饰金纳米颗粒(Dex-AuNps)|聚环氧氯丙烷二甲胺修饰多孔磁性葡聚糖微球
  16. 5 JMeter断言-Jmeter响应中出现乱码时
  17. 网易云音乐网络问题修复 (加载失败)
  18. HashMap是什么
  19. HTML选中时闪动效果代码,JS实现点击文字对应DIV层不停闪动效果的方法
  20. 广域网优化技术领跑IT投资

热门文章

  1. python 数据处理 姿态角数据解算
  2. 数学定理百科——黑洞数
  3. Java开发的船体程序 超级玛丽小游戏 411 功能非常齐全 完整源码
  4. 学习Java有什么好的方法?怎么学习更高效?
  5. 如何完美适配iPhone4、5、6尺寸和字体问题
  6. python怎么计算圆_python计算圆心
  7. latex 因为所以,编号序号:圈1,圈一,公式编号(式子序号$\tag{}$)
  8. 【博应用官网】手机中的飞行模式如何开启?有什么作用呢?
  9. BCELoss计算原理 使用latex语法
  10. 通过js修改网页内容