前言
如果将6分频(一)中的clk_out直接当作低频时钟来用并不严谨,它和真正的系统时钟还是有所区别的,这种低频信号并没有连接到全局时钟网络上,其衍生的问题在低速系统中不易察觉,但在高速系统中会很容易出现问题,这时使用脉冲标识信号flag从而解决这个问题。
一、代码
1.rtl代码
代码如下(示例):
module divider_six
(
input wire sys_clk,
input wire sys_rst_n,
//output reg clk_out
output reg clk_flag
);
//声明寄存器变量
reg [2:0] cnt;
/* always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt<=2'd0;
else if(cnt == 2'd2)
cnt<=2'd0;
else
cnt<=cnt+2'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
clk_out<=1'b0;
else if(cnt == 2'd2)
clk_out<=~clk_out;
else//复位信号为高无效且没有记数到最大值
clk_out<=clk_out;//保持为原来的电平 */
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt<=2'd0;
else if(cnt == 3'd5)
cnt<=2'd0;
else
cnt<=cnt+2'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
clk_flag<=1'b0;
else if(cnt == 3'd4)//最大值-1
clk_flag<=1'h1;//保持一个时钟周期高电平
else
clk_flag<=1'b0;
endmodule
2.RTL视图
2.测试代码
代码如下(示例):
`timescale 1ns/1ns
module tb_divider_six();
reg sys_clk;
reg sys_rst_n;
wire clk_flag;
initial
begin
sys_clk=1'b1;
sys_rst_n<=1'b0;
#20
sys_rst_n<=1'b1;
end
always #10 sys_clk=~sys_clk;
divider_six divider_six_inst
(
.sys_clk (sys_clk),
.sys_rst_n(sys_rst_n),
.clk_flag (clk_flag)
);
endmodule
三、仿真结果
可以看出:与绘制波形图一致,且为六分频。