|
此程序没有除法运算,与 /thread-3964-1-1.html 使用的算法不同。
上电后从20KHz开始扫频,加到100Khz再减回去,以此类推。
- module clk_div5( //时钟5分频模块
- input in,
- output reg out
- );
- reg Q = 1'b0;
- wire x2 = Q ^ in;
- reg [2:0] i = 1'b0;
- always @(posedge x2) begin
- Q <= !Q;
- i = i + 1'b1;
- if(i >= 5) begin
- i = 1'b0;
- out = !out;
- end
- end
- endmodule
- module clk_div( //时钟分频模块 输出频率=输入频率/分频因子/2
- input clk, //时钟输入
- input [7:0] div, //分频因子
- output reg out //分频输出
- );
- reg [7:0] i;
- initial begin
- i = 1'b0;
- out = 1'b1;
- end
- always @(posedge clk) begin
- i = i + 1'b1;
- if(i >= div) begin
- i = 0;
- out <= !out;
- end
- end
- endmodule
- module main(
- input clk, //50Mhz 板载时钟输入 Pin17
- output out //扫频信号输出 20Khz~100Khz Pin40
- );
- wire clk_10Mhz;
- clk_div5 clk_div5(
- .in(clk), //50Mhz输入
- .out(clk_10Mhz) //10Mhz输出
- );
- reg [7:0] div; //分频因子 (值越小频率越高)
- reg ab; //1:因子增加(频率减小) 0:因子减小(频率增加)
- initial begin
- ab = 1'b0;
- div = 8'd250; // 10000000/250/2=20000Hz
- end
- clk_div clk_div(
- .clk(clk_10Mhz),
- .div(div),
- .out(out)
- );
- reg [19:0] z; //扫频频率步进分频寄存器
- always @(posedge clk_10Mhz) begin
- z <= z + 1;
- end
- always @(posedge z[19]) begin
- div = ab ? (div + 1'b1) : (div - 1'b1);
- if(div == 50 || div == 250) begin
- ab <= !ab;
- end
- end
- endmodule
复制代码 |
|