N倍奇数分频器.(Verilog)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标签:Verilog分频器
N倍奇数分频器.(V erilog)
N_odd_divider.v / Verilog
module N_odd_divider (
input i_clk,
input rst_n,
output o_clk
);
parameter N = N_odd; // 设置奇数(除1外)倍分频parameter M = ?; // M="N/2"
// bit_of_N: N_odd的二进制位宽
reg [(bit_of_N - 1):0] cnt_p; // 上升沿计数单位
reg [(bit_of_N - 1):0] cnt_n; // 下降沿计数单位
reg clk_p; // 上升沿时钟
reg clk_n; // 下降沿时钟
assign o_clk = clk_n & clk_p; // 按位与(作用:掩码)
// 上升沿计数器: 0~(N-1)
always @ (posedge i_clk or negedge rst_n)
begin
if (!rst_n)
cnt_p <= 0;
else
begin
if (cnt_p == N-1)
cnt_p <= 0;
else
cnt_p <= cnt_p + 1'b1;
end
end
// 生成上升沿时钟
// 0~(N>>1) ↑ -> 1;((N/2)+1)~(N-1) ↑ -> 0 always @ (posedge i_clk or negedge rst_n) begin
if (!rst_n)
clk_p <= 0;
else
begin
if (cnt_p <= M) // 0 ~ (N/2)
clk_p <= 1;
else
end
end
// 下降沿计数器: 0~(N-1)
always @ (negedge i_clk or negedge rst_n) begin
if (!rst_n)
cnt_n <= 0;
else
begin
if (cnt_n == N-1)
cnt_n <= 0;
else
cnt_n <= cnt_n + 1'b1;
end
end
// 生成下降沿时钟
// 0~(N>>1) ↓ -> 1;((N/2)+1)~(N-1) ↓ -> 0 always @ (negedge i_clk or negedge rst_n) begin
if (!rst_n)
else
begin
if (cnt_n <= M) // 0 ~ (N/2) clk_n <= 1;
else
clk_n <= 0;
end
end
endmodule
仿真波形
图1. N_odd = 3
图2. N_odd = 5
另见
N倍偶数分频器.(Verilog)
参考资料
1. 真OO 无双的(原創) 如何設計除頻器? (SOC) (Verilog) (MegaCore)
2. 位运算.(C)
奇数倍分频(Verilog)
奇数倍分频的方法:(以5分频为例)
(n=N-1),图中,COUNT0采用上沿计数,COUNT1采用下沿计数,DIV0和DIV1是分别是上沿触发器和下沿触发器的输出,计数为0~(n/2-1)时DIV0、DIV1<='1'
此处为0~1,计数为n/2~(n-1)时DIV0、DIV1<='0'此处为2~4,DIV5_CLK是DIV0和DIV1的或门输出。
在使用该电路时,需要注意:
(1)DIV0和DIV1到DIV5_CLK的约束要严,越快越好。不然,无法保证1:1的占空比。
(2)MCLK频率要求较高,尽量不要出现窄脉冲,尤其是在高频电路里。(3)COUNT1可有可无,视时钟频率高低而定。频率越高,COUNT1越需要。
奇数倍分频(5分频)的方法:
`timescale 1ns / 1ps
module div(MCLK,DIV5_CLK,DIV0,DIV1,COUNT0);
input MCLK; //时钟输入
output DIV5_CLK; //5分频输出
output DIV0,DIV1; //(N-1)/2分频输出
reg DIV0;
reg DIV1;
parameter N = 5; //设置分频数N(奇数)
parameter M = 2; // (N-1)/2
output [2:0]COUNT0; //计数器计数寄存器
reg[2:0] COUNT0;
reg[2:0] COUNT1;
always@(posedge MCLK) //MCLK上升沿分频
begin
if(COUNT0==2)
begin
DIV0=0;
end
else if(COUNT0==5)
begin
COUNT0=0;
DIV0=1;
end
COUNT0=COUNT0+1;
end
always@(negedge MCLK) //MCLK下降沿分频
begin
if(COUNT1==2)