两相非交叠时钟verilogA实现

思路是利用clk_in建立20%和80%的时间作为阈值,实现非交叠

代码

`include "constants.vams"
`include "disciplines.vams"

module nonoverlapclk_1p8(clk1, clk1_d, clk1b, clk2, clk2_d, clk2b, gnd, vdd, clk_in);
output clk1;
electrical clk1;
output clk1_d;
electrical clk1_d;
output clk1b;
electrical clk1b;
output clk2;
electrical clk2;
output clk2_d;
electrical clk2_d;
output clk2b;
electrical clk2b;
inout gnd;
electrical gnd;
inout vdd;
electrical vdd;
input clk_in;
electrical clk_in;

parameter real del=10p from [0:inf);
parameter real tdel=10p from [0:inf);
parameter real tr=10p from [0:inf);
parameter real tf=10p from [0:inf);
parameter real logich=1.8 from [0:inf);
parameter real logicl=0 from [0:inf);

analog begin
V(clk2)<+transition(V(clk_in)>logich*0.8? logich:logicl,tdel,tr,tf);
V(clk1)<+transition(V(clk_in)>logich*0.2? logicl:logich,tdel,tr,tf);
V(clk2_d)<+transition(V(clk_in)>logich*0.8? logich:logicl,tdel+del,tr,tf);
V(clk1_d)<+transition(V(clk_in)>logich*0.2? logicl:logich,tdel+del,tr,tf);
V(clk2b)<+transition(V(clk_in)>logich*0.8? logicl:logich,tdel,tr,tf);
V(clk1b)<+transition(V(clk_in)>logich*0.2? logich:logicl,tdel,tr,tf);
end

endmodule

仿真结果

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Verilog实现无毛刺切换的关键是通过合适的时序处理来保证在切换时钟时不会出现意外的冲突。以下是一个示例代码,演示如何在两个时钟之间实现无毛刺切换: ```verilog module clock_switch ( input wire clk1, input wire clk2, input wire switch_trigger, output wire switched_clk ); reg switched_clk_reg; reg switched_clk_next; always @(posedge clk1 or posedge clk2 or posedge switch_trigger) begin if (switch_trigger) begin if (clk1) begin switched_clk_next <= 1'b0; end else begin switched_clk_next <= 1'b1; end end else if (clk1) begin switched_clk_next <= 1'b1; end else begin switched_clk_next <= 1'b0; end end always @(posedge clk1 or posedge clk2) begin switched_clk_reg <= switched_clk_next; end assign switched_clk = switched_clk_reg; endmodule ``` 在这个示例代码中,我们有两个输入时钟 `clk1` 和 `clk2`,一个触发切换的输入信号 `switch_trigger`,以及一个输出时钟 `switched_clk`。 使用两个 `always` 块来处理时钟切换逻辑。第一个 `always` 块在 `clk1`、`clk2` 和 `switch_trigger` 的上升沿时执行。当 `switch_trigger` 触发时,根据当前的 `clk1` 的状态来选择输出时钟,如果 `clk1` 为高电平,则输出时钟 `switched_clk` 为低电平,否则为高电平。如果没有触发切换,则根据 `clk1` 的状态来决定输出时钟。 第二个 `always` 块在 `clk1` 和 `clk2` 的上升沿时执行,并将 `switched_clk_next` 的值赋给 `switched_clk_reg`,用于时钟输出。 最后,使用 `assign` 语句将 `switched_clk_reg` 赋值给 `switched_clk` 输出。 需要注意的是,这个示例代码只是演示了一个简单的时钟切换逻辑,实际应用中可能需要更多的时序处理和输入检查来确保正确的时钟切换。同时,请根据具体的设计要求和目标平台的特性进行适当的优化和约束设置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值