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设计思想之“逻辑复制”相关推荐

  1. FPGA设计思想与技巧(转载)

    题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢.这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一 ...

  2. (13)FPGA设计思想

    (13)FPGA设计思想 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA设计思想 5)结语 1.2 FPGA简介 FPGA(Field Programmable ...

  3. FPGA设计思想与技巧

    1.1 FPGA设计思想与技巧 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA设计思想与技巧: 5)结束语. 1.1.2 本节引言 "不积跬步,无以至 ...

  4. FPGA设计思想与技巧之串并转换和流水线操作

    本系列讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工 ...

  5. 冯诺依曼计算机的设计思路和逻辑组成是什么,冯 诺依曼计算机的设计思想和逻辑组成是什么...

    设计思想:用二进制来代表计算机中的数据及逻辑表示. 逻辑组成:运算器,控制器,存储器,输入和输入设备. 冯.诺依曼计算机的工作原理,"存储程序控制"原理的基本内容: 1.采用二进制 ...

  6. 06-BCD计数器设计与应用——小梅哥FPGA设计思想与验证方法视频教程配套文档

    芯航线--普利斯队长精心奉献 实验目的:1.掌握BCD码的原理.分类以及优缺点 2.设计一个多位的8421码计数器并进行验证 3.学会基本的错误定位以及修改能力 实验平台:无 实验原理: BCD码(B ...

  7. 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档...

    芯航线--普利斯队长精心奉献 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: 阻塞赋值,操作符为"=","阻塞"是指在进程语句(initia ...

  8. FPGA开发经验谈-FPGA 设计的四种常用思想与技巧(二)

    串并转换设计技巧 串并转换是 FPGA 设计的一个重要技巧,它是数据流处理的常用手段,也是面积与速度互换思想的直接体现.串并转换的实现方法多种多样,根据数据的排序和数量的要求,可以选用 寄存器. RA ...

  9. FPGA重要设计思想

    FPGA重要设计思想 1.速度和面积互换原则.以面积换速度可以实现很高的数据吞吐率,其实串/并转换.就是一种以面积换速度的思想 2.乒乓操作. 3.串/并转换的思想. 高速数据处理的重要技巧之一.这里 ...

最新文章

  1. BCH升级新版本,实不相瞒该抄底了
  2. linux 强制刷新文件,vim 如何刷新或重载reload 已打开的文件
  3. Could not find artifact com.sun:tools:jar:1.5.0 解决办法
  4. 完美解决你使用eclipse编辑jsp、js文件时,经常出现卡死的问题
  5. 说一说阿里云弹性公网IP那些事
  6. js 函数实参列表arguments和形参的那点事儿
  7. End-to-end目标检测算法的学习笔记
  8. openssl加解密原理
  9. 货币代码(ISO 4217)
  10. 新西兰梅西大学有计算机专业吗,新西兰梅西大学世界排名|怎么样|入学条件_海外院校库-柳橙网...
  11. Error message: Make sure that `gem install pg -v '0.18.3'` succeeds before bundling
  12. PHP经典实例读书笔记--变量
  13. 怎么退出自适应巡航_什么是ACC自适应巡航
  14. 台式电脑有哪些零件组成 台式电脑主件的形象解释
  15. maven 3.6.1版本下载地址
  16. iOS之POP动画使用和实战
  17. 半次元cos图片爬虫
  18. 域控制器丢失NETLOGON目录的解决办法
  19. 信息记录拉取失败_个税明细申报常见失败提示信息应对方法
  20. MQTT——EMQX学习笔记01——EMQX安装使用

热门文章

  1. 第十九章 19 利用私有继承来实现代码重用
  2. 2012年4月当选微软MVP的CSDN会员名单揭晓!
  3. FreeBSD学习笔记25-安装DHCP服务
  4. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
  5. HTML5圆形线性渐变,css中linear-gradient()函数是干什么的?实现线性渐变的圆形边框(代码)...
  6. python能够处理的最大整数是多少_python中能输出的最大整数位是多少
  7. 横州中学理科2021高考成绩查询,2021年横县高考状元名单资料,今年横县高考状元多少分...
  8. linux脚本发送udp,基于shell脚本实现UDP端口探测
  9. 计算机导论第一章试题及答案,计算机导论第一章测试题
  10. 无盘服务器2个dhcp,无盘 dhcp 服务器配置