FPGA设计思想之“逻辑复制”
1、逻辑复制是一种通过增加面积来改善时序条件的优化手段,它最主要的应用时调整信号的扇出。如果某个信号需要驱动的后级逻辑信号较多,也就是其扇出非常大,那么为了增加这个信号的驱动能力,就必须插入很多级的Buffer,这样就在一定程度上增加了这个信号的路径延迟。
这种情况下就可以复制生成这个信号的逻辑,用多路同频同相的信号驱动后续电路,使平均到每路的扇出变低,这样不需要插入Buffer就能满足驱动能力增加的要求,从而节省路径延迟。
举一个例子:这个例子来自于特权同学《深入浅出玩转FPGA》
例一:未进行逻辑复制时:
module logic_copy(
input a,b,c,d,
input sel,
output dout
);assign dout = sel?(a + b):(c + d);endmodule
对应的RTL原理图为:
可见,占用了两个加法器和一个二选一的多路选择器;
例二:逻辑复制后:
module logic_copy(
input a,b,c,d,
input sel,
output dout
);
wire ab,cd;
assign ab = sel ? a : c;
assign cd = sel ? b : d;
assign dout = ab + cd;endmodule
可见,占用了两个选择器和一个加法器;
2、FPGA中需要做很多重复工作
下面内容来自于:FPGA中逻辑复制
在某些FPGA设计中,需要很多重复设计的时候,这时候逻辑复制也就有用了。
例如:在某个特殊应用场合需要设计方向可以任意改变的240位宽的三态IO管脚。我们先看看常用的一个位宽的三态管脚怎么设计。
module inout_interface(dat_in,io_out,io_dir,dat_out);input dat_in;input io_dir;output dat_out;inout io_out;assign io_out = io_dir ? dat_in : 1'bz;assign dat_out = io_out;endmodule
如上述程序所示为单个双向IO口的典型设计代码,中间由IO输入方向控制数据和高阻之间的切换,难题出现了,怎么设计240位宽的双向IO口呢?难道如下列程序所示:
module inout_interface(dat_in,io_out,io_dir,dat_out);input [239 : 0] dat_in;input [239 : 0] io_dir;output [239 : 0] dat_out;inout [239 : 0] io_out;assign io_out = io_dir ? dat_in : 240'bz;assign dat_out = io_out;endmodule
显然这样是不行的,因为当io_dir为240位的时候只有当全为0的时候此式才为假,其余时候都为真,显然达不到想要的每个IO都是双向口的设计。
修改代码如下:
module inout_interface(dat_in,io_out,io_dir,dat_out);input [239 : 0] dat_in;input [239 : 0] io_dir;output [239 : 0] dat_out;inout [239 : 0] io_out;assign io_out[0] = io_dir[0] ? dat_in[0] : 1'bz;assign dat_out[0] = io_out[0];assign io_out[1] = io_dir[1] ? dat_in[1] : 1'bz;assign dat_out[1] = io_out[1];assign io_out[2] = io_dir[2] ? dat_in[2] : 1'bz;assign dat_out[2] = io_out[2];.. // 此处略去1万行.assign io_out[239] = io_dir[239] ? dat_in[239] : 1'bz;assign dat_out[239] = io_out[239];endmodule
显然这种办法能实现240位宽的独立方向控制IO,但是估计写代码要累死人,有没得更好的办法呢?
当然有,在verilog2001中有个逻辑复制语法——generate,可以对verilog模块进行无限复制。有了这个模块我们即可轻松通过逻辑复制来达到我们的要求了。
// 单个双向IO实现模块module pin_inout(indat,indir,outdat,outdatin);input indat;input indir;inout outdat;output outdatin;assign outdat = indir ? indat : 1'bz;assign outdatin = outdat;endmodulemodule inout_interface(dat_in,io_out,io_dir,dat_out);input [239 : 0] dat_in;input [239 : 0] io_dir;output [239 : 0] dat_out;inout [239 : 0] io_out;// 逻辑复制240次genvar i;generatefor(i = 0; i < 240; i = i + 1)begin : pin_looppin_inout pin_inout_inst(.indat ( dat_in[i] ),.indir ( io_dir[i] ),.outdat ( io_out[i] ),.outdatin ( dat_out[i] ));endendgenerateendmodule
由上面代码可看出,巧妙利用verilog语法能减少自身工作量。
在FPGA设计中有些情况的逻辑复制不需要我们做,但是有些情况的逻辑复制不得不手工完成,因此,熟练掌握verilog语法是设计出好的模型、减少工作量的前提。
最后有关inout端口的处理,给出一篇链接,仅供参考!
verilog 中inout管脚的处理
FPGA设计思想之“逻辑复制”相关推荐
- FPGA设计思想与技巧(转载)
题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢.这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一 ...
- (13)FPGA设计思想
(13)FPGA设计思想 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA设计思想 5)结语 1.2 FPGA简介 FPGA(Field Programmable ...
- FPGA设计思想与技巧
1.1 FPGA设计思想与技巧 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA设计思想与技巧: 5)结束语. 1.1.2 本节引言 "不积跬步,无以至 ...
- FPGA设计思想与技巧之串并转换和流水线操作
本系列讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工 ...
- 冯诺依曼计算机的设计思路和逻辑组成是什么,冯 诺依曼计算机的设计思想和逻辑组成是什么...
设计思想:用二进制来代表计算机中的数据及逻辑表示. 逻辑组成:运算器,控制器,存储器,输入和输入设备. 冯.诺依曼计算机的工作原理,"存储程序控制"原理的基本内容: 1.采用二进制 ...
- 06-BCD计数器设计与应用——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的:1.掌握BCD码的原理.分类以及优缺点 2.设计一个多位的8421码计数器并进行验证 3.学会基本的错误定位以及修改能力 实验平台:无 实验原理: BCD码(B ...
- 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档...
芯航线--普利斯队长精心奉献 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: 阻塞赋值,操作符为"=","阻塞"是指在进程语句(initia ...
- FPGA开发经验谈-FPGA 设计的四种常用思想与技巧(二)
串并转换设计技巧 串并转换是 FPGA 设计的一个重要技巧,它是数据流处理的常用手段,也是面积与速度互换思想的直接体现.串并转换的实现方法多种多样,根据数据的排序和数量的要求,可以选用 寄存器. RA ...
- FPGA重要设计思想
FPGA重要设计思想 1.速度和面积互换原则.以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作. 3.串/并转换的思想. 高速数据处理的重要技巧之一.这里 ...
最新文章
- BCH升级新版本,实不相瞒该抄底了
- linux 强制刷新文件,vim 如何刷新或重载reload 已打开的文件
- Could not find artifact com.sun:tools:jar:1.5.0 解决办法
- 完美解决你使用eclipse编辑jsp、js文件时,经常出现卡死的问题
- 说一说阿里云弹性公网IP那些事
- js 函数实参列表arguments和形参的那点事儿
- End-to-end目标检测算法的学习笔记
- openssl加解密原理
- 货币代码(ISO 4217)
- 新西兰梅西大学有计算机专业吗,新西兰梅西大学世界排名|怎么样|入学条件_海外院校库-柳橙网...
- Error message: Make sure that `gem install pg -v '0.18.3'` succeeds before bundling
- PHP经典实例读书笔记--变量
- 怎么退出自适应巡航_什么是ACC自适应巡航
- 台式电脑有哪些零件组成 台式电脑主件的形象解释
- maven 3.6.1版本下载地址
- iOS之POP动画使用和实战
- 半次元cos图片爬虫
- 域控制器丢失NETLOGON目录的解决办法
- 信息记录拉取失败_个税明细申报常见失败提示信息应对方法
- MQTT——EMQX学习笔记01——EMQX安装使用
热门文章
- 第十九章 19 利用私有继承来实现代码重用
- 2012年4月当选微软MVP的CSDN会员名单揭晓!
- FreeBSD学习笔记25-安装DHCP服务
- python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
- HTML5圆形线性渐变,css中linear-gradient()函数是干什么的?实现线性渐变的圆形边框(代码)...
- python能够处理的最大整数是多少_python中能输出的最大整数位是多少
- 横州中学理科2021高考成绩查询,2021年横县高考状元名单资料,今年横县高考状元多少分...
- linux脚本发送udp,基于shell脚本实现UDP端口探测
- 计算机导论第一章试题及答案,计算机导论第一章测试题
- 无盘服务器2个dhcp,无盘 dhcp 服务器配置