verilog实现奇数分频--以三分频为例

工程文件

module aa( 
    input rst_n,
	 input clk,
	 output clko);  
  reg [1:0] cnt;
  reg clk1,clk2;
  always@(posedge clk or negedge rst_n)
  if(!rst_n)
		cnt = 2'b0;
	else if(cnt == 2'b10)
		cnt = 2'b0;
	else cnt = cnt + 1;
	
	always@(posedge clk or negedge rst_n)
	if(!rst_n)
		clk1 = 0;
	else if(cnt == 0)
		clk1 = 1;
	else if(cnt == 2'd2)
		clk1 = 0;
	
	always@(negedge clk or negedge rst_n)
	if(!rst_n)
		clk2 = 0;
	else if(cnt == 0)
		clk2 = 1;
	else if(cnt == 2'd2)
		clk2 = 0;
	assign clko = clk1 && clk2;
endmodule

测试文件

`timescale 1ns/1ns
module tb();
reg rst_n,clk;
wire clko;
 aa aa( 
     rst_n,
	  clk,
	  clko);
initial clk = 0;
always #10 clk = ~clk;

initial begin
	rst_n = 0;
	#30 rst_n = 1;
	#1000 $stop;
end
endmodule

实现原理
分别在原clk上升沿和下降沿实现占空比非50%的奇数分频时钟,然后将两时钟进行与(或)操作。
上述将两时钟进行与还是或,主要看你得到的占空比非50%的奇数分频时钟中高电平比例超过50%还是低电平比例超过50%。
以上述代码为例,三分频电路。那么计数器计数计3个即可,0,1,2。所以计数器两位就够了。每次计到2,使其归零。然后占空比非50%分频,计数器为0时,使其为高电平;计数器为2时,使其为低电平。这样高电平持续时间就比低电平多,那么得到的两时钟最终就是进行与操作。
在这里插入图片描述
这里计数器为0时,使其为高电平;计数器为2时,使其为低电平。其实也可以计数到1,使其为低电平,这样低电平持续时间就比高电平多。那么最后相或。
总结规律的话就是,n分频,计数到n/2左右的两个整数都可以最后用相与、相或调整。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值