基 础 设 计
KnowledgeBase
用 Verilog 实现基于 FPGA 的
通用分频器
■ 华北电力大学(北京)信息工程系 / 唐晓燕,梁光胜,王玮
在复杂数字逻辑电路设计中,经常会用到多个不同的时
基于 S R A M 工艺的,而 S R A M 工艺的芯片在掉电后信息就会
钟信号。介绍一种通用的分频器,可实现 2~256 之间的任意
丢失,一定需要外加一片专用配置芯片,在上电的时候,由
奇数、偶数、半整数分频。首先简要介绍了 FPGA 器件的特点
这个专用配置芯片把数据加载到 FPGA 中,然后 FPGA 就可以
和应用范围。接着介绍了通用分频器的基本原理和分类,并
正常工作,由于配置时间很短,不会影响系统正常工作。 也
以分频比为奇数 7 和半整数 6.5 的分频器设计为例,介绍了
有少数 FPGA 采用反熔丝或 Flash 工艺,对这种 FPGA,就不需
在QuartusII开发软件下,利用Verilog硬件描述语言来设计数
要外加专用的配置芯片。
字逻辑电路的过程和方法。
FPGA(Field programmable Gates Array,现场可编程门
在数字逻辑电路设计中,分频器是一种基本电路。我们
阵列)都是可编程逻辑器件,它们是在 P A L、G A L 等逻辑器
常会遇到偶数分频、奇数分频、半整数分频等,在同一个设
件基础上发展起来的。同以往的 PAL、GAL 相比,FPGA/CPLD
计中有时要求多种形式的分频。通常由计数器或计数器的级
的规模比较大,适合于时序、组合等逻辑电路的应用。它可
联构成各种形式的偶数分频和奇数分频,实现较为简单。但
以替代几十甚至上百块通用 IC 芯片。这种芯片具有可编程和
对半整数分频分频实现较为困难。但在某些场合下,时钟源
实现方案容易改动等特点。由于芯片内部硬件连接关系的描
与所需的频率不成整数倍关系,此时可采用小数分频器进行
述可以存放在磁盘、R O M 、P R O M 、或 E P R O M 中,因而在可
分频。例如:时钟源信号为 130MHz,而电路中需要产生一个
编 程 门 阵 列 芯 片 及 外 围 电 路 保 持 不 动 的 情 况 下 ,换 一 块
20MHz 的时钟信号,其分频比为 6 . 5 ,因此根据不同设计的
EPROM 芯片,就能实现一种新的功能。它具有设计开发周期
需要,本文利用 Verilog 硬件描述语言,通过 MAX+plus II 开
短、设计制造成本低、开发工具先进、标准产品无需测试、质
发平台,使用 Altera 公司的 FLEX 系列 EPF10K10LC84-3 型
量稳定以及实时在检验等优点,因此,可广泛应用于产品的
FPGA ,设计了一种能够满足上述各种要求的较为通用的分频
原理设计和产品生产之中。几乎所有应用门阵列、P L D 和中
器。
小规模通用数字集成电路的场合均可应用 F P G A 和 C P L D 器
件。在现代电子系统中,数字系统所占的比例越来越大。系
基于查找表(LUT)的 FPGA 的结构特点
统发展的越势是数字化和集成化,而 F P G A 作为可编程 ASIC
(专用集成电路)器件,它将在数字逻辑系统中发挥越来越重
查找表(Look-Up-Table)简称为 LUT,LUT 本质上就是一
要的作用。
个 RAM。目前 FPGA 中多使用 4 输入的 LUT,所以每一个 LUT
可以看成一个有 4 位地址线的 16x1 的 RAM。当用户通过原理
图或 H D L 语言描述了一个逻辑电路以后,P L D / F P G A 开发软
通用分频器基本原理
件会自动计算逻辑电路的所有可能的结果,并把结果事先写
整数分频包括偶数分频和奇数分频,对于偶数 N 分频,通
入 R A M , 这样,每输入一个信号进行逻辑运算就等于输入一
常是由模 N/2 计数器实现一个占空比为 1:1 的 N 分频器,分
个地址进行查表,找出地址对应的内容,然后输出即可。由
频输出信号模 N/2 自动取反。对于奇数 N 分频,上述方法就
于 LUT 主要适合 SRAM 工艺生产,所以目前大部分 FPGA 都是
不适用了,而是由模 N 计数器实现非等占空比的奇数 N 分频
2006.5 / 电子与电脑
127
基础设计
K nowledgeBase
图 1 :半整数分频器电路组成
器,分频输出信号取得是模 N 计数中的某一位(不同 N 值范
围会选不同位)。这种方法同样适用于偶数 N 分频,但占空比
不总是 1:1,只有 2 的 n 次方的偶数(如 4、8、16 等)分频
占空比才是 1 :1 。这种方法对于奇数、偶数具有通用性。
半整数分频器也是在这种方法基础上实现的。除了一个
模 N 计数器,还需要一个异或模块和一个 2 分频模块。半整
数分频器原理如图 1 所示:
半整数分频器设计思想:通过异或门和 2 分频模块组成
一个改变输入频率的脉冲添加电路,也就是说 N-0.5 个输入
信号周期内产生了 N 个计数脉冲,即输入信号其中的一个含
一个脉冲的周期变为含两个脉冲的周期。而这一改变正是输
入频率与 2 分频输出异或的结果。由 2 分频输出决定一个周
期产生两个脉冲有两种方式:当一个输入信号来一个脉冲
(前半周期)时,2 分频输出变为‘1’,clk_in 取反,后半周
期就会产生一个脉冲;2 分频输出由‘1’变为‘0’时,clk_in
刚把一个周期(前半周期)内低电平变为高电平产生一个脉
冲,而后半周期的脉冲与‘0’异或不变。从而实现 N-0.5 分
频。
要实现奇数、偶数、半整数通用分频器只需再加一个控
制选择信号 sel。当 sel=‘1’时,clk_in 与 2 分频输出异或,
实现半整数分频;当 sel=‘0’时,只选通 clk_in,实现整数
分频。通用分频器原理如图 2 所示:
图 2 :通用分频器电路组成
Verilog语言的实现
本设计采用层次化的设计方法,首先设计通用分频器中
各组成电路元件,然后通过元件例化的方法,调用各元件,实
现通用分频器。
128
CompoTech China / 2006.5
1、选择异或门模块 half_select:
module half_select(sel,a,b,c);
output c;
input sel,a,b;
xor u1(w,a,b);
assign c= sel? w:a;
(当 sel=‘1’时,clk_in 与 2 分频输出异或,实现半整数
分频;当 sel=‘0’时,只选通 clk_in,实现整数分频。)
endmodule
2、模 N 计数器counter_n:
实现参数化设计 N 可取 2~256,也可增加 count 位数使 N
可取更大的值。以 N=7 为例通过设置 sel 分别实现奇数 7 分频
和半整数 6.5 分频。
module counter_n(reset,en,clk_in,clk_out,count);
parameter N=7;
input reset,en,clk_in;
output clk_out;
output[7:0] count;
reg clk_out;
reg[7:0] count;
always @(posedge clk_in)
begin
if (reset)
begin
count[7:0]=0;
end
else if (en)
begin
if (count==(N-1))
count=0;
else
count=count + 1;
end
end
always
begin
if (N<=2)
clk_out=count[0];
基 础 设 计
KnowledgeBase
图 3 :7 分频仿真结果
图 4:6.5 分频仿真结果
仿真结果及硬件电路测试
当 sel=‘0’,N=7 时,实现奇数 7 分频。如图 3 所示
当 sel=‘1’,N=7 时,实现半整数 6.5 分频。如图 4 所示
由此可见,只要改变异或门选通控制 sel 和 N 的值就可实
现 2 ~2 5 6 之间的任意奇数、偶数、半整数分频。本设计在
Altera 公司的 FLEX 系列 EPF10K10LC84-3 型 FPGA 构成的测试
平台上测试通过,性能良好。
表 1 半整数 6.5 分频器适配分析结果:
else if (N<=4)
clk_out=count[1];
else if (N<=8)
clk_out=count[2];
else if (N<=16)
clk_out=count[3];
else if (N<=32)
clk_out=count[4];
else if (N<=64)
clk_out=count[5];
else if (N<=128)
clk_out=count[6];
else if (N<=256)
clk_out=count[7];
end
endmodule
3、2 分频模块fenpin_2:
module fenpin_2(clk_in,clk_out);
input clk_in;
output clk_out;
reg clk_out;
always @(posedge clk_in)
begin
clk_out=~clk_out;
end
endmodule
4 、最后通过元件例化的方法,调用各元件,实现通
选 用 器 件
I / O 延迟时间 使 用 引 脚 数
工 作 频 率
用分频器最高层设计:
module fenpin(reset,en,sel,clk_in,clk_out,count);
input reset,en,sel,clk_in;
output clk_out;
output[3:0] count;
EPF10K10LC84-3
15.7ns
9/84 (10.7%)39.52MHz
结 语
half_select u1(sel,clk_in,b,c);(调用half_select,元件例化)
本文旨在介绍一种进行 F P G A 开发时,所需多种分频的
counter_n u2(reset,en,c,clk_out,count);(调用counter_n,
实现方法,如果设计中所需分频形式较多,可以直接利用本
元件例化)
设计,通过对程序的稍微改动以满足自己设计的要求。如果
fenpin_2 u3(clk_out,b);(调用fenpin_2,元件例化)
设计中需要分频形式较少,可以利用本设计部分程序,以节
endmodule
省资源。
2006.5 / 电子与电脑
129