以下是奇分频代码,做了一个带参数可调的代码,用的芯片还是EP4CE10F17C8,
现在写的是5分频,如果有什么更好的设计思想,欢迎留言讨论。
module div_2nx1 //任意奇分频
#(
parameter DIV_NUM = 32'd5
)
(
input wire clk , //50Mhz
input wire rst_n , //复位
output wire div_clk
);
//localparam
localparam CNT_MAX = DIV_NUM-1'b1; // 5-1=4
reg [31:0] cnt_pose;
reg [31:0] cnt_nege;
reg clk_pose;
reg clk_nege;
//cnt_pose:上升沿计数器,0~4循环计数
always @(posedge clk ,negedge rst_n)
begin
if(~rst_n)
cnt_pose <= 32'd0;
else if(cnt_pose == CNT_MAX) //计数满,就清0
cnt_pose <= 32'd0;
else
cnt_pose <= cnt_pose +1'b1;
end
//cnt_nege:下降沿计数器 0~4循环计数
always @(negedge clk,negedge rst_n)
begin
if(~rst_n)
cnt_nege <= 32'd0; //清0
else if(cnt_nege == CNT_MAX) //计数满,就清0
cnt_nege <= 32'd0;
else
cnt_nege <= cnt_nege +1'b1;
end
//两个特殊的 clk_posedge :在上升沿变化的时钟信号
always@ (posedge clk,negedge rst_n)
begin
if(~rst_n)
clk_pose<=0;
else if(cnt_pose > CNT_MAX/2) //3-4拉高
//else if(cnt_pose>CNT_MAX>>1)
clk_pose<=1;
else
clk_pose <=0;
end
//两个特殊的 clk_negedge :在下降沿变化的时钟信号
always@ (negedge clk,negedge rst_n)
begin
if(~rst_n)
clk_nege<=0; //
else if(cnt_nege > CNT_MAX/2) //括号内 clk_nege>CNT_MAX>>1
// cnt_pose==4||cnt_pose==0
clk_nege<=1;
else
clk_nege <=0;
end
/* always@ (negedge clk,negedge rst_n)
begin
if(~rst_n)
clk_nege<=0; //
else if(cnt_pose ==2||cnt_pose== 3) //括号内 clk_nege>CNT_MAX>>1
// cnt_pose==1||cnt_pose==0
clk_nege<=1;
else
clk_nege <=0;
end */
//不可行的
//always@(posedge clk,negedge rst_n)
// begin
// div_clk=clk_pose|clk_nege;
// end
assign div_clk = clk_pose | clk_nege;
endmodule
以下是五分频用或逻辑做的时序图

以下是与逻辑做的时序图

2万+

被折叠的 条评论
为什么被折叠?



