通用的Verilog HDL 奇数偶数分频器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Verilog HDL的分频器设计
Verilog HDL的分频器设计作者:nyj
文中的第一个模块为通用的偶分频模块,第二个模块为通用的奇分频模块,2个模块分频占空比都为1:1,使用时只需将相应模块中parameter DIV_N = N; 中的N改为想要的分频数即可。
/********************************************
**File name: Divide_Frequency_module
**Author: nyj
**Version:
**Data: 11/7/17
**Description: Even divide FPGA CLK frequency
**********************************************/
module Divide_Frequency_module
(
input CLK_In,
input RSTn,
output CLK_Out
);
/*****************************************/
parameter DIV_N = N;
/***********************************************/
reg [DIV_N:0] count;
reg clk_N;
always @ ( posedge CLK_In or negedge RSTn )
begin
if(!RSTn)
begin
count <= 1'b0;
clk_N <= 1'b0;
end
else if( count == DIV_N/2 - 1'b1)
begin
count <= 1'b0;
clk_N <= ~clk_N;
else
count <= count + 1'b1;
end
/***********************************************/ assign CLK_Out = clk_N;
/*************************************************/ endmodule
module Divide_Frequency_module
(
input CLK_In,
input RSTn,
output CLK_Out
);
/*****************************************/ parameter DIV_N = N;
/***********************************************/ reg [DIV_N:0] count_p;
always @ ( posedge CLK_In or negedge RSTn )
begin
if(!RSTn)
count_p <= 1'b0;
else if( count_p == DIV_N - 1'b1)
count_p <= 1'b0;
else
count_p <= count_p + 1'b1;
end
/***********************************************/ reg [DIV_N:0] count_n;
always @ ( negedge CLK_In or negedge RSTn)
if(!RSTn)
count_n <= 1'b0;
else if(count_n == DIV_N - 1'b1)
count_n <= 1'b0;
else
count_n <= count_n + 1'b1;
end
/************************************************/ reg clk_N_p;
always @ ( posedge CLK_In or negedge RSTn )
begin
if(!RSTn)
clk_N_p <= 1'b0;
else if(count_p <= DIV_N/2)
clk_N_p <= 1'b1;
else
clk_N_p <= 1'b0;
end
/***********************************************/
reg clk_N_n;
always @ ( negedge CLK_In or negedge RSTn )
begin
if(!RSTn)
clk_N_n <= 1'b0;
else if(count_n <= DIV_N/2)
clk_N_n <= 1'b1;
else
clk_N_n <= 1'b0;
end
/***************************************************/ assign CLK_Out = (clk_N_p & clk_N_n) ? 1'b1 : 1'b0;
/*************************************************/ endmodule