Verilog任意分频器设计
Verilog任意分频器设计
有关奇分频的思考
(这篇⽂章的⼀些写法⽐较简洁)
占空⽐⼩于50%的两个clk信号
占空⽐⼤于50%的两个clk信号
对⽐
明星照片女所以不要死板的记,以上⾯的2,3电平为例:如果⾼电平多,就需要交错半个clk周期进⾏与运算,正好去掉半个周期的,⾼低电平就相同了。
如果是低电平多,就是交错之后或运算,⾼低电平就相同。
Verilog任意分频器设计
把所有的分频模块并⾏同时进⾏,只是依据参数选择性的输出。
// parameter 参数化的⽅法将偶数分频和奇数分频都做成通⽤的任意分频模块,⽅便以后的调⽤
module divider_api
飞机手工#(
parameter CLK_DIV =12'd5,// 分频数
CNT_WIDTH =12'd5 // 分频器位宽
)
(
input wire sys_clk ,//系统时钟50Mhz
input wire sys_rst_n ,//全局复位
output wire clk_out //对系统时钟分频后的信号
)
;
//偶分频信号
reg clk_even ;
reg [CNT_WIDTH-1:0] clk_even_cnt ;
//奇分频信号
wire clk_odd ;大班亲子游戏
reg clk_1 ;
reg clk_2 ;
reg [CNT_WIDTH-1:0] clk_1_cnt ;
reg [CNT_WIDTH-1:0] clk_2_cnt ;
//所有的分频模块时同时进⾏的,只是依据参数选择性的输出
assign clk_out =(CLK_DIV ==1)? sys_clk :(CLK_DIV[0]? clk_odd : clk_even);//只需判断最后⼀位是0还是1即可assign clk_odd = clk_1 & clk_2;
//偶分频
always @(podge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
贫困户申请书begin
clk_even_cnt <=0;
clk_even <=1'b0 ;
end
el if(clk_even_cnt == CLK_DIV /2-1)//计数到⼀半时翻转,计数器继续加
begin
clk_even_cnt <= clk_even_cnt +1'b1;
clk_even <=~clk_even;
end
el if(clk_even_cnt == CLK_DIV -1)//计数满时翻转,计数器清零
begin
clk_even_cnt <=0;
clk_even <=~clk_even;
end我眼中的林黛玉
el//其他情况计数器加⼀,clkeven保持不变即可
begin
clk_even_cnt <= clk_even_cnt +1'b1;
clk_even <= clk_even;
end
end
//奇分频——clk1:上升沿触发
always @(podge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
begin
clk_1_cnt <=0;
clk_1 <=1'b0 ;
end
el if(clk_1_cnt ==(CLK_DIV -1)/2)//计数到⼀半时翻转,计数器继续加 begin
clk_1_cnt <= clk_1_cnt +1'b1 ;
clk_1 <=~clk_1 ;
end
el if(clk_1_cnt == CLK_DIV -1)//计数满时翻转,计数器清零
begin
clk_1_cnt <=0;
clk_1 <=~clk_1 ;
end
el
begin
clk_1_cnt <= clk_1_cnt +1'b1 ;
clk_1 <= clk_1 ;
end
end
//奇分频——clk2:下降沿触发
always @(negedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
begin
clk_2_cnt <=0;
clk_2 <=1'b0 ;
end
el if(clk_2_cnt ==(CLK_DIV -1)/2)//计数到⼀半时翻转,计数器继续加 begin
clk_2_cnt <= clk_2_cnt +1'b1 ;
clk_2 <=~clk_2 ;
end
el if(clk_2_cnt == CLK_DIV -1)//计数满时翻转,计数器清零
begin
clk_2_cnt <=0;
clk_2 <=~clk_2 ;
end
el
begin
clk_2_cnt <= clk_2_cnt +1'b1 ;
clk_2 <= clk_2 ;
end
end
endmodule
Testbench
`timescale 1ns/1ns
oppo音乐手机
module divider_api_tb();
竹简笔画//wire define
wire clk_out;
//reg define
reg sys_clk;
reg sys_rst_n;
/
/初始化系统时钟、全局复位
initial begin
sys_clk =1'b1;
sys_rst_n <=1'b0;
#20
sys_rst_n <=1'b1;
end
//sys_clk:模拟系统时钟,每10ns电平翻转⼀次,周期为20ns,频率为50Mhz always #10 sys_clk =~sys_clk;
divider_api
#(
.CLK_DIV (12'd10),
T_WIDTH (12'd5)
)
divider_api_inst
(
.sys_clk (sys_clk ),//input sys_clk
.sys_rst_n (sys_rst_n ),//input sys_rst_n
.clk_out (clk_out )//output clk_out
变色龙英文);
endmodule
10分频
25分频