奇数分频器 1 引言 分频器在CPLD/FPGA 设计中使用频率非常高,尽管目前大部分设计中采用芯片厂家集成的锁相环资源,但是对于要求奇数倍分频、小数倍分频的应用场合却往往不能满足要求。硬件工程师希望有一种灵活的设计方法,根据需要,在实验室就能设计分频器并马上投入使用,更改频率时无需改动原器件或电路板,只需重新编程,在数分钟内即可完成。 对于偶数分频,使用一模 N 计数器模块即可实现,即每当模 N 计数器从 0 开始计数至 N 时,输出时钟进行翻转,同时使计数器复位,使之从 0开始重新计数,以此循环即可实现。但对于奇数分频,实现 50%的占空比却是比较困难的。下面给出占空比 50%的奇数分频器的设计源程序和仿真结果。 2 VHDL 程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --添加库 ENTITY fdiv IS --设计实体 PORT( clk,reset : IN STD_LOGIC; --端口说明 preset: IN INTEGER; --preset: 分频预置数 clkou t : OUT STD_LOGIC); - -clkou t : 分频后得到的时钟 END fdiv ; ARCHITECTURE behav e OF fdiv IS --设计构造体 SIGNAL s1,s2 : STD_LOGIC; --内部信号 s1,s2 SIGNAL cnt : INTEGER RANGE 0 TO preset-1; --模为 preset 的计数信号 BEGIN P1: PROCESS(clk,reset) --计数器 BEGIN IF reset='1' THEN cnt<=0; ELSIF clk'ev ent AND clk='1' THEN IF cnt=0 THEN cnt<=preset-1; ELSE cnt<=cnt-1; END IF; END IF; END PROCESS; P2: PROCESS(clk,reset) --信号1 BEGIN IF reset='1' THEN s1<='1'; ELSIF clk'ev ent AND clk='1' THEN IF cnt=0 THEN --计数信号为0 时,S1 翻转 s1<=NOT s1; ELSE s1<=s1; END IF; END IF; END PROCESS; P3: PROCESS(clk,reset) --信号2 BEGIN IF reset='1' THEN s2<='1'; ELSIF clk'ev ent AND clk='0' THEN IF cnt=(preset-1)/2 THEN --计数信号为N 时,S2 翻转 s2<=NOT s2; ELSE s2<=s2; END IF; END IF; END PROCESS; clkou t<= s1 XOR s2; -- 异或输出 END BEHAVE; 程序说明:以上程序实现任意奇数为PRESET 的 50%占空比分频,计数器 CNT 的模值为PRESET,计数器是为了控制信号S1 和信号S2,使两信号保持恒定的时间差。信号S1 为上升沿触发,在 CNT=0 时...