verilog分频率电路

1. 奇数分频

  1. 可以简单的用Moore型状态机来实现占空比非百分之五十的奇数分频:
    7分频Moore型状态机

  2. 具有百分之五十占空比的奇数整数分频
    原理:以期望输出频率的一半产生两个正交的相位时钟(两个时钟之间有90°的相差),再将两个正交时钟相异或可以得到输出频率。由于存在固定的90°相差,每次异或输入端只有一端会发生变化,这样有效地消除了波形上的毛刺。
    步骤:

    1. 产生具有占空比位百分之五十的N分频信号(N为奇数)
    2. 创建一个(N - 1)的计数器cnt
    3. 在输入时钟上升沿(下降沿),采样cnt,若cnt为0则翻转clk_re(clk_fe)
    4. 在输入时钟下降沿(上升沿),采样cnt,若cnt为(N - 1)/ 2 则翻转clk_fe(clk_re)
    5. 将clk_re和clk_fe异或得到输出信号频率

    注:步骤3和4是为了得到两个正交的时钟信号,这样在进行异或便可以得到期望的输出频率。
    代码示例(5分频):

module Division3(
	output clk_4MHz,
	input clk_20MHz,
	input rstn
	);
	
	reg [3:0]div3cnt = 4'b0;
	reg clk_fe = 4'b0;
	reg clk_re = 4'b0;

	always @( posedge clk_20MHz ) begin
		if (!rstn) begin
			div3cnt <= 4'b0;
		end
		else if (div3cnt < 4'd4) begin
			div3cnt <= div3cnt + 4'b1;
		end
		else begin
			div3cnt <= 4'b0;
		end
	end

	always @( posedge clk_20MHz ) begin
		if (!rstn) begin
			clk_re <= 1'b0;
		end
		else if (div3cnt == 4'd0) begin
			clk_re <= ~clk_re;
		end
		else begin
			clk_re <= clk_re;
		end
	end

	always @( negedge clk_20MHz ) begin
		if (!rstn) begin
			clk_fe <= 1'b0;
		end
		else if (div3cnt == 4'd3) begin
			clk_fe <= ~clk_fe;
		end
		else begin
			clk_fe <= clk_fe;
		end
	end

	assign clk_4MHz = clk_re ^ clk_fe;
endmodule

2. 小数分频

原理:使用移位寄存器来实现小数分频(X.5),移位寄存器长度为2*X.5,分别 在零和X位移位180°处将输出置1.

代码示例(2.5分频)

module DividePoint(
	output clk_40M,
	input rstn,
	input clk_100M
    );

	reg [4 : 0] clock_shifter = 4'b1;
	reg shifter2 = 1'b0;

	always @( posedge clk_100M ) begin
		if(!rstn) clock_shifter <= 4'b1;
		else clock_shifter <= {clock_shifter[3 : 0] , clock_shifter[4]};
	end

	always @( negedge clk_100M ) begin
		if (!rstn) shifter2 <= 1'b0;
		else shifter2 <= clock_shifter[2];
	end

	assign clk_40M = clock_shifter[0] || shifter2;
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值