verilog分频器设计(奇偶分频、半整数分频、任意分频、任意占空⽐)
分频器是指使输出信号频率为输⼊信号频率整数分之⼀的电⼦电路。在许多电⼦设备中如电⼦钟、频率合成器等,需要各种不同频率的信号协同⼯作,常⽤的⽅法是以稳定度⾼的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是⼀种主要变换⼿段。
樱桃树栽培技术早期的分频器多为正弦分频器,随着数字集成电路的发展,脉冲分频器(⼜称数字分频器)逐渐取代了正弦分频器。
⼀、偶数分频
采⽤触发器反向输出端连接到输⼊端的⽅式,可构成简单的 2 分频电路。
以此为基础进⾏级联,可构成 4 分频,8 分频电路。
电路实现如下图所⽰,⽤ Verilog 描述时只需使⽤简单的取反逻辑即可。
如果偶数分频系数过⼤,就需要对分频系数 N 循环计数进⾏分频。在计数周期达到分频系数中间数值 N/2 时进⾏时钟翻转,可保证分频后时钟的占空⽐为 50%。因为是偶数分频,也可以对分频系数中间数值 N/2 进⾏循环计数。
偶数分频的 Verilog 描述举例如下。
美丽岛module even_divisor
# (parameter DIV_CLK =10)挂面怎么做
(
input rstn ,
input clk,
output clk_div2,
output clk_div4,
output clk_div10
南阳公主);
//2 分频
reg clk_div2_r ;
always @(podge clk or negedge rstn) begin if(!rstn) begin
clk_div2_r <= 'b0 ;
end
el begin
clk_div2_r <=~clk_div2_r ;
end
end
assign clk_div2 = clk_div2_r ;
//4 分频
reg clk_div4_r ;
always @(podge clk_div2 or negedge rstn) begin if(!rstn) begin
clk_div4_r <= 'b0 ;
end
el begin
clk_div4_r <=~clk_div4_r ;
end
end
assign clk_div4 = clk_div4_r ;
//N/2 计数
reg [3:0] cnt ;
always @(podge clk or negedge rstn) begin if(!rstn) begin
cnt <= 'b0 ;
end
姒锦el if(cnt ==(DIV_CLK/2)-1) begin
cnt <= 'b0 ;
end
el begin
cnt <= cnt +1'b1 ;
end
end
//输出时钟
reg clk_div10_r ;
always @(podge clk or negedge rstn) begin if(!rstn) begin
clk_div10_r <=1'b0 ;
end
el if(cnt ==(DIV_CLK/2)-1) begin
clk_div10_r <=~clk_div10_r ;12121
end
end
assign clk_div10 = clk_div10_r ;
endmodule
仿真结果如下:
⼆、奇数分频
奇数分频如果不要求占空⽐为 50%,可按照下⾯任意整数分频和任意占空⽐的⽅法进⾏分频。即计数器对分频系数 N 进⾏循环计算,然后根据计数值选择⼀定的占空⽐输出分频时钟。
如果奇数分频输出时钟的⾼低电平只差⼀个 cycle ,则可以利⽤源时钟双边沿特性并采⽤"与操作"或"或操作"的⽅式将分频时钟占空⽐调整到 50%。
或操作调整占空⽐:采⽤"或操作"产⽣占空⽐为 50% 的 3 分频时序图如下所⽰。
双盘打坐利⽤源时钟上升沿分频出⾼电平为 1 个 cycle、低电平为 2 个 cycle 的 3 分频时钟。
利⽤源时钟下降沿分频出⾼电平为 1 个 cycle、低电平为 2 个 cycle 的 3 分拼时钟。
两个 3 分频时钟应该在计数器相同数值、不同边沿下产⽣,相位差为半个时钟周期。然后将 2 个时钟进⾏"或操作",便可以得到占空⽐为 50%的 3 分频时钟。
同理,9 分频时,则需要在上升沿和下降沿分别产⽣ 4 个⾼电平、5 个低电平的 9 分频时钟,然后再对两个时钟做"或操作"即可。Verilog 描述如下。
module odo_div_or
#(parameter DIV_CLK =9)
(
input rstn ,
input clk,
output clk_div9
);
//计数器
reg [3:0] cnt ;
always @(podge clk or negedge rstn) begin
if(!rstn) begin
cnt <= 'b0 ;
end
el if(cnt == DIV_CLK-1) begin
cnt <= 'b0 ;
end
el begin
cnt <= cnt +1'b1 ;
end
end
//在上升沿产⽣9分频
reg clkp_div9_r ;
always @(podge clk or negedge rstn) begin
if(!rstn) begin
clkp_div9_r <=1'b0 ;
end
el if(cnt ==(DIV_CLK>>1)-1) begin //计数4-8位低电平 clkp_div9_r <=0;
end
el if(cnt == DIV_CLK-1) begin //计数 0-3 为⾼电平
clkp_div9_r <=1;
end
end
/
/在下降沿产⽣9分频
reg clkn_div9_r ;
always @(negedge clk or negedge rstn) begin
if(!rstn) begin
clkn_div9_r <=1'b0 ;
end
el if(cnt ==(DIV_CLK>>1)-1) begin
clkn_div9_r <=0;
end
el if(cnt == DIV_CLK-1) begin
clkn_div9_r <=1;
end
end
//或操作,往往使⽤基本逻辑单元库
// or (clk_div9, clkp_div9_r, clkn_div9_r) ;
assign clk_div9 = clkp_div9_r | clkn_div9_r ; endmodule
神仙谷景区仿真结果如下:
与操作调整占空⽐:采⽤"与操作"产⽣占空⽐为 50% 的 3 分频时序图如下所⽰。
利⽤源时钟上升沿分频出⾼电平为 2 个 cycle、低电平为 1 个 cycle 的 3 分频时钟。
利⽤源时钟下降沿分频出⾼电平为 2 个 cycle、低电平为 1 个 cycle 的 3 分拼时钟。
两个 3 分频时钟应该在计数器相同数值、不同边沿下产⽣,相位差为半个时钟周期。然后将 2 个时钟进⾏"与操作",便可以得到占空⽐为 50%的 3 分频时钟。
同理,9 分频时,则需要在上升沿和下降沿分别产⽣ 5 个⾼电平、4 个低电平的 9 分频时钟,然后再对两个时钟做"与操作"即可。Verilog 描述如下。