首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
FPGA/CPLD可编程逻辑
» 小程序大道理---计数器与行波时钟
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
小程序大道理---计数器与行波时钟
发短消息
加为好友
yuchengze
当前离线
UID
1062083
帖子
5837
精华
0
积分
2921
阅读权限
70
在线时间
222 小时
注册时间
2016-6-30
最后登录
2018-9-9
金牌会员
UID
1062083
性别
男
1
#
打印
字体大小:
t
T
yuchengze
发表于 2017-2-22 11:47
|
只看该作者
小程序大道理---计数器与行波时钟
计数器
,
程序
之前写过一篇关于 “加法器” 的博文,研究了加法器的底层
电路
,本来想要研究一下“行波时钟”,由于涉及到计数器,那么就先看看 “计数器” 在
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视图
RTL 看看就行了,功能视图,不代表综合后的,差距还是很大很大滴 !
Technology Map Viewer
先不看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 放大既可以看到里边电路结构
这个电路模块在一个 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
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
数字电路
DSP技术
电源与功率管理
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议