择要
文章为学习记载。绘制时序图,编码。通过修改分频值参数,实现恣意整数分频器计划。
一、时序图
二、步调计划
2.1 rtl
- module divider
- #(
- parameter DIV_VALUE = 5
- )
- (
- input wire sys_clk , //系统时钟 50MHz
- input wire sys_rst_n , //全局复位
- output reg clk_flag //指示系统时钟分频后的脉冲标志信号
- );
- function integer clogb2 (input integer bit_depth);
- begin
- for(clogb2=0; bit_depth>0; clogb2=clogb2+1)
- bit_depth = bit_depth >> 1;
- end
- endfunction
- localparam CNT_MAX = clogb2(DIV_VALUE -1);
- reg [CNT_MAX: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
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |