偶數(shù)分頻
偶數(shù)分頻最容易實(shí)現(xiàn),可以用計(jì)數(shù)器實(shí)現(xiàn)。計(jì)數(shù)值小的時(shí)候也可以使用DFF直接完成。這里使用計(jì)數(shù)器實(shí)現(xiàn),計(jì)數(shù)達(dá)到分頻系數(shù)一半的時(shí)候進(jìn)行翻轉(zhuǎn)(占空比為50%)。對應(yīng): ???VL37 時(shí)鐘分頻(偶數(shù))
/**
使用計(jì)數(shù)方式實(shí)現(xiàn)了8分頻
*/
module even_div(
input wire rstn,
input wire clk,
output reg clk_out
);
reg [1:0] count;
/**
count operation
*/
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
count <= 2'b0;
end
else begin
count <= count + 1'b1;
end
end
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
clk_out <= 1'b0;
end
else if(count == 2'b00) begin
clk_out <= ~clk_out;
end
end
endmodule
仿真結(jié)果如下
奇數(shù)分頻
不要求占空比為50%的奇數(shù)分頻
不要求占空比為50%,可以與偶數(shù)分頻一樣,根據(jù)計(jì)數(shù)值進(jìn)行波形翻轉(zhuǎn)。
對應(yīng): ???VL42 無占空比要去的奇數(shù)分頻
/**
不要求占空比的奇數(shù)分頻
5分頻 3低電平2高電平
占空比 2/5
*/
module odd_div (
input wire rstn,
input wire clk,
output reg clko
);
parameter N = 5;
reg [2:0] count;
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
count <= 3'd0;
end
else if(count == N - 1) begin
count <= 3'd0;
end
else begin
count <= count + 1'b1;
end
end
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
clko <= 1'b0;
end
else if(count == N - 1 || count == (N >> 1)) begin
clko <= ~clko;
end
else begin
clko <= clko;
end
end
endmodule
仿真結(jié)果如下
要求占空比為50%奇數(shù)分頻
無法單純使用計(jì)數(shù)方式來實(shí)現(xiàn),可以利用時(shí)鐘雙邊沿特性產(chǎn)生兩個(gè)占空比不為50%的時(shí)鐘,然后將這兩個(gè)時(shí)鐘信號相與或者相或產(chǎn)生。
比如產(chǎn)生占空比為50%的5分頻時(shí)鐘,可以通過:
- 沿源時(shí)鐘上升沿變化的,2cycle高電平,3cycle低電平,周期為5的時(shí)鐘信號。
- 沿源時(shí)鐘下降沿變化的,2cycle高電平,3cycle低電平,周期為5的時(shí)鐘信號。
- 將上述兩時(shí)鐘信號相或得到占空比為50%的5分頻時(shí)鐘。
或者
- 沿源時(shí)鐘上升沿變化的,3cycle高電平,2cycle低電平,周期為5的時(shí)鐘信號。
- 沿源時(shí)鐘下降沿變化的,3cycle高電平,2cycle低電平,周期為5的時(shí)鐘信號。
- 將上述兩時(shí)鐘信號相與得到占空比為50%的5分頻時(shí)鐘。
/**
產(chǎn)生 50%占空比 5分頻的時(shí)鐘
1. 沿源時(shí)鐘上升沿變化的,3cycle高電平,2cycle低電平,周期為5的時(shí)鐘信號。
2. 沿源時(shí)鐘下降沿變化的,3cycle高電平,2cycle低電平,周期為5的時(shí)鐘信號。
3. 將上述兩時(shí)鐘信號相與得到占空比為50%的5分頻時(shí)鐘。
*/
module odd_div1(
input clk,
input rstn,
output clko
);
parameter N = 5;
reg [2:0] count;
// 沿時(shí)鐘上升沿變化的時(shí)鐘信號 2低3高
reg clkp;
// 沿時(shí)鐘下降沿變化的時(shí)鐘信號
reg clkn;
assign clko = clkp & clkn;
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
count <= 3'b0;
end
else if(count == N - 1) begin
count <= 3'b0;
end
else begin
count <= count + 1'b1;
end
end
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
clkp <= 1'b0;
end
else if(count == 3'b1 || count == N - 1) begin
clkp = ~clkp;
end
else begin
clkp <= clkp;
end
end
always @(negedge clk or negedge rstn) begin
if(~rstn) begin
clkn <= 1'b0;
end
else if(count == 3'b1 || count == N - 1) begin
clkn = ~clkn;
end
else begin
clkn <= clkn;
end
end
endmodule
仿真波形如下
小數(shù)分頻
對應(yīng) ???VL41 任意小數(shù)分頻
無法做到占空比為50%的小數(shù)分頻,也無法做到分頻后的每個(gè)時(shí)鐘周期都是原時(shí)鐘周期的小數(shù)倍(當(dāng)然如果是x.5是可以做到的)。
因此轉(zhuǎn)換思路,進(jìn)行7.6倍分頻可以理解成分頻后的時(shí)鐘周期 To = 7.6T ,那么 10To = 76T,也就是說只要滿足76個(gè)原時(shí)鐘周期等于10個(gè)分頻后的時(shí)鐘周期即可。
這時(shí)候我們使用7分頻和8分頻的時(shí)鐘來實(shí)現(xiàn)7.6倍分頻的時(shí)鐘,假設(shè) 10個(gè)分頻后的時(shí)鐘 由N個(gè)7分頻的時(shí)鐘和M個(gè)8分頻的時(shí)鐘組成,那么可以得到
M + N = 10
N7T + M8T = 76T
?
M + N = 10
7N + 8M = 76
可以得到N = 4, M = 6。
就是由4個(gè)7分頻的時(shí)鐘和6個(gè)8分頻的時(shí)鐘組成7.6倍分頻的時(shí)鐘。
那么可以有四種方法將這兩種時(shí)鐘進(jìn)行混合:
1. 先4次7分頻再進(jìn)行6次8分頻
2. 先6次8分頻再進(jìn)行4次7分頻
3. 將6次8分頻插入4次7分頻中
4. 將4次7分頻插入6次8分頻中
/**
實(shí)現(xiàn)8.7倍分頻
由3個(gè)8分頻和7個(gè)9分頻時(shí)鐘組成10個(gè)分頻后的時(shí)鐘
=》
24個(gè)原時(shí)鐘周期用于8分頻
63個(gè)原時(shí)鐘周期用于9分頻
先進(jìn)行 3次8分頻 再進(jìn)行 7次9分頻
*/
module div_M_N(
input wire clk_in,
input wire rst,
output wire clk_out
);
/*
8N + 9M = 87
N + M = 10
M = 7, N = 3
因此3個(gè)8分頻時(shí)鐘 和 7個(gè)9分頻時(shí)鐘構(gòu)成 8.7分頻時(shí)鐘
*/
/*
3*8 = 24
87個(gè)原時(shí)鐘周期里前24個(gè)周期 用來8分頻
7*9 = 63
后63個(gè)時(shí)鐘周期 用來9分頻
相當(dāng)于10個(gè)8.7分頻的時(shí)鐘,前3個(gè)分頻后的時(shí)鐘周期由8分頻組成,后7個(gè)由9分頻組成
*/
parameter M_N = 8'd87;
parameter c89 = 8'd24; // 8/9時(shí)鐘切換點(diǎn)
parameter div_e = 5'd8; //偶數(shù)周期
parameter div_o = 5'd9; //奇數(shù)周期
reg clk_div;
assign clk_out = clk_div;
// 計(jì)數(shù)87
reg [6:0] cnt87;
// 計(jì)數(shù)8
reg [2:0] cnt8;
// 計(jì)數(shù)9
reg [3:0] cnt9;
always @(posedge clk_in or negedge rst) begin
if(~rst) begin
cnt87 <= 7'b0;
end
else if(cnt87 == M_N - 1'b1) begin
cnt87 <= 7'b0;
end
else begin
cnt87 <= cnt87 + 1'b1;
end
end
/*
8/9分頻時(shí)鐘切換
*/
always @(posedge clk_in or negedge rst) begin
if(~rst) begin
cnt8 <= 3'b0;
cnt9 <= 4'b0;
end
// 8分頻
else if(cnt87 < c89) begin
cnt9 <= 4'b0;
cnt8 <= cnt8 + 1'b1;
end
// 9分頻
else begin
cnt8 <= 3'b0;
if(cnt9 == div_o - 1) begin
cnt9 <= 4'b0;
end
else begin
cnt9 <= cnt9 + 1'b1;
end
end
end
always @(posedge clk_in or negedge rst) begin
if(~rst) begin
clk_div <= 1'b0;
end
// 8分頻
else if(cnt87 < c89) begin
if (cnt8 == 3'b0 || cnt8 == 3'b100) begin
clk_div <= ~clk_div;
end
else begin
clk_div <= clk_div;
end
end
// 9分頻
else begin
// 4高5低
if (cnt9 == 3'b0 || cnt9 == 3'b100) begin
clk_div <= ~clk_div;
end
else begin
clk_div <= clk_div;
end
end
end
endmodule
仿真波形如下
半整數(shù)分頻
半整數(shù)分頻實(shí)際上就是特殊一點(diǎn)的小數(shù)分頻,可以按照小數(shù)分頻的方法完成,也可以利用時(shí)鐘的雙邊沿特性完成。
利用雙邊沿特性
假設(shè)要進(jìn)行5.5倍分頻,那么讓分頻后的時(shí)鐘信號2.5個(gè)原周期為高電平,3個(gè)原時(shí)鐘周期為低電平。這樣的信號要由兩個(gè)沿不同時(shí)鐘沿變化的信號產(chǎn)生:
- 由5時(shí)鐘周期(沿上升沿變化,2周期高電平,3周期低電平)和6時(shí)鐘周期的信號(沿上升沿變化,2周期高電平,4周期低電平)組成。
- 由5時(shí)鐘周期(沿下降沿變化,2周期高電平,3周期低電平)和6時(shí)鐘周期的信號(沿下降沿變化,2周期高電平,4周期低電平)組成。
- 將信號1和信號2相或得到 5.5倍分頻的信號。
module half_int_div(
input wire clk,
input wire rstn,
output wire clko
);
reg clkp;
reg clkn;
assign clko = clkp | clkn;
reg [3:0] cnt;
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
cnt <= 4'b0;
end
else if(cnt == 4'b1010) begin
cnt <= 4'b0;
end
else begin
cnt <= cnt + 1'b1;
end
end
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
clkp <= 1'b0;
end
else if(cnt == 4'd0 || cnt == 4'd1 || cnt == 4'd6 || cnt == 4'd7) begin
clkp <= 1'b1;
end
else begin
clkp <= 1'b0;
end
end
always @(negedge clk or negedge rstn) begin
if(~rstn) begin
clkn <= 1'b0;
end
else if(cnt == 4'd1 || cnt == 4'd2 || cnt == 4'd6 || cnt == 4'd7) begin
clkn <= 1'b1;
end
else begin
clkn <= 1'b0;
end
end
endmodule
仿真波形如下
利用小數(shù)分頻的思路
假設(shè)要進(jìn)行5.5倍分頻,相當(dāng)于在11個(gè)原時(shí)鐘周期里進(jìn)行了兩次5.5分頻。采用5分頻和6分頻來實(shí)現(xiàn)5.5分頻。那么文章來源:http://www.zghlxwxcb.cn/news/detail-816500.html
5N + 6M = 11
N + M = 2
=>
N = 1, M = 1
也就是說在11個(gè)原時(shí)鐘周期里進(jìn)行了一次5分頻和一次6分頻。文章來源地址http://www.zghlxwxcb.cn/news/detail-816500.html
到了這里,關(guān)于Verilog時(shí)鐘分頻(偶數(shù)分頻、奇數(shù)分頻、小數(shù)分頻、半整數(shù)分頻)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!