文章目录
- 摘要
- 一、时序图
- 二、程序设计
- 2.1 rtl
- 2.2 tb
- 三、仿真分析
- 四、实用性
摘要
文章为学习记录。绘制时序图,编码。通过修改分频值参数,实现一定范围分频值内的任意分频器设计。
一、时序图
二、程序设计
2.1 rtl
module divider
#(
parameter DIV_VALUE = 5
)
(
input wire sys_clk , //系统时钟 50MHz
input wire sys_rst_n , //全局复位
output reg clk_flag //指示系统时钟分频后的脉冲标志信号
);
reg [10:0] cnt; //计数
//cnt:
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
cnt <= 'b0;
else if(cnt == DIV_VALUE -1)
cnt <= 3'b0;
else
cnt <= cnt + 1'b1;
end
//clk_flag:脉冲信号指示
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
clk_flag <= 1'b0;
else if(cnt == DIV_VALUE -2)
clk_flag <= 1'b1;
else
clk_flag <= 1'b0;
end
endmodule
2.2 tb
module tb_divider();
reg sys_clk ; //系统时钟 50MHz
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
//sys_clk:模拟系统时钟,每 10ns 电平翻转一次,周期为 20ns,频率为 50MHz
always #10 sys_clk = ~sys_clk;
divider
#(
. DIV_VALUE(5)
)
divider_inst1
(
. sys_clk (sys_clk), //系统时钟 50MHz
. sys_rst_n(sys_rst_n) , //全局复位
. clk_flag(clk_flag) //指示系统时钟分频后的脉冲标志信号
);
endmodule
三、仿真分析
5分频:
系统时钟周期20ns,clk_flag周期100ns。
10分频:
系统时钟周期20ns,clk_flag周期200ns。
四、实用性
确保系统时钟继续作为工作时钟:
系统时钟是由外部晶振直接通过管脚连接到了 FPGA 的专用时钟管脚上,会连接到全局时钟网络,能够使时钟信号到达每个寄存器的时间都尽可能相同,以保证更低的时钟偏斜(Skew)和抖动(Jitter)。
always@(posedge sys_clk or negedge sys_rst_n)
begin
if(sys_rst_n == 1'b0)
A <= 4'b0;
else if(clk_flag == 1'b1)
A <= A + 1'b1;
end