一 、占空比50%的任意奇数分频

   如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。这种方法可以实现任意的奇数分频。归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数选定到某一个值进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。

 /*********************************************************************************
* Company :
* Engineer : 空气微凉
*
* Create Date : 00:00:00 22/03/2013
* Design Name :
* Module Name :
* Project Name :
* Target Devices :
* Tool versions :
* Description :
* http://www.cnblogs.com/kongqiweiliang/
* Dependencies :
*
* Revision :
* Revision : 0.01 - File Created
* Additional Comments :
********************************************************************************/
`timescale 1ns/1ps
`define UD #
/*******************************************************************************/
module three
(
//system interface
input iCLK_50 ,//50MHz
input iRESET ,//system interface
//Interface package
output oCLK_3 ,//
output oCLK_5 ,//
output oCLK_7 ,//
output oCLK_9 ,//
output oCLK_11 ,//
output oCLK_13 ,//
output oCLK_15 ,//
output oCLK_17 ,//
output oCLK_19 //
//hardware interface
);
//-------------------------------------------------------------------------------
parameter N = ; reg [:] TIME_CNT1,TIME_CNT1_N;
reg [:] TIME_CNT2,TIME_CNT2_N; always@(posedge iCLK_50 or negedge iRESET)begin
if(!iRESET)
TIME_CNT1 <= 'h0;
else
TIME_CNT1 <= TIME_CNT1_N;
end
always@(*)begin
if(TIME_CNT1 == N - )
TIME_CNT1_N = 'h0;
else
TIME_CNT1_N = TIME_CNT1 + 'h1;
end always@(negedge iCLK_50 or negedge iRESET)begin
if(!iRESET)
TIME_CNT2 <= 'h0;
else
TIME_CNT2 <= TIME_CNT2_N;
end
always@(*)begin
if(TIME_CNT2 == N - )
TIME_CNT2_N = 'h0;
else
TIME_CNT2_N = TIME_CNT2 + 'h1;
end assign oCLK_3 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
assign oCLK_5 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
assign oCLK_7 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
assign oCLK_9 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
assign oCLK_11 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
assign oCLK_13 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
assign oCLK_15 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
assign oCLK_17 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
assign oCLK_19 = (TIME_CNT1 < ((N - )/)) | (TIME_CNT2 < ((N - )/));
//-------------------------------------------------------------------------------
endmodule
 /*********************************************************************************
* Company :
* Engineer : 空气微凉
*
* Create Date : 00:00:00 22/03/2013
* Design Name :
* Module Name :
* Project Name :
* Target Devices :
* Tool versions :
* Description :
* http://www.cnblogs.com/kongqiweiliang/
* Dependencies :
*
* Revision :
* Revision : 0.01 - File Created
* Additional Comments :
********************************************************************************/
`timescale 1ns/100ps
`define UD #
/*******************************************************************************/
module three_tb();
//-------------------------------------------------------------------------------
//system interface
reg iSYSCLK ;
reg iRESET ;
//Interface package
wire oCLK_3 ;
wire oCLK_5 ;
wire oCLK_7 ;
wire oCLK_9 ;
wire oCLK_11 ;
wire oCLK_13 ;
wire oCLK_15 ;
wire oCLK_17 ;
wire oCLK_19 ;
//hardware interface
//-------------------------------------------------------------------------------
//测试实例设计
//-------------------------------------------------------------------------------
initial begin
iRESET = ;
iSYSCLK = ;
#
iRESET = ;
iSYSCLK = ;
end always # iSYSCLK = ~iSYSCLK ; //-------------------------------------------------------------------------------
//例化被测试工程
//-------------------------------------------------------------------------------
three m_three
(
//system interface
.iCLK_50 (iSYSCLK ),//50MHz
.iRESET (iRESET ),//system interface
//Interface package
.oCLK_3 (oCLK_3 ),//
.oCLK_5 (oCLK_5 ),//
.oCLK_7 (oCLK_7 ),//
.oCLK_9 (oCLK_9 ),//
.oCLK_11 (oCLK_11 ),//
.oCLK_13 (oCLK_13 ),//
.oCLK_15 (oCLK_15 ),//
.oCLK_17 (oCLK_17 ),//
.oCLK_19 (oCLK_19 ) //
//hardware interface
);
//*******************************************************************************
endmodule

每天进步一点点------verilog语言实现的分频-LMLPHP

二 、任意占空比的任意分频

FPGA系统时钟是50M Hz,而我们要产生的频率是880Hz,那么,我们需要对系统时钟进行分频。很容易想到用计数的方式来分频:50000000/880 = 56818。显然这个数字不是2的整幂次方,那么我们可以设定一个参数,让它到56818的时候重新计数就可以实现了。程序如下:

 module div(clk, clk_div);

 input clk;

 output clk_div;

 reg [:] counter;

 always @(posedge clk)

 if(counter==) counter <= ;

 else counter <= counter+;

 assign clk_div = counter[];

 endmodule

下面我们来算一下它的占空比:我们清楚地知道,这个输出波形在counter为0到32767的时候为低,在32768到56817的时候为高,占空比为40%多一些,如果我们需要占空比为50%,那么我们需要再设定一个参数,使它为56817的一半,使达到它的时候波形翻转,就可以实现结果了。程序如下:

 module div(clk, clk_div);

 input clk;

 output clk_div;

 reg [:] counter;

 always @(posedge clk)

 if(counter==) counter <= ;

 else counter <= counter+;

 reg clk_div;

 always @(posedge clk)

        if(counter==) clk_div <= ~clk_div;

 endmodule

继续让我们来看如何实现任意占空比,比如还是由50 M分频产生880Hz,而分频得到的信号的占空比为30%。 56818×30%=17045

 module div(clk,reset,clk_div,counter);

 input clk,reset;

 output clk_div;

 output [:] counter;

 reg [:] counter;

 reg clk_div;

 always @(posedge clk)

 if(!reset) counter <= ;

 else if(counter==) counter <= ;

 else counter <= counter+;

 always @(posedge clk)

 if(!reset) clk_div <= ;

 else if(counter<) clk_div <= ;

 else clk_div <= ;

 endmodule
05-17 08:42