奇数分频之前本科做过很多,现在突然又忘了,最近在整理代码,把一些简单的小代码整理起来,以便以后随时查看。
奇数分频采用时钟的上升沿和下降沿分别计数分频得到两个占空比不为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