原创 [博客大赛]小程序大道理---计数器与行波时钟

2014-3-21 15:18 2249 13 15 分类: FPGA/CPLD 文集: FPGA

之前写过一篇关于 “加法器” 的博文,研究了加法器的底层电路,本来想要研究一下“行波时钟”,由于涉及到计数器,那么就先看看 “计数器” 在FPGA中综合后是什么样的 ?然后再看“行波时钟”的情况 ?

 

1、如下 简单的不能再简单的程序

module top( clk,clk_out);
input  clk;
output reg clk_out;

reg [2:0] cnt;
always@(posedge clk)
if(cnt==3'd4)
 begin
  cnt<=3'd0;
  clk_out<=~clk_out;
 end
else cnt<=3'd1+cnt;

endmodule

RTL视图

20140318170455540.jpg

RTL 看看就行了,功能视图,不代表综合后的,差距还是很大很大滴 !

Technology Map Viewer

20140318170727254.jpg

先不看clk_out,只关注 cnt 计数器。计数器和加法器的电路结构还是很不一样的 !

cnt 输入 输出 真值表

       输入                    输出

cnt[2] cnt[1] cnt[0]     cnt[2] cnt[1] cnt[0]

   0     0      0          0      0      1

   0     0      1          0      1      0

   0     1      0          0      1      1

   0     1      1          1      0      0

   1     0      0          0      0      0

   1     0      1          1      1      0

   1     1      0          1      1      1

   1     1      1          0      0      0

 

写成逻辑函数 cnt[2]=cnt[2]'cnt[1]cnt[0]+cnt[2]cnt[1]'cnt[0]+cnt[2]cnt[1]cnt[0]'

      =(cnt[2]$cnt[1])cnt[0]+cnt[2]cnt[1]cnt[0]' 

 注意: $代表异或;化简的方法 公式法和卡诺图法

对应的 cnt[2] 综合后的电路如下,上边cnt~2 放大既可以看到里边电路结构

20140318172205284.jpg

这个电路模块在一个 LUT 中实现,LUT 实现这个电路是用 查找表SRAM 的方式!

cnt[1] 和cnt[0] 同样的道理(略) ;

到这里,不得不感慨 综合器的强大,把行为级的verilog描述转换成了电路 !省去了

真值表---逻辑函数---化简---电路 这一复杂的过程 !

也看到了计数器和加法器(串行进位加法器)是完全不同的电路结构 !

2、说说“行波时钟”

 上边的 clk_out 就是一个“行波时钟”,其他时序逻辑产生 一个时钟clk_out

 clk_out这个触发器(寄存器)再作为时钟源,驱动其他电路模块触发器的时钟接入端。

 这不是一个太好的方式,当然相比于组合逻辑产生的“门控时钟”,这个时钟还是很不  错的 。“行波时钟”有延时的弊端,延时不好控制,到源寄存器和目的寄存器延时都不同,容易出现时序问题,而且驱动能力不强,毕竟不是全局时钟网路 !

如果就是需要通过计数分频产生一个时钟,怎么办 ??

“时钟使能”方式,通过修改"行波时钟"的生成逻辑,在“行波时钟”的上升沿(或下降沿)产生宽度为一个“基时钟”周期的正脉冲,把这个脉冲信号作为后级触发器的时钟使能信 号,用“基时钟”代替“行波时钟”作为后级触发器的时钟输入信号,从而把原本由“行波时钟”驱动的后级逻辑转换为由“基时钟”驱动,并采用新生成的时钟使 能信号来产生与“行波时钟”边沿对应的时序控制。这样一来,原本由两个时钟驱动的复杂同步电路(“行波时钟”方案并不能看作异步时钟方案)就转化为了由同一个“基时钟”驱动的简单同步电路。(此段转自riple的博文)

例如:

module top( clk,dataout);
input clk;
output  reg [3:0]dataout;

wire en;
reg [2:0] cnt;
always@(posedge clk)
if(cnt==3'd4)
 begin
  cnt<=3'd0;
 end
else cnt<=3'd1+cnt;

assign en=(cnt==3'd4);

always@(posedge clk )
if(en)
begin dataout<=dataout+4'd1; end

endmodule

 

 

文章评论2条评论)

登录后参与讨论

用户1532399 2014-3-30 07:16

谢谢分享。。。。。。。。。。。。。。

用户209218 2014-3-29 23:32

原来是verilog语言啊
相关推荐阅读
pengchengcheng082_593158939 2015-08-21 16:26
Linux 下 的 vi 编辑器
一、按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :q 不保存文件,退出vi :wq 保存文件并退出vi :q! 不保存文件,强制退出vi :w! 强制保存,不推出...
pengchengcheng082_593158939 2015-07-28 15:57
面向对象和面向过程区别
转自 http://blog.sina.com.cn/s/blog_4dd5955301000a2m.html     面向对象和面向过程的区别,实在是难用一两句话说明白。   ...
pengchengcheng082_593158939 2015-05-23 10:39
后仿真能否被形式验证(Formal Verification)和静态时序分析(Static Timing Analysis)所取代
转自 http://www.cnblogs.com/jyaray/archive/2011/04/26/2029856.html 验证的主要目的:就是检查时间模型是否满足时间要求,是否实现了时...
pengchengcheng082_593158939 2015-05-19 11:18
两种代码方式
下面的两段程序等价,RTL图以及综合后的结果 完全一样。看似简单,其实是两种不同的思维方式。在复杂电路中能体现出两种方式各自的特点,第一种容易理解,第二种则结构更清晰,更接近综合后的结果。以前习惯用上...
pengchengcheng082_593158939 2015-05-14 16:28
Linux 下 的 cc 和 gcc
转自 http://www.cnblogs.com/zhouyinhui/archive/2010/02/01/1661078.html   在Linux下一会看到cc,另一会又看到gcc...
pengchengcheng082_593158939 2015-05-13 17:19
mips 编译器
1、linux 系统下编程的编译器 GNU toolchain(GNU工具链)是一个包含了由GNU项目所产生的各种编程工具的集合。这些工具形成了一条工具链,用于开发应用程序和操作系统。  ...
我要评论
2
13
关闭 站长推荐上一条 /2 下一条