原创 verilog分频

2011-1-5 19:42 2665 7 7 分类: FPGA/CPLD

fpga程序里经常会遇见给一个50 MHZ的clk,然后产生一个可变频率的clk‘。尤其是在电机控制中,加减速需要便频率,而fpga中除法又比较耗资源。今天看到一个程序,觉得思想不错,整理如下。

 

/*******************************************************************

*Project Name      :frediv

*Module        Name      :frediv

*Target Device       :

*Clkin                   :50M

*Desisgner             :kang

*Date                           :2011-01-05

*Version                :1.00

*Descriprion   :clk_div is the result of clk divided by num_div

*Additional Comments  :

*******************************************************************/

module frediv(

//input signals

input                     clk,

input                     rst,

input       [7:0]       num,

//output signals

output            clk_div

                            );

/**********************************************************************

*clk counter

**********************************************************************/

reg [7:0] counter;

always @(posedge clk or negedge rst)

       begin

       if(!rst) counter<=0;

       else counter<=counter+1'b1;

       end

      

/**********************************************************************

*pulse_divide

**********************************************************************/

wire [7:0] pulse_divide;

 

assign pulse_divide[7]=clk&(counter[0]==1'b1);

assign pulse_divide[6]=clk&(counter[1:0]==2'b10);

assign pulse_divide[5]=clk&(counter[2:0]==3'b100);

assign pulse_divide[4]=clk&(counter[3:0]==4'b1000);

assign pulse_divide[3]=clk&(counter[4:0]==5'b10000);

assign pulse_divide[2]=clk&(counter[5:0]==6'b100000);

assign pulse_divide[1]=clk&(counter[6:0]==7'b1000000);

assign pulse_divide[0]=clk&(counter[7:0]==8'b10000000);

 

/**********************************************************************

*clk_divide

**********************************************************************/

assign clk_div=(num[0]&pulse_divide[0])|

                                          (num[1]&pulse_divide[1])|

                                          (num[2]&pulse_divide[2])|

                                          (num[3]&pulse_divide[3])|

                                          (num[4]&pulse_divide[4])|

                                          (num[5]&pulse_divide[5])|

                                          (num[6]&pulse_divide[6])|

                                          (num[7]&pulse_divide[7]);

      

endmodule

 

 

程序中使用的num是8位数的,如果clk正好是256HZ,那么输出的clk_div输出的脉冲就正好是num HZ,但此程序限制输入clk的频率正好是2的N次方倍,否则不准。还有就是得出的clk_div高电平只有一个周期。 只能说是思想不错,可以研究研究,灵活应用吧,呵呵

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条