理论学习
数字电路中时钟占有非常重要的地位。时间的计算都依靠时钟信号作为基本单元。一般而言,一块板子只有一个晶振,即只有一种频率的时钟,但是数字系统中,经常需要对基准时钟进行不同倍数的分频,进而得到各模块所需的频率。
若想得到比系统时钟更慢的时钟,可以将基准时钟进行分频。
若想得到比系统时钟更快的时钟,可以将基准时钟进行倍频。
不管是分频还是倍频,都通过PLL实现或者用verilog描述实现。
我们用verilog实现的一般是分频电路,即分频器。分频电路是数字系统设计中常用的基本电路之一。
分频器分为偶数分频和奇数分频。
偶数分频demo1
module divider_sex
(input wire sys_clk ,input wire sys_rst_n ,output reg clk_out
);reg [1:0] cnt ;always@( posedge sys_clk or negedge sys_rst_n )beginif( sys_rst_n == 1'b0 )begincnt <= 2'd0 ;endelse if( cnt == 2'd2 )begincnt <= 2'd0 ;endelsebegincnt <= cnt + 1'b1 ;endendalways@(posedge sys_clk or negedge sys_rst_n )beginif( sys_rst_n == 1'b0 )beginclk_out <= 1'b0 ;end else if( cnt == 2'd2 )beginclk_out <= ~clk_out ;endendendmodule
偶数分频demo2
module divider_six
(input wire sys_clk ,input wire sys_rst_n ,outpur reg clk_out
);reg [2:0] cnt ;always@( posedge sys_clk or negedge sys_rst_n )beginif( sys_rst_n == 1'b0 )begincnt <= 3'd0 ;endelse if( cnt == 3'd5 )begincnt <= 3'd0 ;endelsebegincnt <= cnt + 1'b1 ;endendalways@( posedge sys_clk or negedge sys_rst_n )beginif( sys_rst_n == 1'b0 )beginclk_out <= 1'b0 ;endelse if( cnt == 3'd4 )beginclk_out <= 1'b1 ;endelse beginclk_out <= 1'b0 ; endendendmodule
偶数分频对应的tb
`timescale 1ns/1nsmodule tb_divider_six();reg sys_clk ;reg sys_rst_n ;wire clk_out ;initialbeginsys_clk = 1'b1 ;sys_rst_n <= 1'b0 ;#20 ;sys_rst_n <= 1'b1 ;endalways #10 sys_clk <= ~sys_clk ;divider_six divider_six_inst(.sys_clk (sys_clk) ,.sys_rst_n (sys_rst_n) ,.clk_out (clk_out));endmodule
奇数分频
module divider_five
(input wire sys_clk ,input wire sys_rst_n ,output wire clk_out
);reg [2:0] cnt ;reg clk1 ;reg clk2 ;always@( posedge sys_clk or negedge sys_rst_n )beginif( sys_rst_n == 1'b0 )begincnt <= 3'd0 ;endelse if( cnt == 3'd4 )begincnt <= 3'd0 ;endelsebegincnt <= cnt + 1'b1 ;endend//clk1always@( posedge sys_clk or negedge sys_rst_n ) beginif( sys_rst_n == 1'b0 )beginclk1 <= 1'b1 ;endelse if( cnt == 3'd2 )beginclk1 <= 1'b0 ;endelsebeginclk1 <= 1'b1 ;endend//clk2always@( negedge sys_clk or negedge sys_rst_n )beginif( sys_rst_n == 1'b0 )beginclk2 <= 1'b1 ;endelse if( cnt == 3'd2 )beginclk2 <= 1'b0 ;endelsebeginclk2 <= 1'b1 ;endendassign clk_out = clk1 & clk2 ;endmodule
奇数分频的tb
`timescale 1ns/1nsmodule tb_divider_five();reg sys_clk ; reg sys_rst_n ;wire clk_out ;initialbeginsys_clk = 1'b1 ;sys_rst_n <= 1'b0 ;#20 ;sys_rst_n <= 1'b1 ; endalways #10 sys_clk <= ~sys_clk ;divider_five divider_five_inst(.sys_clk (sys_clk) ,.sys_rst_n (sys_rst_n) ,.clk_out (clk_out));endmodule