FPGA设计中逻辑复制的使用

时间:2025-11-01  作者:Diven  阅读:0

在FPGA设计中经常使用到逻辑复制,逻辑复制也用在很多场合。

FPGA设计中逻辑复制的使用

1.    信号驱动级数非常大,扇出很大,需要增加驱动力

逻辑复制最常使用的场合时调整信号的扇出。如果某个信号需要驱动后级很多单元,此时该信号的扇出非常大,那么为了增加这个信号的驱动能力,办法就是插入多级Buffer,但是这样虽然能增加驱动能力,但是也增加了这个信号的路径延时。

为了避免这种情况这时可以复制生成这个信号的逻辑,用多路同频同相的信号驱动后续电路,使平均到每路的扇出变低,这样不需要插入Buffer就能满足驱动能力增加的要求,从而节约该信号的路径延时。如从图1.1到图1.2转变所示。                                                                  
                                 
 图1.1  逻辑复制前

                               

                             图1.2  逻辑复制后

由于现在综合器都已经非常智能,此种场合的逻辑复制工作大多由综合器完成,不需要人手动调整。各大FPGA厂商的综合器以及第三方综合器都有这种功能。

2.    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; endmodule 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; // 逻辑复制240次 genvar i; generate for(i = 0; i < 240; i = i + 1) begin : pin_loop pin_inout pin_inout_inst( .indat ( dat_in[i] ), .indir ( io_dir[i] ), .outdat ( io_out[i] ), .outdatin ( dat_out[i] ) ); end endgenerate endmodule

由上面代码可看出,巧妙利用verilog语法能减少自身工作量。

3.   

在FPGA设计中有些情况的逻辑复制不需要我们做,但是有些情况的逻辑复制不得不手工完成,熟练掌握verilog语法是设计出好的模型、减少工作量的前提。

审核编辑:汤梓红

 

猜您喜欢

红光激光笔是小型便携的激光设备,通常用于演示、教学、会议等场合。利用红色激光光束发射出清晰可见的光点,能够有效吸引观众的注意力。红光激光笔的工作原理是通过激光二...
2018-12-30 00:00:00

PTC热敏电阻作为重要的过流保护元件,受到了关注。作为全球知名的电子元器件制造商,泰科电子(TE Connectivity)在PTC热敏电阻领域拥有丰富的产品线...
2012-07-29 03:31:30

双电源转换开关是用于保障电力供应安全的重要设备,应用于工业、商业和家庭等场所。根据不同的功能和结构,双电源转换开关可以分为以下几类。按照操作方式可分为手动和自动...
2011-04-04 00:00:00

视频电缆是现代影音设备中不可少的重要组成部分,其中DVI(数字视频接口)和HDMI(高清多媒体接口)是最常见的两种类型。DVI电缆主要用于连接电脑和显示器,支持...
2008-12-15 00:00:00

电阻作为电子元器件中不可少的重要组成部分,其性能和品质直接影响着整个电子设备的稳定性和可靠性。VISHAY(威世)作为全球知名的电子元件制造商,其金属膜电阻以高...
2024-07-05 05:25:09

随着电子产品的不断小型化和高性能化,0603封装的电阻因其体积小、性能稳定而被应用于各种电路设计中。在设计电路时,了解0603电阻的最大功率参数对于保证电路的安...
2025-11-01 04:31:16

TnTAI保险丝很好的性能和可靠性赢得了认可。市场上存在的多个品牌,在产品质量、应用范围及价格等方面存在差异。本文将详细探讨TnTAI保险丝的不同品牌之间的区别...
2024-05-16 03:17:30

贴片电阻上的250通常代表阻值为25欧姆。贴片电阻的阻值通常用三位数字表示,前两位数字是有效数字,第三位数字是乘数,表示10的几次方。以250为例:前两位数字2...
2024-11-29 10:26:00

线性稳压器基础知识线性稳压器是一种电子电路,用于将变化的直流电压转换为稳定的直流电压输出。在各种电子设备中很重要,例如手机、电脑和医疗设备,因为确保了这些设备的...
2024-09-15 00:00:00

高度尺是精密测量工具,应用于多个领域。在机械制造行业,高度尺用于测量工件的高度和尺寸,确保产品的精度和一致性。在建筑工程中,高度尺帮助工程师和施工人员准确测量建...
2008-09-15 00:00:00