在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 96|回复: 4

[讨论] 生成半个时钟周期的脉冲的几种方法

[复制链接]
发表于 昨天 15:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 Patrick0809 于 2025-5-19 15:41 编辑

如题,如下图时序

                               
登录/注册后可看大图



目前能想到的方法有:
1、时钟倍频,生成一个基于cki的2倍频时钟,在该时钟域下使用计数器生成脉冲。(但是这种生成一个更高频率的时钟,是不是会增加动态功耗,虽然我们功耗不是问题,但是精益求精嘛)

2、双边沿触发器,当然@(posedge clk or negedge clk)这种写法是违规的,查找帖子发现两种实现:(帖子原文:
verilog实现双边沿触发器Dual-edge triggered flip-flop - 知乎)
(1)   
always @(posedge clk)      
begin            
    q1 <= d;        
end   

always @(negedge clk)      
begin            
    q2 <= d;        
end   

assign q = clk? q1:q2;

当然这种时钟直接用在组合逻辑上的,正规流片的代码里是不能出现的(刚上班时候想写过这种代码,被带我的人制止了,哈哈)


(2)       
always @(posedge clk)
     p <= d ^ n;            

always @(negedge clk)      
     n <= d ^ p;        

assign q = p ^ n;

这段逻辑会使q晚于d半个时钟周期产生,根据这个基础,我攒了个代码来实现上图的时序。(新手写代码,也不管逻辑合不合理了,硬往时序图上凑)
我的代码:

always @ (posedge clk or negedge rst_n)
begin
    if (!rst_n)
        d <= 4'b0;
    else
        d <= d + 4'b1;
end

always @ (posedge clk or negedge rst_n)
begin
    if (!rst_n)
        p <= 4'b0;
    else
        p <= d ^ n;
end

always @ (negedge clk or negedge rst_n)
begin
    if (!rst_n)
        n <= 4'b0;
    else
        n <= d ^ p;
end

assign q = p ^ n;

assign cnt = d + q;

assign cko_0 = (cnt == 4'd1);
assign cko_1 = (cnt == 4'd3);
assign cko_2 = (cnt == 4'd5);
assign cko_3 = (cnt == 4'd7);
assign cko_4 = (cnt == 4'd9);
assign cko_5 = (cnt == 4'd11);
assign cko_6 = (cnt == 4'd13);
assign cko_7 = (cnt == 4'd15);



                               
登录/注册后可看大图



这种分别使用时钟上升沿和下降沿采样,后续在dc综合和时序收敛情况还没考虑,但是我们时钟慢、工艺老,应该不是大问题。


感谢耐心看完我的问题;


希望大佬们可以讲一下自己碰到过类似这种情况时候的处理,以及上面两种方法的实用性。





发表于 昨天 16:01 | 显示全部楼层
你贴的两种方法就是两种常见的SDR2DDR方法,不过在熟悉其综合约束/STA/物理实现过程前先不要使用. FPGA里面实现SDR2DDR可以直接调用片内资源.你想要的半周期脉冲用gate时钟即可,无需倍频时钟.
 楼主| 发表于 昨天 16:21 | 显示全部楼层
本帖最后由 Patrick0809 于 2025-5-19 16:36 编辑


2ki 发表于 2025-5-19 16:01
你贴的两种方法就是两种常见的SDR2DDR方法,不过在熟悉其综合约束/STA/物理实现过程前先不要使用. FPGA里面 ...


ok,理解了,一个cycle的脉冲做门控时钟的使能,这样就能产生半个时钟周期的脉冲了。但是会有毛刺吧

clk_en如果是d触发器产生的,那么肯定有个d->q的一个delay,这样做门控肯定不行。

突然想起来,看过无毛刺时钟切换电路,但是里面有一级触发器也是下降沿触发的,我再去回顾一下。
 楼主| 发表于 昨天 16:52 | 显示全部楼层


2ki 发表于 2025-5-19 16:01
你贴的两种方法就是两种常见的SDR2DDR方法,不过在熟悉其综合约束/STA/物理实现过程前先不要使用. FPGA里面 ...


而且还需要生成类似这样1.5个cycle,2.5个cycle,3.5个cycle的cko,这样只使用门控时钟是没办法了吧。


                               
登录/注册后可看大图

发表于 昨天 17:16 | 显示全部楼层


Patrick0809 发表于 2025-5-19 16:21
ok,理解了,一个cycle的脉冲做门控时钟的使能,这样就能产生半个时钟周期的脉冲了。但是会有毛刺吧

clk_ ...


门控里面是有用于锁存clk_en的LAT的,低电平锁存。所以一般不会有毛刺
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-5-20 02:18 , Processed in 0.031349 second(s), 7 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表