2.4.8分频电路的实现方法
2N 分频电路的实现方法
1 目的
分频系数较大的2N 分频电路需要采用标准计数器来实现,此处的方法是直接将计数器的相应位赋给分频电路的输出信号即可实现分频功能。采用这个方法的好处是:一是不需要定义中间信号,设计简单,节约资源;二是可以避免毛刺现象的发生,从而避免了逻辑错误产生的可能性。
下面采用VHDL 和Verilog 两种语言实现的2分频、4分频和8分频。
2 VHDL实现(不带复位信号)
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_arith.ALL;
USE IEEE.std_logic_unsigned.ALL;
ENTITY clk_8div_2 IS
PORT(CLK:IN std_logic;
CLK_DIV2:OUT std_logic;
CLK_DIV4:OUT std_logic;
CLK_DIV8:OUT std_logic);
END clk_8div_2;
ARCHITECTURE rtl OF clk_8div_2 IS
SIGNAL counter:std_logic_vector(2 DOWNTO 0);
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK’event AND CLK=’1’) THEN
IF (counter = “111”) THEN
count’0’);
ELSE
counter
END IF;
END PROCESS;
CLK_DIV2
CLK_DIV4
CLK_DIV8
END rtl;
3 Verilog实现(有复位信号)
3.1
module clk_8div_2(
input CLK,
output CLK_DIV2,
output CLK_DIV4,
output CLK_DIV8,
input RESET
);
reg [2:0] clk_counter;
always @ (posedge CLK or posedge RESET) begin
if (RESET)
begin clk_counter
end
begin clk_counter
assign CLK_DIV2 = clk_counter[0]; assign CLK_DIV4 = clk_counter[1]; assign CLK_DIV8 = clk_counter[2];
endmodule
3.2 测试文件
module test_clk;
// Inputs reg CLK; reg RESET; // Outputs wire CLK_DIV2; wire CLK_DIV4; wire CLK_DIV8; // Instantiate the Unit Under Test (UUT) clk_8div_2 uut ( .CLK(CLK),
); .CLK_DIV4(CLK_DIV4), .CLK_DIV8(CLK_DIV8), .RESET(RESET) initial begin // Initialize Inputs CLK = 0; RESET = 1; // Wait 100 ns for global reset to finish #100;
RESET = 0;
end
always #10 CLK
3.3 仿真波形