任意整数分频时钟的建立

1.该程序使用Verilog语言,用状态机实现任意整数分频的时钟;
2.偶数分频和奇数分频都能实现;
2.在运算中把除法和取余逻辑上比较好理解的运算符,改变成右移位和减法实现,可以大量节省FPGA资源;

module div(
input	wire				clk,
input	wire				rst,
input	wire	[31:0]	a,     //任意分频倍数

output	wire			clk_a
);
reg		clk1;
reg		clk2;

wire		[31:0]	T_H;
wire		[31:0]	T_L;
assign	T_H = a >> 1 ;
assign	T_L = a-(a>>1);
reg	[31:0]	cnt;

localparam   CLK_H = 0;
localparam   CLK_L = 1;
reg	[1:0]	cstate;

always@(posedge clk or posedge rst)
	if(rst)
		begin
			clk1<=0;
			cnt<=0;
			cstate <= CLK_H;
		end	
	else
		case(cstate)
			CLK_H		:		begin
									clk1<=1;
									if(cnt == T_H - 1)
										begin	cstate <= CLK_L;	cnt<=0;	end
									else
										begin	cstate <= CLK_H;	cnt<=cnt+1;	end
								end
								
			CLK_L		:		begin
									clk1<=0;
									if(cnt == T_L - 1)
										begin	cstate <= CLK_H;	cnt<=0;	end
									else
										begin	cstate <= CLK_L;	cnt<=cnt+1;	end
								end
								
			default	:		;
		endcase

		

always@(negedge clk or posedge rst)
	if(rst)
		clk2 <= 0;
	else
		case(cstate)
			CLK_H		:		clk2<=1;
								
			CLK_L		:		clk2<=0;
			
			default	:		;
		endcase

assign	clk_a = (a-(a>>1)-(a>>1)) ? (clk1 || clk2) : clk1;
	
endmodule 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值