verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx

上传人:b****2 文档编号:2156087 上传时间:2022-10-27 格式:DOCX 页数:11 大小:20.45KB
下载 相关 举报
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx_第1页
第1页 / 共11页
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx_第2页
第2页 / 共11页
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx_第3页
第3页 / 共11页
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx_第4页
第4页 / 共11页
verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx

《verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx》由会员分享,可在线阅读,更多相关《verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx(11页珍藏版)》请在冰豆网上搜索。

verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波.docx

verilog基本电路设计包括时钟域同步无缝切换异步fifo去抖滤波

Verilog基本电路设计(包括:

时钟域同步、无缝切换、异步FIFO、去抖滤波))

Verilog基本电路设计

共包括四部分:

单bit跨时钟域同步时钟无缝切换异步FIFO去抖滤波

Verilog基本电路设计之一:

单bit跨时钟域同步(帖子链接:

首先介绍异步信号的跨时钟域同步问题。

一般分为单bit的控制信号同步,以及多bit的数据信号同步。

多bit的信号同步会使用异步FIFO完成,而单bit的信号同步,又是时钟无缝切换电路以及异步FIFO电路的设计基础,这里先介绍单bit信号同步处理。

clka域下的信号signal_a,向异步的clkb域传递时,会产生亚稳态问题。

所有的亚稳态,归根结底就是setup/hold时间不满足导致。

在同一个时钟域下的信号,综合以及布线工具可以在data路径或者clock路径上插入buffer使得每一个DFF的setup/hold时间都满足;但是当signal_a在clkb域下使用时,由于clka与clkb异步,它们的相位关系不确定,那么在clkb的时钟沿到来时,无法确定signal_a此时是否处于稳定无变化状态,也即setup/hold时间无法确定,从而产生亚稳态。

这种异步信号在前后端流程里面是无法做时序分析的,也就是静态时序分析里常说的false_path。

消除亚稳态,就是采用多级DFF来采样来自另一个时钟域的信号,级数越多,同步过来的信号越稳定。

对于频率很高的设计,建议至少用三级DFF,而两级DFF同步则是所有异步信号处理的最基本要求。

单bit的信号跨时钟域同步,又分成电平信号同步以及脉冲信号同步。

电平信号,就是说clka下的信号signal_a在clkb看来,是一个很宽的信号,会保持多个clkb的时钟周期,一定能被clkb采到。

这种情况,只需要使用clkb用至少两级DFF连续抓signal_a即可,特别需要强调的是,此时signal_a必须是clka下的寄存器信号,如果signal_a是clka下的组合逻辑信号,一定要先在clka下用DFF抓一拍,再使用两级DFF向clkb传递。

这是因为clka下的组合逻辑信号会有毛刺,在clka下使用时会由setup/hold时间保证毛刺不会被clka采到,但由于异步相位不确定,组合逻辑的毛刺却极有可能被clkb采到。

电平信号的同步处理,一般用于知道确定的时钟频率大小关系或者极慢时钟下的信号向极快时钟域传递时使用,简单处理如下:

always@(posedgeclkbornegedgerst_n)begin

if(!

rst_n)begin

levl_b_d1

levl_b_d2

levl_b_d3

end

elsebegin

levl_b_d1

levl_b_d2

levl_b_d3

endendassignpuls_b_pos=levl_b_d2&(~levl_b_d3);assignpuls_b_neg=levl_b_d3&(~levl_b_d2);

assignlevl_b_out=levl_b_d2;

上面三个输出分别是经过同步之后,clkb下可以使用的0变1脉冲信号,1变0脉冲信号以及电平信号。

再次强调:

levl_a_in必须是clka的DFF信号!

下面是更常见的,clka下的脉冲信号,同步到clkb时钟域下,它对于clka与clkb的时钟频率关系没有任何限制,快到慢,慢到快都没问题。

其主要原理就是先把脉冲信号在clka下展宽,变成电平信号,再向clkb传递,当确认clkb已经“看见”信号同步过去之后,再清掉clka下的电平信号。

脉冲信号同步处理电路,有两个地方使用了上面的电平信号同步处理原则,请仔细揣摩原因。

详细见下面的RTL,其中省略了信号定义声明:

modulesync_pulse(

//input

rst_n,//systemreset

clka,//clockA

clkb,//clockB

puls_a_in,//pulseinputfromclka

//output

puls_b_out,//pulseoutputinclkb

levl_b_out//leveloutputinclkb

);parameterDLY=1;//always@(posedgeclkaornegedgerst_n)

begin

if(rst_n==1'b0)

signal_a

elseif(puls_a_in)

signal_a

elseif(signal_b1_a2)

signal_a

else;

endalways@(posedgeclkbornegedgerst_n)

begin

if(rst_n==1'b0)

signal_b

else

signal_b

endalways@(posedgeclkbornegedgerst_n)

begin

if(rst_n==1'b0)begin

signal_b_b1

signal_b_b2

end

elsebegin

signal_b_b1

signal_b_b2

end

endalways@(posedgeclkaornegedgerst_n)

begin

if(rst_n==1'b0)begin

signal_b1_a1

signal_b1_a2

end

elsebegin

signal_b1_a1

signal_b1_a2

end

endassignpuls_b_out=signal_b_b1&(~signal_b_b2);

assignlevl_b_out=signal_b_b1;endmodule

下一篇讲时钟切换电路。

留下一个思考题:

clka下的同一个寄存器信号signal_a,电平宽度对clkb而言足够长,如果同时调用两个相同的电平同步模块向clkb时钟传递,分别得到levl_b1和levl_b2,那么在clkb时钟域下看到的lev_b1和levl_b2信号是否一样?

这个问题是实际设计中一不小心就会犯错的,如果能够想明白正确回答这个问题,异步信号的理解就可以过关了。

Verilog基本电路设计之二:

时钟无缝切换(帖子链接:

写法很简单assignclk_o=sel_clkb?

clkb:

clka,当sel_clkb为1时选择clkb,否则选择clka。

不过在实际设计中,建议直接调用库里的MUX单元set_dont_touch,不要采用这里的assign写法,因为这种写法最后综合得到的可能不是MUX而是复杂组合逻辑,给前后端流程的时钟约束和分析带来不便。

无缝切换,就是切换时无毛刺时钟平稳过渡。

在时钟切换中,只要出现比clka或者clkb频率更高的窄脉冲,不论是窄的高电平还是窄的低电平,都叫时钟毛刺。

工作在切换后时钟clk_o下的电路模块,综合约束是在max{clka,clkb}频率下的,也就是说设计最后signoff的时候,只保证电路可以稳定工作的最高频率是max{clka,clkb},如果切换中出现更高频的时钟毛刺,电路可能出现无法预知的结果而出错。

无缝切换,一般用在处于工作状态的模块需要调频或者切换时钟源,比如内部系统总线,CPU等。

你刚用手机打完游戏后马上关屏听音乐,这两种场景中,CPU在满足性能前提下为了控制功耗,其工作频率会动态地从很高调至较低,此时就可能是在CPU一直处于工作状态下,通过无缝切换时钟源头实现的。

在无缝切换电路中,切换信号sel_clkb可以是任意时钟域下的信号,包括但不限于clka或者clkb域,但是sel_clkb必须是一个DFF输出信号;clka与clkb的频率大小相位关系可以任意。

无缝切换需要解决两个问题,一是异步切换信号的跨时钟域同步问题,这里需要使用《Verilog基本电路设计之一》里的同步电路原理消除亚稳态;二是同步好了的切换信号与时钟信号如何做逻辑,才能实现无毛刺。

下面写出无缝切换电路的主体部分,忽略了内部信号的定义声明等。

moduleclk_switch(

rst_n,

clka,

clkb,

sel_clkb,

clk_o

);

always@(posedgeclkaornegedgerst_n)

begin

if(!

rst_n)begin

sel_clka_d0

sel_clka_d1

end

elsebegin

sel_clka_d0

sel_clka_d1

end

end//part2

//always@(posedgeclka_nornegedgerst_n)

always@(posedgeclkaornegedgerst_n)

begin

if(!

rst_n)begin

sel_clka_dly1

sel_clka_dly2

sel_clka_dly3

end

elsebegin

sel_clka_dly1

sel_clka_dly2

sel_clka_dly3

end

end//part3

//always@(posedgeclkb_nornegedgerst_n)

always@(posedgeclkbornegedgerst_n)

begin

if(!

rst_n)begin

sel_clkb_d0

sel_clkb_d1

end

elsebegin

sel_clkb_d0

sel_clkb_d1

end

end//part4

//always@(posedgeclkb_nornegedgerst_n)

always@(posedgeclkbornegedgerst_n)

begin

if(!

rst_n)begin

sel_clkb_dly1

sel_clkb_dly2

sel_clkb_dly3

end

elsebegin

sel_clkb_dly1

sel_clkb_dly2

sel_clkb_dly3

end

end//part5

clk_gate_xxxclk_gate_a(.CP(clka),.EN(sel_clka_dly3),.Q(clk

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1