当前位置:   article > 正文

【Verilog编程】小数分频,占空比非50%_verilog占空比不为50%的程序

verilog占空比不为50%的程序

4.5倍分频

1.分频原理

4.5倍分频,相当于9个参考时钟中包含两个对称的脉冲
为了得到两个对称的脉冲,在第5个计时周期从下降沿采集,得到对称的两个4.5个周期。然后设计时钟脉冲,保证两边对称,即可在9个参考钟内得到两个对称的脉冲。
4.5倍分频原理图
如图所示,改变单边时钟脉冲即可得到任意占空比的小数分频。以上示意图中设计了44%和66%的占空比。

占空比44%

设计思路如下:
(1)设置9位移位寄存器,复位时为:1000_0000_0
(2)每个周期向左循环移位
(3)依次产生第一个脉冲clk_pulse1和第二个脉冲clk_pulse2
(4)最后输出分频后时钟clk_out=clk_pulse1||clk_pulse2
占空比44%的时钟
需要注意的是,在这个设计中使用组合逻辑产生输入时钟,因此要避免毛刺的产生。
第一个脉冲clk_pulse1=cnt[1]||cnt[2]
在实际应用中,在cnt[1]寄存器拉低之后,cnt[2]由于某些电路原因延时一会儿才拉高(例如时钟skew),那么clk_pulse1=cnt[1]||cnt[2]就可能在cnt[1]和cnt[2]中间拉低,如图所示:
在这里插入图片描述
因此为了避免这种情况的产生,将cnt[1]反转180°,形成cnt[1]_lshift(在时钟下降沿采集),因此clk_pulse1=cnt[1]||cnt[2]||cnt[1]_lshift。
同理可得clk_pulse2=cnt[5]_lshift||cnt[6]_lshift||cnt[6]。(其中cnt[6]为了避免毛刺的产生)。

占空比66%

占空比66%的时钟
占空比66%相对于占空比44%的设计,在于将脉冲宽度扩大,同时引入两处避免产生毛刺处。

2.代码实现

占空比44%

`timescale	1ns/1ps
module fra_divclk_9(
	input		wire						sclk,
	input		wire						rst_n,
	output		wire						clk_out
);

reg	[9:1]	div_cnt;
reg			cnt1_lshift;
reg			cnt5_lshift;
reg			cnt6_lshift;

wire		clk_pulse1;
wire		clk_pulse2;

always	@(posedge	sclk or negedge	rst_n)begin
	if(rst_n==1'b0)begin
		div_cnt<=9'b1000_0000_0;
	end
	else begin
		div_cnt<={div_cnt[8:1],div_cnt[9]};
	end
end

always	@(negedge	sclk or negedge	rst_n)begin
	if(rst_n==1'b0)begin
		cnt1_lshift<=1'b0;//=div_cnt[1]
		cnt5_lshift<=1'b0;
		cnt6_lshift<=1'b0;
	end
	else begin
		cnt1_lshift<=div_cnt[1];
		cnt5_lshift<=div_cnt[5];
		cnt6_lshift<=div_cnt[6];
	end
end

assign	clk_pulse1=div_cnt[1]||div_cnt[2]||cnt1_lshift;
assign	clk_pulse2=cnt5_lshift||cnt6_lshift||div_cnt[6];

assign	clk_out=clk_pulse1 || clk_pulse2;
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

仿真图为
在这里插入图片描述

占空比66%

`timescale	1ns/1ps
module fra_divclk_9_66(
	input		wire						sclk,
	input		wire						rst_n,
	output		wire						clk_out
);

reg	[9:1]	div_cnt;
reg			cnt1_lshift;
reg			cnt2_lshift;
reg			cnt5_lshift;
reg			cnt6_lshift;
reg			cnt7_lshift;

wire		clk_pulse1;
wire		clk_pulse2;

always	@(posedge	sclk or negedge	rst_n)begin
	if(rst_n==1'b0)begin
		div_cnt<=9'b1000_0000_0;
	end
	else begin
		div_cnt<={div_cnt[8:1],div_cnt[9]};
	end
end

always	@(negedge	sclk or negedge	rst_n)begin
	if(rst_n==1'b0)begin
		cnt1_lshift<=1'b0;//=div_cnt[1]
		cnt2_lshift<=1'b0;
		cnt5_lshift<=1'b0;
		cnt6_lshift<=1'b0;
		cnt7_lshift<=1'b0;
	end
	else begin
		cnt1_lshift<=div_cnt[1];
		cnt2_lshift<=div_cnt[2];
		cnt5_lshift<=div_cnt[5];
		cnt6_lshift<=div_cnt[6];
		cnt7_lshift<=div_cnt[7];
	end
end

assign	clk_pulse1=div_cnt[1]||div_cnt[2]||div_cnt[3]||cnt1_lshift||cnt2_lshift;
assign	clk_pulse2=cnt5_lshift||cnt6_lshift||cnt7_lshift||div_cnt[6]||div_cnt[7];

assign	clk_out=clk_pulse1 || clk_pulse2;
endmodul
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

仿真图为
在这里插入图片描述

3.5倍分频

设计思路如下:
(1)设置7位移位寄存器,复位时为:100_0000
(2)每个周期向左循环移位
(3)依次产3第一个脉冲和第二个脉冲
(4)最后输出分频时钟clk_out=pulse1||clk_pulse2
3.5倍分频
其中,占空比57%的3.5倍分频,与4.5倍分频电路设计思路相同。
占空比28%的3.5倍分频,不同之处在于高脉冲只有一个参考时钟宽度,因此当占空比为28%时不需要额外设计滤毛刺电路。
在这里插入图片描述

1.5倍分频

设计思路
(1)设置3位移位寄存器,复位时为:100
(2)每个周期向左循环移位
(3)依次产生第一个脉冲和第二个脉冲
(4)最后输出分频时钟clk_out=pulse1||pulse2
注意:使用这种方法生成的1.5倍分频,只能产生66%的占空比
1.5倍分频

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/519183
推荐阅读
相关标签
  

闽ICP备14008679号