本文转自:http://www.cnblogs.com/linjie-swust/archive/2012/03/27/FPGA_verilog.html

 在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语法是设计出好的模型、减少工作量的前提。


made by qidaiYMM, your comment is appreciated.

email:1519882610@qq.com

verilog逻辑复制的更多相关文章

  1. FPGA中逻辑复制

    copy from http://www.cnblogs.com/linjie-swust/archive/2012/03/27/FPGA_verilog.html 在FPGA设计中经常使用到逻辑复制 ...

  2. PostgreSQL逻辑复制之slony篇

    Slony是PostgreSQL领域中最广泛的复制解决方案之一.它不仅是最古老的复制实现之一,它也是一个拥有最广泛的外部工具支持的工具,比如pgAdmin3.多年来,Slony是在PostgreSQL ...

  3. PostgreSQL逻辑复制槽

    Schema | Name | Result data type | Argument data types | Type ------------+------------------------- ...

  4. PostgreSQL逻辑复制使用记录

    之前逻辑复制刚刚出来的时候就使用过,但是没有进行整理,这次一个项目需要逻辑复制的自动迁移,再次拾起逻辑复制. 在此之前有两个疑问: 1)同一个表,既有流复制,又有逻辑复制,这样数据会有两份吗? --不 ...

  5. PostgreSQL逻辑复制之pglogical篇

    PostgreSQL逻辑复制之slony篇 一.pglogical介绍 pglogical 是 PostgreSQL 的拓展模块, 为 PostgreSQL 数据库提供了逻辑流复制发布和订阅的功能. ...

  6. postgresql从库搭建--逻辑复制

    1 物理复制及逻辑复制对比 前文做了PostgreSQL物理复制的部署,其有如下主要优点 物理层面完全一致,是主要的复制方式,其类似于Oracle的DG 延迟低,事务执行过程中产生REDO recor ...

  7. 跨 PostgreSQL 大版本复制怎么做?| 逻辑复制

    当需要升级PostgreSQL时,可以使用多种方法.为了避免应用程序停机,不是所有升级postgres的方法都适合,如果避免停机是必须的,那么可以考虑使用复制作为升级方法,并且根据方案,可以选择使用逻 ...

  8. PostgreSQL逻辑复制解密

    在数字化时代的今天,我们都认同数据会创造价值.为了最大化数据的价值,我们不停的建立着数据迁移的管道,从同构到异构,从关系型到非关系型,从云下到云上,从数仓到数据湖,试图在各种场景挖掘数据的价值.而在这 ...

  9. Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务

    本文主要介绍 Windows 环境下搭建 PostgreSQL 的主从逻辑复制,关于 PostgreSQl 的相关运维文章,网络上大多都是 Linux 环境下的操作,鲜有在 Windows 环境下配置 ...

随机推荐

  1. SVN管理规范

    命名规范 tags 正式版 REL-X.X.X branches 发版前 RB-X.X.X 新功能 TRY-XXX 修BUG BUG-XXXX trunk 开发 使用注意事项 负责而谨慎地提交自己的代 ...

  2. ASP.NET中后台注册js脚本攻略(转)

    用Page.ClientScript.RegisterClientScriptBlock 和Page.ClientScript.RegisterStartupScript:区别:   1.使用Page ...

  3. 为什么用服务不用线程-Android

    1.什么是Service? A Service is an application component representing either an application's desire to p ...

  4. node.js安装方法总结

    为了保持一致,这里也列举三个方法 第一个方法:通过官网下载安装 https://nodejs.org/en/download/ 这种方式的问题是我们需要自己去找网页,找到链接,然后下载 第二个方法:使 ...

  5. Mysql按时间段分组查询来统计会员的个数

    1.使用case when方法(不建议使用)-  代码如下 复制代码 SELECT    COUNT(DISTINCT user_id) user_count,    CASE    WHEN cre ...

  6. Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)

    抽象工厂模式 理解了工厂方法模式,其实抽象工厂和工厂方法模式有很多的相似之处.抽象工厂同样是分离客户端对象的创建和逻辑代码的,但是抽象工厂往往是产生一组数据而不单单是产生一个产品. 抽象工厂提供一个创 ...

  7. 解决IE6下固定定位问题 使用position:fixed

    IE6浏览器有太多的bug让制作网页的人头疼.这篇文章介绍的是介绍的是如何解决IE6不支持position:fixed;属性的办法. 如果我们需要做某个元素始终位于浏览器的底部,不会因为浏览器窗口的缩 ...

  8. tomcat的OutOfMemoryError(PermGen space)解决方法

    修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: set J ...

  9. 【leetcode】367. Valid Perfect Square

    题目描述: Given a positive integer num, write a function which returns True if num is a perfect square e ...

  10. bzoj 1006: [HNOI2008]神奇的国度

    这是个标准的弦图,但如果不知道弦图就惨了=_= 趁着这个机会了解了一下弦图,主要就是完美消除序列,求出了这个就可以根据序列进行贪心染色. 貌似这个序列很神,但是具体应用不了解…… 这道题为什么可以这么 ...