一、將系統(tǒng)時鐘50MHZ分為占空比為50%的1khz時鐘
本篇文章使用Xilinx公司的ISE軟件
1. 頻率:1HZ 周期為1/1HZ=1s。按照這個計算公式計算出頻率為1khz的周期為1ms
2. 因為占空比為50%,在寫代碼時需要一個0.5ms的計數(shù)器
PS: 占空比:占空比是指在一個脈沖循環(huán)內(nèi),通電時間相對于總時間所占的比例。(在FPGA中我的理解為高電平在一個時鐘周期所占的時間)
<代碼如下>
module clk_1KHZ(clk,rst_n,clk_1khz );
input clk ; //50MHZ
input rst_n ;
output reg clk_1khz ; //T=1ms 占空比為50%
reg[17:0] cnt;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 1'b0;
else if (cnt == 18'd25_000 - 1)//
cnt <= 18'd0;
else
cnt <= cnt + 1'b1;
end
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
clk_1khz <= 1'b0;
else if (cnt == 18'd24_999)
clk_1khz <= ~clk_1khz ;
else
clk_1khz <= clk_1khz ;
end
endmodule
1khz分頻-testbench
module tb;
// Inputs
reg clk;
reg rst_n;
// Outputs
wire clk_1khz;
// Instantiate the Unit Under Test (UUT)
clk_1KHZ uut (
.clk(clk),
.rst_n(rst_n),
.clk_1khz(clk_1khz)
);
always #10 clk = ~clk;
initial begin
clk = 0;
rst_n = 0;
#100;
rst_n=1;
end
endmodule
仿真圖如下
二、偶數(shù)分頻:
- 通過計數(shù)器實現(xiàn),進行N倍偶數(shù)分頻,通過時鐘觸發(fā)計數(shù)器計數(shù),當計數(shù)器從0計數(shù)到N/2-1時,輸出時鐘進行翻轉(zhuǎn),以此循環(huán)下去。(占空比為50%) ,以下代碼實現(xiàn)8分頻,可根據(jù)實際需求改變參數(shù)輸出需要的時鐘。
<代碼如下>
module clk_div_o(clk,rst_n,div_clk_out);
input clk ;
input rst_n ;
output div_clk_out ;
//偶數(shù)分頻部分
parameter N = 8 ;
reg div_clk_out;
reg [7:0] cnt ;
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cnt <= 1; //從1計數(shù)
div_clk_out <= 0;
end
else begin
if(cnt==N/2)
begin
div_clk_out <= ~div_clk_out;
cnt <= 1;
end
else
cnt <= cnt + 1;
end
end
endmodule
偶數(shù)分頻testbench
module tb;
// Inputs
reg clk;
reg rst_n;
// Outputs
wire div_clk_out;
// Instantiate the Unit Under Test (UUT)
clk_div_o uut (
.clk(clk),
.rst_n(rst_n),
.div_clk_out(div_clk_out)
);
always #10 clk = ~clk;
initial begin
// Initialize Inputs
clk = 0;
rst_n = 0;
#100
rst_n = 1;
end
endmodule
仿真圖如下:
三、奇數(shù)分頻:
-
以7分頻為例。接下來會介紹兩種實現(xiàn)方法(占空比為50%)
(1)高電平:低電平 = 4 :3(即 1:0 = 4 :3)
(2)低電平:高電平 = 4 :3(即 0:1 = 4 :3)
二者實現(xiàn)方式相同,這里只介紹第一種方法
時序圖如下
由時序圖看出分別用時鐘上升沿和下降沿得到高電平:低電平 = 4 :3,然后將兩者相與就可以得到7分頻占空比為50%的時鐘<代碼如下>
module clk_div_j(clk,rst_n,clk_out );
input clk ;
input rst_n ;
output clk_out;
parameter N = 7;//分頻數(shù)
reg [7:0] cnt_1;
reg [7:0] cnt_2;
reg clk_pos,clk_neg;
// 1:0 4:3 &
// 0:1 4:3 |
always @(posedge clk or negedge rst_n) //上升沿輸出clk_pos
begin
if(!rst_n)
begin
clk_pos <= 0;
cnt_1 <= 1; //這里計數(shù)器從1開始
end
else
begin
if(clk_pos == 1)
begin
if(cnt_1 == (N+1)/2) //4
begin
clk_pos <= ~clk_pos;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1 + 1;
end
else if(cnt_1 == (N-1)/2) //3
begin
clk_pos <= ~clk_pos;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1 + 1;
end
end
always @(negedge clk or negedge rst_n)
//下降沿輸出clk_neg
begin
if(!rst_n)
begin
clk_neg <= 0;
cnt_2 <= 1;
end
else
begin
if(clk_neg == 1)
begin
if(cnt_2 == (N+1)/2) //4
begin
clk_neg <= ~clk_neg;
cnt_2 <= 1;
end
else
cnt_2 <= cnt_2+1;
end
else
if(cnt_2 == (N-1)/2) //3
begin
clk_neg <= ~clk_neg;
cnt_2 <= 1;
end
else
cnt_2 <= cnt_2+1;
end
end
assign clk_out = clk_pos & clk_neg;
endmodule
奇數(shù)分頻testbench
module tb;
// Inputs
reg clk;
reg rst_n;
// Outputs
wire clk_out;
// Instantiate the Unit Under Test (UUT)
clk_div_j uut (
.clk(clk),
.rst_n(rst_n),
.clk_out(clk_out)
);
always #10 clk = ~clk;
initial begin
clk = 0;
rst_n = 0;
#100;
rst_n = 1;
end
endmodule
仿真圖如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-478044.html
本篇隨筆為學習記錄所用,如有錯誤,請各位指正批評。文章來源地址http://www.zghlxwxcb.cn/news/detail-478044.html
到了這里,關(guān)于Verilog-實現(xiàn)時鐘分頻(1KHZ、奇、偶分頻,占空比為50%)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!