大家好,最近写了一些分频器的设计,发现奇数分频和偶数分频是比较常用分频效果,所以写了一个比较简单的分频代码,适用于奇数分频和偶数分频(不考虑占空比),代码已经经过测试,需要可自取。
- `timescale 1ns / 1ps
-
- module CLK_DIV_ODDandEVEN
- #(
- parameter Multiple = 6 //Multiple表示的是倍频倍数。
- )
- (
- input sys_rst,
- input sys_clk,
- output clk_div ,
- output [15:0] cnt
- );
-
-
- reg [15:0] cnt=16'b0;
- always@(posedge sys_clk)
- begin
- if(sys_rst) //复位信号,高有效
- begin
- cnt <= 16'b0;
- end
- else
- if(cnt == (Multiple -1))
- begin
- cnt <=16'b0;
- end
- else
- begin
- cnt <= cnt + 1'b1 ;
- end
- end
-
- reg clk_div=1'b0;
- always@(posedge sys_clk)
- begin
- if(sys_rst) //复位信号,高有效
- begin
- clk_div <= 1'b0;
- end
- else
- if(cnt <= (Multiple /2 ))
- begin
- clk_div <= 1'b0 ;
- end
- else
- begin
- clk_div <= 1'b1 ;
- end
- end
-
- endmodule
- `timescale 1ns / 1ps
-
-
-
- module CLK_DIV_ODDandEVEN_TB;
-
- // Inputs
- reg sys_rst;
- reg sys_clk;
-
- // Outputs
- wire clk_div;
- wire [15:0] cnt;
-
- // Instantiate the Unit Under Test (UUT)
- CLK_DIV_ODDandEVEN uut (
- .sys_rst(sys_rst),
- .sys_clk(sys_clk),
- .clk_div(clk_div),
- .cnt(cnt)
- );
-
- initial begin
- // Initialize Inputs
- sys_rst = 1;
- sys_clk = 0;
-
- // Wait 100 ns for global reset to finish
- #100;
- sys_rst = 0;
- forever #500 sys_clk=~sys_clk;
-
- // Add stimulus here
-
- end
-
- endmodule
-
由图1和图2可知,通过改变代码中参量multiple可实现任意倍数分频效果。multiple表示分频倍数。
下面对代码和仿真结果进行说明:
①sys_clk是系统时钟,本代码中作为被分频时钟。
②clk_div是分频后时钟。
③cnt是计数器,作为分频计数使用。
④sys_rst是复位信号,高有效。
感谢关注!