EDA课程设计分频器钟福茹资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA课程设计
设计题目: 竞赛抢答器
姓名:刘云龙
学号:2010508140
班级:10级2班
专业:电子信息
院系:信息科学与技术学院
指导老师:田敏
实验日期:2013 年 1 月13 日
一、前言 (2)
1.1课程设计的意义 (2)
1.2 VHDL语言简介 (2)
二、方案选择及原理分析 (3)
2.1 通用可控分频器硬件方案选择 (3)
2.2 通用可控分频器原理分析 (3)
2.2.1 偶数分频器 (3)
2.2.2奇数分频器 (4)
三、软件设计 (5)
3.1系统分析 (5)
3.2系统的结构和模块划分 (5)
3.2.1固定数值分频模块 (6)
3.2.2按键和显示模块 (7)
3.2.3占空比和分频系数可控分频模块 (7)
3.3 可控分频的实现 (8)
四、软硬件的系统测试 (8)
五、心得体会 (8)
附录 (9)
参考文献 (16)
一、前言
分频器是数字系统设计中的一种基本电路,我们往往需要通过分频器得到我们所需要的时钟频率。
在实际设计中我们经常用到的为整数分频,有时要求等占空比,有时又要求非等占空比。
在同一个设计中有时要求多种形式的分频,通常由计数器或计数器的级联结构构成各种形式的任意占空比偶数分频及非等占空
比的奇数分频,实现起来比较简单,对于等占空比的奇数分频以及可控的分频实
现起来会较为困难。
本文利用VHDL硬件描述语言,使用Altera公司的FPGA芯片,设计了一种能够满足上述要求,而且较为通用的可控分频器。
只需在分频器的输入端用按键输入相应的分频系数,就可以得到所需的频率。
1.1课程设计的意义
随着电子技术的高速发展,FPGA/CPLD以其高速、高可靠性、串并行工作方式等突出优点在电子设计中受到广泛的应用,而且代表着未来EDA设计的方向。
FPGA/CPLD的设计采用了高级语言,如VHDL语言AHDL语言等,进一步打破了软件与硬件之间的界限,缩短了产品的开发周期。
所以采用先进的FPGA/CPLD取代传统的标准集成电路、接口电路已成为电子技术发展的必然趋势。
EDA技术代表了当今电子设计技术的最新发展方向,采用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程在汁算机上自动处理完成。
由于现代电子产品的复杂度和集成度的日益提高,一般分离的中小规模集成电路组合已不能满足要求,电路设计逐步地从中小规模芯片转为大规模、超大规模芯片,具有高速度、高集成度、低功耗的可编程
朋IC器件已蓬勃发展起来。
[1]
分频器是一种在 FPGA 的设计中使用效率非常高的设计,使用硬件描述语言进行设计消耗不多的逻辑单元就可以实现对时钟的操作,具有成本低、可编程等优点。
1.2 VHDL语言简介
VHDL(VHSIC(Very High Speed I ntegrated Circuit)Hardware Description Language)是超高速集成电路硬件描述语言,是一种用于电路设计的高级语言。
它出现于80年代后期,刚开始时它是由美国国防部开发出来的,是为了供美军
用来提高设计的可靠性和缩减开发周期的一种使用范围比较小的设计语言。
VHDL语言主要应用于数字电路系统的设计。
目前,国内对它的应用多数集中在FPGA/CPLD/EPLD的设计当中,除此之外,一些较为有实力的单位,也将它用来
设计ASIC。
VHDL语言具有多层次描述系统硬件功能的能力,既可以描述系统级电路,
又可以描述门级电路。
而描述既可以采用行为描述、寄存器传输描述或结
构描述,也可以采用三者混合的混合级描述。
另外,VHDL还支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。
VHDL支持预定义的和自定
义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创
建高层次的系统模型。
VHDL语言具有自顶向下和基于库的设计特点。
其开发
流程:在顶层用方框图或硬件语言对电路的行为进行描述后,进行系统仿真验证和纠错,再用逻辑综合优化工具生成具体的门级逻辑电路的网表,然后通过适配器将网表文件配置于指定的目标器件,产生最终下载文件或配置文件。
最后把适配后生成的下载或配置文件通过编程器或编程电缆下载到具体的FPGA/CPLD器件中去,以便进行硬件调试和验证,从而实现可编程的专用集成电路ASIC的设计。
VHDL主要用于描述数字系统的结构,行为,功能和接口,除了含有许多具
有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的
计算机高级语言。
VHDL系统设计与其他硬件描述语言相比,具有比较强的行为
描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言之一。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的
重要保证.
二、方案选择及原理分析
2.1 通用可控分频器硬件方案选择
分频器是数字电路中最常用的电路之一,在 FPGA 的设计中也是使用频率非常高的一种基本设计。
基于 FPGA 实现的分频电路一般有两种方法:一种是使用FPGA 芯片内部提供的锁相环电路进行分频,如 ALTERA 提供的 PLL(Phase Locked Loop),Xilinx 提供的 DLL(DelayLocked Loop);第二种是使用硬件描述语言,如VHDL、Verilog HDL 等。
使用锁相环电路进行分频有许多的优点,
例如可以实现倍频、相位偏移以及占空比可调等。
但是由于 FPGA 内部提供的锁相环个数极为有限,不能满足使用时的要求。
因此使用硬件描述语言实现分频电
路在数字电路设计较为常用,因为它消耗不多的逻辑单元就可以实现对时钟的操作,具有成本低、可编程等优点。
2.2 通用可控分频器原理分析
实现分频电路最基础的东西是计数器,设计分频器的关键在于输出电平在何
时进行翻转。
计数器的种类分为普通计数器和约翰逊计数器两种,这两种计数器在分频电路中均可使用,最普通的计数器是加法或减法计数器。
在同一时刻,
加法计数器的输出可能有多位发生变化,因此,当使用组合逻辑对输出进行译码时,可能会导致尖峰脉冲信号。
下面使用加法计数器来分别描述各种分频器的实现。
2.2.1 偶数分频器
偶数分频最易于实现,想要实现占空比为 50%的偶数 N 分频,一般来说
有两种方案:一是当计数器计数到 N/2-1 时,将输出的电平进行一次翻转,并
同时给计数器一个复位信号,使计数器重新开始计数,如此循环下去,便可实现占空比为50%的偶数N分频;二是当计数器的输出为 0到 N/2-1时,时钟的输出为 0或 1;当计数器的输出为 N/2到 N-1时,时钟的输出为 1或 0;当计数器计数到N-1 时,将计数器进行复位,重新开始计数,如此循环下去,也能实
现50%偶数分频。
需指出的是,第一种方案只能实现占空比为 50%的分频器,而第二种方案还可以对占空比进行有限度的调整。
图2.1 50%占空比2分频时序图
图2.2 4分之1占空比4分频时序图
2.2.2奇数分频器
想要实现非 50%占空比的奇数分频,比如实现占空比为 20%(1/5)、40%(2/5)、60%(3/5)、80%(4/5)的 5 分频器,我们可以采用类似于偶数分频的
第二种方案;但如果要实现占空比为 50%的奇数分频,就不能采用偶数分频中所
采用的方案了。
图2.3 5分之1占空比5分频时序图
要产生50%占空比的奇数分频实现起来会比较麻烦一点,需通过待分频的时钟下降沿触发计数,产生一个占空比为 40%(2/5)的 5 分频器。
将产生的时钟与上升沿触发产生的时钟相或,即可得到一个占空比为 50%的5分频器。
推广为一般方法:欲实现占空比为 50%的 2N+1分频器,则需要对待分频时钟上
升和下降沿分别进行 N/(2N+1)分频,然后将两个分频所得的时钟信号相或便可
得到占空比为50%的2N+1分频器。
[4]
图2.4 50%占空比5分频时序图
三、软件设计
3.1系统分析
该分频系统可实现2到9999任意整数分频以及占空比1%到99%可调,被分频的时钟频率为1MHZ。
由于硬件会产生时间延时,频率大到一定程度时输出的
波形会有失真情况。
对于奇数50%占空比分频,软件处理需要对待分频时钟上升沿和下降沿分别进行 N/(2N+1)分频,然后将两个分频所得的时钟信号相或,这
样输出的波形有可能会出现毛刺现象。
3.2系统的结构和模块划分
根据上面的分析,系统结构模块有:固定数值分频模块,按键和显示模块,
两个占空比和分频系数可控分频模块。
结构图如图 4.1所示:
图4.1 系统结构
3.2.1固定数值分频模块
固定数值分频模块将FPGA上的25MHZ时钟频率分别进行25分频和25000000分频得到1MHZ和1HZ时钟频率,其中1HZ作为按键的控制频率,1MHZ作为可控分频模块的输入频率。
也就是说本系统是对1MHZ时钟频率进行分频,在实际中我们可以根据我们的需要改变分频系数从而对其他时钟频率进行分频。
对于按键的控制频率,1HZ的输入可以使我们按住按键时1秒钟改变一次数值,及进行一次加1操作。
固定数值分频模块如图 4.2所示:
图4.2 固定数值分频
3.2.2按键和显示模块
该模块的输入为8个按键,其中2个按键为拨码开关,分别为复位按键和使能输出按键,当rst=1,及该按键按下时系统复位;当en=0,及该按键没按下时,按键的键值输出,en=1时为计数处理阶段。
Key_fre[3..0]为设置分频系数的4个按键,输出的键值为0到9999。
Key_ph[1..0]为设置占空比的2个按键,输出的键值为0到99。
out_fre为按键的键值输入给可控分频模块以达到2到9999任意整数分频,out_cycle为按键的键值输入给可控分频模块以达到占空比1%到99%可调。
该模块的输出为6个数码管,其中4个显示分频系数,2个显示占空比。
系统分频后的频率和波形在示波器上显示。
按键和显示模块如图 4.3所示;
图4.3 按键和显示
3.2.3占空比和分频系数可控分频模块
由于50%奇数分频处理起来比其他整数分频麻烦,所以将其作为单独分频模块进行处理,而偶数任意占空比分频和非50%奇数分频作为令一个分频模块进行
处理。
50%奇数分频的分频时钟为1MHZ,其中fre_in1和cycle_in1为按键键值,这样就达到了分频系数和占空比可控的目的。
50%奇数分频模块如图 4.4所示:
图4.4 50%奇数分频模块
非50%奇数和任意占空比偶数分频模块的分频时钟也为1MHZ,其中fre_in 和 cycle_in为按键键值,这样也达到了分频系数和占空比可控的目的。
非50%奇数和任意占空比偶数分频模块如图 4.5所示:
图4.5 非50%奇数和任意占空比偶数分频
3.3 可控分频的实现
可控分频系统是由硬件描述语言VHDL 来描述实现的。
其系统的各个模块的VHDL程序见附录Ⅱ。
由上面的系统结构图可以看出,将各个模块连接起来得到
整个的可控分频软件工作过程。
四、软硬件的系统测试
把写好的VHDL程序进行引脚锁定,综合,适配,编程下载,调试。
将FPGA 模块、显示模块、按键及电源模块连接好,被分频的时钟频率fpga内部时钟进行分频提供,然后通过JTAG下载模式在线将生成的配置文件写入芯片中。
通过
不断的反复调试,修改,最终完成本项方案设计。
软硬件的系统数据测试结果如
附录Ⅰ。
五、心得体会
FPGA 最大的特点就是比较灵活,它可以实现你所需要的任何数字电路,同
时也可以制定出各种电路,这样就大大减少了受制于专用芯片的束缚,真正达到了为自己的产品量身定做。
FPGA在设计过程中可以灵活的更改,并且它强大的
逻辑资源和寄存器资源可以让你轻松的去发挥设计理念,硬件实现的方式可以应
对设计中大量的高速电子线路设计需求。
在此基础上,我们完全可以不必修改硬
件电路,直接通过修改VHDL 源程序,来增加一些新功能,满足不同用户的需要,实现数字系统硬件的软件化。
该可控分频系统的设计过程中,出现的比较麻烦的问题就是利用VHDL语言编写按键模块时,数据类型跟算数运算出现冲突,本身VHDL语言进行乘除运算时限制比较多。
我一开始按键数据类型设置为进制数,这样需调用quartusII
本身的乘除模块才能实现乘除运算,但没有达到按键模块所要实现的功能。
在这问题上浪费了很多时间,最后只有通过改变所以模块上的数据类型,将其改为整型才顺利的完成了所要达到的功能。
附录
附录Ⅰ测量的数据表
分频系数测得频率值/Hz
2 500.00KHZ
3 333.33KHZ
10 100.00KHZ
51 19.608KHZ
100 10.000KHZ
501 1.9960KHZ
1000 1.0000KHZ
2001 499.75HZ
3000 333.33HZ
4001 249.94HZ
5000 200.00HZ
6001 166.64HZ
7000 142.85HZ
8001 124.98HZ
9000 111.11HZ
9999 100.01HZ
附录Ⅱ程序
顶层文件设计
二分频:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity fenpin_2 is
port(clk:in std_logic;
data:in std_logic_vector(7 downto 0);
q:out std_logic);
end fenpin_2;
architecture one of fenpin_2 is
signal data1,data2:std_logic_vector(7 downto 0);
signal data3,data4:std_logic_vector(7 downto 0);
signal q1,q2,q3:std_logic;
begin
data1<=data-1;
data2<='0'&data1(7)&data1(6)&data1(5)&data1(4)&data1(3)&data1(2)&data1(1)whe n data(0)='1' else
'0'&data(7)&data(6)&data(5)&data(4)&data(3)&data(2)&data(1); process(clk)
begin
if clk'event and clk='1' then
if data3<data1 then
data3<=data3+1;
else data3<="00000000";
end if ;
end if;
end process;
process(clk)
begin
if clk'event and clk='0' then
if data4<data1 then
data4<=data4+1;
else data4<="00000000";
end if ;
end if;
end process;
process(data3,data2)
begin
if(data3<data2) then
q1<='1';
else q1<='0';
end if ;
end process;
process(data4,data2)
begin
if(data4<data2) then
q2<='1';
else q2<='0';
end if ;
end process;
process(q1,q2)
begin
q3<=q1 or q2;
end process;
q<= clk when data="00000001" else q3 when data(0)='1' else
q1;
end one ;
(1)分频得到1M和10HZ频率
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity clk_b is
port(clk: in std_logic;
clk1M,clk10: out std_logic);
end entity;
architecture behave of clk_b is
signal clk1,clk3, clk4: std_logic;
signal temp1,temp2: integer range 0 to 24; signal temp:integer range 0 to 1249999; begin
process(clk)--上升沿
begin
if(rising_edge(clk)) then
if(temp1 < 24) then
temp1 <= temp1 + 1;
else temp1 <= 0;
end if;
if(temp1 < 12) then
clk3 <= '1';
else
clk3 <= '0';
end if;
end if;
end process;
process(clk)--下降沿
begin
if(falling_edge(clk)) then
if(temp2 < 24) then
temp2 <= temp2 + 1;
else temp2 <= 0;
end if;
if(temp2 < 12) then
clk4 <= '1';
else
clk4 <= '0';
end if;
end if;
end process;
process(clk)--10HZ
begin
if clk'event and clk='1' then
temp<=temp+1;
if temp=1249999 then
clk1<=not clk1;temp<=0;
end if;
end if;
end process;
clk1M <= clk3 or clk4; --duty 50% out:1MHz clk10 <= clk1;--out10HZ
end behave;
(2)按键跟显示模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity key_fp is
port(clk10,rst,en:in std_logic;
key_fre:in std_logic_vector(3 downto 0);
key_ph:in std_logic_vector(1 downto 0);
led_fre1,led_fre2,led_fre3,led_fre4:out integer range 0 to 9;
led_ph1,led_ph2:out integer range 0 to 9;
out_cycle:out integer range 0 to 9900;
out_fre:out integer range 0 to 9999);--std_logic_vector(14 downto 0));
end entity;
architecture behave of key_fp is
signal a1,a2,a3,a4,a5,a6:integer range 0 to 9;
--signal q1,q2,q3,q4:integer range 0 to 9;
signal duty_out:integer range 1 to 99;
signal reg_out:integer range 0 to 9999;
begin
process(clk10,key_fre,rst)
begin
if rst='1' then
a1<=0;a2<=0;a3<=0;a4<=0;a5<=0;a6<=0;--a1<="0000";a2<="0000";a3<="0000";a4<="0000";
elsif clk10'event and clk10='1' then
if (key_fre="0001") then
if a1<9 then a1<=a1+1;
else a1<=0;end if;
end if;
if (key_fre="0010") then
if a2<9 then a2<=a2+1;
else a2<=0;end if;
end if;
if (key_fre="0100") then
if a3<9 then a3<=a3+1;
else a3<=0;end if;
end if;
if (key_fre="1000") then
if a4<9 then a4<=a4+1;
else a4<=0;end if;
end if;
if (key_ph="01") then
if a5<9 then a5<=a5+1;
else a5<=0;end if;
end if;
if (key_ph="10") then
if a6<9 then a6<=a6+1;
else a6<=0;end if;
end if;
if en='0' then
reg_out<= a4*1000+a3*100+a2*10+a1;
duty_out<= a6*10+a5;
end if;
end if;
end process;
led_fre1<=a1;
led_fre2<=a2;
led_fre3<=a3;
led_fre4<=a4;
led_ph1<=a5;
led_ph2<=a6;
out_fre<=reg_out;
out_cycle<=((duty_out*reg_out)/100);
--q1<=a1;q2<=a2;q3<=a3;q4<=a4;
--out4<=q1 * "00000000001"+q2 * "00000001010"+q3 * "00001100100"+q4 * "01111101000";
end behave;
(3)偶数任意占空比和非50%奇数分频
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity fre_duty is
port(clk1M: in std_logic;
fre_in:integer range 0 to 9999;
cycle_in:integer range 0 to 9900;
fp_out: out std_logic);
end entity;
architecture behave of fre_duty is
signal reg_out: std_logic :='0';
signal temp :integer range 0 to 9999;--temp,aa,bb: std_logic_vector(14 downto 0):="000000000000000";
begin
process(clk1M)
begin
if(clk1M'event and clk1M='1') then
if(temp< fre_in-1) then
temp <=temp+1;
else
temp <=0;--"000000000000000";
end if;
end if;
end process;
(4)占空比50%奇数分频
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity fre_odd is
port(clk1M: in std_logic;
fre_in1:integer range 0 to 9999;
cycle_in1:integer range 0 to 9900;
fp_out1: out std_logic);
end entity;
architecture behave of fre_odd is
signal reg_out1,reg_out2 :std_logic:='0';
signal temp1, temp2 :integer range 0 to 9999; begin
process(clk1M)--上升沿
begin
if(rising_edge(clk1M)) then
if(temp1 < fre_in1-1) then
temp1 <= temp1 + 1;
else
temp1 <=0;--"000000000000000";
end if;
if(temp1 < cycle_in1) then
reg_out1 <= '1';
else reg_out1 <= '0';
end if;
end if;
end process;
process(clk1M)--下降沿
begin
if(falling_edge(clk1M)) then
if(temp2 < fre_in1-1) then
temp2 <= temp2 + 1;
else
temp2 <=0;--"000000000000000";
end if;
if(temp2 < cycle_in1) then
reg_out2 <= '1';
else reg_out2 <= '0';
end if;
end if;
end process;
fp_out1 <= reg_out1 or reg_out2;
end behave;
参考文献
[1] 擦光辉.CPLD/TPGA的开发与应用[M]. 北京:电于工业出版社,2002.
[2] 潘松,黄继业. EDA技术实用教程(第三版)[M].北京:科学出版社,2006.
[3] 吴玉吕,胡水强,王文娟.基于CPLD/FPGA的多功能分频器的设计与实现[L].世界电子元器件,2007(03).
[4] 汪虹,李宏.基于FPGA的等占空比任意整数分频器的[J].仪器与仪表.2005.5.3.
[5] 张静亚. FPGA系统设计中资源分配的分析和研究[J]. 信息化研
究 ,2009,35(3): 37239.。