VHDL/Verilog HDL实现任意整数倍分频器

本文介绍了如何使用VHDL/Verilog HDL设计任意整数倍的分频器,特别是5倍、10倍、25倍和50倍的分频。通过计数器和异或操作,可以实现奇数和偶数倍的分频。文中给出了Verilog HDL的代码示例,包括testbench,以及仿真结果验证了分频功能。
摘要由CSDN通过智能技术生成

在用HDL实现分频器的时候,主要通过写计数器计数时钟的上升/下降沿来实现。偶数倍分频十分容易实现在此不加赘述,奇数倍分频需要通过计数器生成两个波形然后进行异或操作实现奇数倍分频。
以下给出5倍分频、10倍分频的Verilog HDL程序代码,以及testbench仿真程序
Verilog程序:

module frequence_divider (
        input   clk_50MHz,
	     input   rst,
	     output  clk_10MHz,
        output  clk_5MHz	   
);
      reg [3:0] cnt;
	  reg clk_5MHz_temp;
	  reg clk_10MHz_temp1;
	  reg clk_10MHz_temp2;
	  
	  assign clk_5MHz=clk_5MHz_temp;
	  assign clk_10MHz=(clk_10MHz_temp1^clk_10MHz_temp2);//两个信号叠加产生奇数倍分频信号 
	  always@(posedge clk_50MHz or negedge rst)
	  begin 
	  if(rst==1'b0)begin
	       cnt<=4'd0;
	  end
      else begin 
	     if(cnt==4'd4)begin 
		    cnt<=4'd0;
		 end
		 else begin
		    cnt<=cnt+1'd1;
		 end
	  end
	  end
	  
	  always@(posedge clk_50MHz or negedge rst)
	  begin 
	  if(rst==1'b0)begin
  	      clk_5MHz_temp<=1'b1;
	  end 
	  else begin 
        if(cnt==4'd0)begin 
          
library IEEE; Library UNISIM; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use UNISIM.vcomponents.all; entity pin_test is port ( rst_manu_h :in std_logic; clk_in :in std_logic; FPGA_CR2 :out std_logic; FPGA_CR1 :out std_logic; FPGA_PR :out std_logic; FPGA_TCK :out std_logic; test_out :out std_logic; FPGA_RST :out std_logic --LED : out std_logic_vector(3 downto 0) ); end pin_test; architecture rtl of pin_test is signal clk_div1 : integer range 0 to 2086; signal clk_div : std_logic_vector(27 downto 0); signal clk_div2 : std_logic_vector(27 downto 0); signal clk0 : std_logic; signal clk180 : std_logic; signal clk_180 : std_logic; signal clk2x : std_logic; signal CLKFX : std_logic; signal clk : std_logic; signal clkdv : std_logic; signal clkin_buf : std_logic; signal clk_sys : std_logic; signal reset : std_logic; signal TX_CLK : std_logic; signal tem1: std_logic; signal tem2 : std_logic; begin clk <= clkin_buf ; reset <= not rst_manu_h; CLK_DIVIDOR1:process(clk) begin if(clk'event and clk = '1')then if clk_div1=2086 then --clk_div1 '0'); clk_div1 <=0; else clk_div1<= clk_div1 + 1; end if; end if; end process CLK_DIVIDOR1; CLK_DIVIDOR:process(CLKFX) begin if(CLKFX'event and CLKFX= '1') then clk_div<= clk_div + 1; end if; end process CLK_DIVIDOR; CLK_DIVIDOR2:process(CLKFX) begin if(CLKFX'event and CLKFX = '0') then clk_div2<= clk_div2 + 1; end if; end process CLK_DIVIDOR2; tem1 2068 else '0'; tem2 <= clk or tem1; test_out <= CLKFX ; FPGA_CR2 <= not tem2; FPGA_CR1 <= clk or tem1; FPGA_PR <= clk_div(15); FPGA_TCK 2068 else '0'; FPGA_RST <= clk_div(0)and clk_div2(0); --------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值