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高电平只有一个周期。 只能说是思想不错,可以研究研究,灵活应用吧,呵呵
文章评论(0条评论)
登录后参与讨论