奇數分頻之前本科做過很多,現在突然又忘了,最近在整理代碼,把一些簡單的小代碼整理起來,以便以後隨時查看。
奇數分頻採用時鐘的上升沿和下降沿分別計數分頻得到兩個佔空比不爲50%的時鐘信號,然後在進行或操作得到輸出的佔空比爲50%的時鐘。
下面是奇數分頻的小代碼,親測可以實現。
//奇數分頻代碼
//作者:昌磊
//單位:電子科技大學
//時間:2017.9.28
module odd_divide(
clk,
rst_n,
clk_odd,
clk_up,
clk_down,
cnt_down,
cnt_up
);
input clk;
input rst_n;
output clk_odd;
output clk_up;
output clk_down;
output cnt_up;
output cnt_down;
reg clk_up;
reg clk_down;
reg [3:0]cnt_up;
reg [3:0]cnt_down;
parameter N1=3,N2=6;//假設爲N分頻,則,N1=(N-1)/2,N2=N-1
assign clk_odd=clk_down|clk_up;
always@(posedge clk or negedge rst_n)
if(rst_n==1'b0)
begin
clk_up<=0;
end
else if(cnt_up==N1)
begin
clk_up<=~clk_up;
end
else if(cnt_up==N2)
begin
clk_up<=~clk_up;
end
else clk_up<=clk_up;
always@(negedge clk or negedge rst_n)
if(rst_n==1'b0)
begin
clk_down<=0;
end
else if(cnt_down==N1)
begin
clk_down<=~clk_down;
end
else if(cnt_down==N2)
begin
clk_down<=~clk_down;
end
else clk_down<=clk_down;
/********************************************/
always@(posedge clk or negedge rst_n)
if(rst_n==1'b0)
cnt_up<=4'd0;
else if(cnt_up==N2)
cnt_up<=4'd0;
else
cnt_up<=cnt_up+1'b1;
always@(negedge clk or negedge rst_n)
if(rst_n==1'b0)
cnt_down<=4'd0;
else if(cnt_down==N2)
cnt_down<=4'd0;
else
cnt_down<=cnt_down+1'b1;
endmodule
//測試代碼
`timescale 1 ns/1 ns
module odd_divide_simulation();
reg clk;
reg rst_n;
wire clk_odd;
wire clk_up;
wire clk_down;
wire [3:0]cnt_down;
wire [3:0]cnt_up;
/***********************/
odd_divide U1(
.clk(clk),
.rst_n(rst_n),
.clk_odd(clk_odd),
.clk_up(clk_up),
.clk_down(clk_down),
.cnt_down(cnt_down),
.cnt_up(cnt_up)
);
/*************************/
initial
begin
rst_n=0; #1000;rst_n=1;
clk =0;forever #25 clk=~clk;
end
endmodule