如何暴力造出不足一个时钟周期的脉冲信号

 项目中解决问题还是需要许多骚操作。。。


进入正题:

别的本事不太会,解决问题的骚操作还是有的。。。

原来系统是一个125M时钟,想要发出不足一个时钟周期的脉冲信号而且需要同步,这时候就想到使用PLL在生成一个125M时钟,使这两个时钟有相位差。。。然后在进行组合逻辑判断。。。完美!!!解决问题!!!

然而在实践的过程中发现,相位需要来回调试,并且还需要来回修改还PLL IP 核,麻烦。。。

有没有可以动态改变PLL的输出时钟的相位???

还真有!!!

 就是它!!!动态调相!!!勾选它!!!

接着勾选下图。 

完整的配置如下几个图所示:

 

 配置完之后,开始仿真吧。

`timescale 1ns / 1ps


module ld_test();



reg             clk_100m            ;

reg     [3:0]   cnt_r1              ;
reg     [3:0]   cnt_r2              ;
reg             ld_dis_r1           ;
reg             ld_dis_r2           ;
reg             psen                ;
reg             psincdec            ;
reg     [3:0]   cnt_r               ;

wire            locked              ;
wire            clk_125m_w1         ;
wire            clk_125m_w2         ;
wire            ld_dis              ;


wire            psdone              ;




assign          ld_dis      =      (clk_125m_w1 == 1'b1) && (ld_dis_r1 == 1'b1) && (clk_125m_w2 == 1'b0) ;

initial
begin
    clk_100m            =       1'b0            ;
    cnt_r1              =       4'd0            ;
    cnt_r2              =       4'd0            ;
    ld_dis_r1           =       1'b0            ;
    ld_dis_r2           =       1'b0            ;
    psen                =       1'b0            ;
    psincdec            =       1'b0            ;
    cnt_r               =       4'd0            ;
end

always #5   clk_100m    =       ~clk_100m       ;


//always @ (posedge clk_125m_w1 or negedge locked)
//begin
//    if(locked == 1'b0)
//    begin
//        cnt_r1      <=      4'd0            ;
//    end
//    else if(cnt_r1 == 4'd10) 
//    begin
//        cnt_r1      <=      4'd0            ;
//    end
//    else 
//    begin
//        cnt_r1      <=      cnt_r1 + 1'b1   ;
//    end
//end
//
//
//always @ (posedge clk_125m_w2 or negedge locked)
//begin
//    if(locked == 1'b0)
//    begin
//        cnt_r2      <=      4'd0            ;
//    end
//    else if(cnt_r2 == 4'd10) 
//    begin
//        cnt_r2      <=      4'd0            ;
//    end
//    else 
//    begin
//        cnt_r2      <=      cnt_r2 + 1'b1   ;
//    end
//end
//
//always @ (posedge clk_125m_w1 or negedge locked)
//begin
//    if(locked == 1'b0)
//    begin
//        ld_dis_r1       <=      1'b0        ;
//    end
//    else if(cnt_r1 == 4'd5)
//    begin
//        ld_dis_r1       <=      1'b1        ;
//    end
//    else 
//    begin
//        ld_dis_r1       <=      1'b0        ;
//    end
//end 
//
//
//always @ (posedge clk_125m_w2 or negedge locked)
//begin
//    if(locked == 1'b0)
//    begin
//        ld_dis_r2       <=      1'b0        ;
//    end
//    //else if(cnt_r2 == 4'd5)
//    //begin
//    //    ld_dis_r2       <=      1'b1        ;
//    //end
//    //else 
//    begin
//        ld_dis_r2       <=      ~ld_dis_r2        ;
//    end
//end 


always @ (posedge clk_100m or negedge locked)
begin
    if(locked == 1'b0)
    begin
        cnt_r       <=      1'b0                ;
    end
    else if(cnt_r == 4'd10)
    begin
        cnt_r       <=      cnt_r               ;
    end
    else 
    begin
        cnt_r       <=      cnt_r + 1'b1        ;
    end
end

always @ (posedge clk_100m)
begin
    if(cnt_r == 4'd9)
    begin
        psen        <=      1'b1                ;
    end
    else 
    begin
        psen        <=      1'b0                ;
    end
end




pll_test pll_test_ins
(
    .clk_out1       (clk_125m_w1        ),    
    .clk_out2       (clk_125m_w2        ),
    .psclk          (clk_100m           ), // input psclk
    .psen           (psen               ), // input psen
    .psincdec       (0           ),     // input psincdec
    .psdone         (psdone             ),       // output psdone.locked         (locked             ), 
    .locked         (locked             ),       // output locked
    .clk_in1        (clk_100m           )
);   








endmodule

 在psen有效之前的两个时钟,都是对齐的

 在psdone有效前后,两个时钟以及出现了相位延时

因为仿真文件只给了 一个psen,一个psen只能实现14ps的延时。

为什么是14ps???手册写的

 手册:7 Series FPGAs Clocking Resources User Guide (UG472)

项目中解决问题还是需要许多骚操作。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下方式使用VHDL语言实现时钟信号延迟一个时钟周期: 1. 定义一个D触发器(D Flip-Flop)。 2. 将时钟信号作为触发器的时钟输入。 3. 将延迟后的时钟信号作为触发器的输出。 4. 将原始的时钟信号作为触发器的数据输入。 5. 在下一个时钟上升沿时,将数据输入的值传递到输出上,从而实现延迟一个时钟周期的效果。 下面是一个简单的VHDL代码示例: ```vhdl entity clock_delay is port ( clk_in : in std_logic; -- 输入时钟信号 clk_out : out std_logic -- 输出延迟后的时钟信号 ); end clock_delay; architecture Behavioral of clock_delay is signal temp : std_logic; begin process (clk_in) begin if rising_edge(clk_in) then temp <= clk_in; -- 将输入信号传递到中间信号temp上 end if; end process; process (temp) begin if rising_edge(temp) then clk_out <= temp; -- 将中间信号temp传递到输出信号上 end if; end process; end Behavioral; ``` 在这个代码中,我们定义了一个实体`clock_delay`,其中包含一个输入端口`clk_in`和一个输出端口`clk_out`。我们使用两个过程来实现时钟信号的延迟。第一个过程将输入时钟信号传递到一个中间信号`temp`上,在下一个时钟上升沿时,`temp`的值会更新为输入信号的值。第二个过程将中间信号`temp`传递到输出信号`clk_out`上,从而实现时钟信号的延迟。 请注意,这个代码只是一个简单的示例,实际的应用中可能需要更多的逻辑和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值