登录站点

用户名

密码

关于FPGA设计的电路复用问题(转)

1已有 892 次阅读  2010-01-15 09:14   标签FPGA  复用  电路  设计 
   今天在群上,有人说到了电路复用的问题。现就按自己所看到所学到的写点见解。

    首先:整个verilog中是以module为编写基本单元的,module不宜过大,目标是实现一些基本功能即可,module的层次不宜太深,一般3-5层即可,给module划分层次原则:实现最基本功能的为底层module,然后中层是调用这些基本module,实现大的功能,最高层是系统级模块,统筹各大块之间端口连接,时序关系等。

   其次:是函数的一些概念:假设我们写一个函数供其他模块调用,软件上是很简单,只要写一个函数就可以供其他多个模块调用。但是到了实际电路中用处就不大,因为顺序调用函数对于电路来说就是电路块的复制,顺序多次调用就是多次复制电路,资源会成倍增加,不能达到电路复用的目的。

   接下来呢,该有个解决方法把:

首先是编程思想:Verilog不仅仅是编程,同时它是对电路的编程,所以就可以利用这两个特点,充分利用高级语言编程的思想和数字电路的知识,就会很大程度上帮助你。首先牢记,编写verilog依据的是时间轴,根据时间顺序确定各种信号何时进入你的电路,可以在编写时先把几个主流信号(即贯穿于整个系统的信号,比如数据流信号)用always写出来,这些信号就是你的基准,其他控制信号根据所处的位置在介入这些主流信号,分别用always模块写入。这样,这种时间轴顺序跟C的编程思想就一致,在编写这种顺序性信号时,带着C的思想,基本就容易的多。同时,verilog有个很重要的电路特点,就是在每一时刻,同时会有多个电路有信号(即在运行),这样就必须从传统的顺序语言中跳出来(跳出C的思想),然后进入数字电路的思想,即你的编程要时刻跟实际电路模型联系到一起,比如A<=B,C<=A,即可以想象成两个D触发器,其中C的输入就是A的输出,这样当时钟沿到来时,两个D触发器同时运行,B的值就给了A,而A的输出就给了C,不考虑电路延时,就可以认为二者在时间轴的同一时刻运行成功,A在此时刻的值为B,C在此时刻的值就是A前一时刻的值。这里只是举了简单的例子,但是时间轴的思路、高级语言编程思想和数字电路模型化思想以及这几个思想的转换对于编程来说帮助很大,帮你在编程时头脑时刻冷静,即使有很多信号,也会让你从全局把握整个电路,避免头脑一团糟。

其次就是复用思想了:复用对于硬件设计来说,尤为重要,在实现功能的前提下,电路比的就是主频和资源,而资源的减少思路就是复用。比如多次调用一个子函数A,如果直接写,在结构上就是这个子函数电路块A的复制,电路完成后就会看到你调用了几次A函数,你的结构中就有几个一模一样的A电路,当你的A电路本身资源很大,而且你调用的次数很多时,就很少有FPGA能装的下了。这当然跟我们的思想不符,我们只是想让整个电路中只有一块电路A,只不过把A电路在不同时刻用了几次而已,这时就要用到电路复用的思想。电路复用并不神秘,简单来讲,就是把控制端放在A电路两边,用计数器之类的东西,控制在时间轴的不同时刻把值写入A和从A输出端读取值。补充一点,对于电路的同步,计数器是一个很好的东西,因为本身计数器资源并不很大,用它来对于相差多个周期的信号进行同步,非常实用。但是,当信号相差的时间过于大,计数器的计数规模就变的不可接受,这时就要用到状态机划分状态的方法进行同步了。有了同步,复用就变得简单的多。

http://startup.eefocus.com/chudonganjin/blog/09-09/175775_f4d75.html#articletop

上一篇: Protel 99一些常用技巧【转】 下一篇: FPGA设计中的编程技巧

分享 举报

发表评论 评论 (1 个评论)

涂鸦板