搜档网
当前位置:搜档网 › FPGA实验报告

FPGA实验报告

FPGA实验报告
FPGA实验报告

电气技术实践

可编程逻辑器件FPGA应用开发

实验报告

2016年12月

目录

一、实验目的

二、实验要求

三、实验内容

四、实验代码及实验结果

(1)4位二进制加法计数器

(2)半加器

(3)LED静态显示

(4)38译码器

(5)点阵扫描显示

(6)步进电机状态机

五、实验感想

六、学习并使用FPGA的心得与体会

七、电气技术实践总结

一、实验目的

1、熟悉使用可编程逻辑器件(Altera公司FPGA Cyclone系列EP1C6Q)。

2、熟悉使用硬件描述语言VHDL。

3、掌握FPGA集成环境(Altera公司FPGA QuartusII 9.0)开发流程。

4、熟悉使用核心目标系统板与接口电路等工作原理及其功能模块绑定信息。

5、熟悉并掌握下载线方式和下载文件的选择。

二、实验要求

1、学习并掌握文本、图形等输入和时序、功能仿真方法。

2、学习并熟悉门电路、组合电路、时序电路等单一模块功能。

3、学习并设计各种不同状态机逻辑功能。

4、学习并设计由单一模块→较多功能模块集成→系统集成方法。

5、学习并选择多种模式显示(发光二极管显示、米字型数码管显示、七段数码管→动

态扫描或静态扫描显示、LED点阵显示各种字符和图形或静止或移动等方式、LCD液晶显示各种字符和图形或静止或移动等方式)。

6、根据自已的兴趣和愿望,可从以下给定的实验目录中选取或自已设定功能题目。

7、实验数目没有要求,关键是看质量,是否是自已编写、调试、实现。

三、实验内容

1、按指导书集成开发环境章节操作实现文本编程实例1和图形编程实例2全过程。

2、任选门电路、组合电路、时序电路实验各完成一个其逻辑功能,其实现方案自已规

定。在进行FPGA目标器件输入和输出引脚绑定时,输入引脚绑定高/低电平、单脉冲、各种分频连续脉冲等多种信号,输出引脚可绑定发光二极管、七段数码管、LED点阵等显示模式。

3、在完成1位十进制计数器的基础上,可增加完成2或3等多位十进制计数器逻辑功

能并用多位七段数码管来显示。

4、根据状态机工作特点,设计一个有一定功能效果的例程。

5、利用4X4键盘设计显示对应的键字符信息。

6、用LED点阵显示任意字符、图形信息。

四、实验代码及实验结果

(1)4位二进制加法计数器

【实验代码】

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity count4 is

port(clk,d:in std_logic;

rst:in std_logic;

q:out std_logic_vector(3 downto 0));

end entity count4;

architecture bhv of count4 is

signal q1:std_logic_vector(3 downto 0);

begin

process(rst,clk,d)

begin

if(rst='0')then

q1<="0000";

elsif(clk'event and clk = '1')then

q1<=q1+1;

end if;

end process;

q<=q1;

end architecture bhv;

【实验操作】

输入信号clk时钟→Pin152;rst清零→Pin1;d启动控制→Pin2;输出信号q3→Pin43;q2→Pin44;q1→Pin45;q0→Pin46.

旋转位置在实验箱中部偏下部分SW7旋转分频开关、拨码开关对应位置在实验箱左下部分粉红色开关组左边开始第一个和第二个,显示位置在实验箱左上角第一、二、三、四个发光二极管

输入信号rst、d都为“1”、SW7旋转到1Hz,输出结果信息为第一、二、三、四个发光二极管按照0000→0001→……→1111循环显示,符合实验要求。

(2)半加器

【实验原理图】

【实验操作】

逻辑分析:输入信号a、b;输出信号分别为sum(和)、carry(进位)。

逻辑方程:sum=a⊕b;carry=a * b.

接口信号与目标器件引脚连接:输入信号pin_name→Pin1、pin_name2→Pin2;输出信号pin_name4(和)→Pin44、pin_name3(进位)→Pin43.

可观察到通过输入得到的逻辑输出与上述的逻辑方程相符,符合半加器的逻辑要求。

(3)LED静态显示

【实验代码】

library ieee;

use ieee.std_logic_1164.all;

entity dec7s1 is

port(A:in std_logic_vector(3 downto 0); LED7S:out std_logic_vector(6 downto 0)); end;

architecture onr of dec7s1 is

begin

process(A)

begin

case A is

when "0000" => LED7S<="1111110"; when "0001" => LED7S<="0110000"; when "0010" => LED7S<="1101101"; when "0011" => LED7S<="1111001"; when "0100" => LED7S<="0110011"; when "0101" => LED7S<="1011011"; when "0110" => LED7S<="1011111"; when "0111" => LED7S<="1110000"; when "1000" => LED7S<="1111111"; when "1001" => LED7S<="1111011"; when others => null;

end case;

end process;

end;

【实验操作】

用开关A3,A2 ,A1,A0作为输入设置,组成一个高输入有效的基本组合逻辑器;从输出指示LED7S观察到数字随A3,A2 ,A1,A0设置值的变化而引起的相应变化。

真值表如图所示:

(4)38译码器

【实验代码】

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity encoder is

port(

a,b,c:in std_logic;

y:out std_logic_vector(7 downto 0));

end;

architecture one of encoder is

signal temp:std_logic_vector(2 downto 0);

signal tt:std_logic_vector(7 downto 0);

begin

temp<=c&b&a;

process(temp)

begin

case temp is

when "000" =>tt<="00000001";

when "001" =>tt<="00000010";

when "010" =>tt<="00000100";

when "011" =>tt<="00001000";

when "100" =>tt<="00010000";

when "101" =>tt<="00100000";

when "110" =>tt<="01000000";

when "111" =>tt<="10000000";

end case;

end process;

y<=tt;

end one;

【实验操作】

三个拨码开关确定输入,由八个LED的亮暗完成译码。显示与真值表相同:

(5)点阵扫描显示

【实验代码】

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL; entity count4 is

port (clk,d:in std_logic;--in bit;

rst:in std_logic;

q:out std_logic_vector(3 downto 0);

p:out std_logic_vector(7 downto 0);

m:out std_logic_vector(7 downto 0)); end entity count4;

architecture jsq of count4 is

signal q1:std_logic_vector(3 downto 0); signal p1:std_logic_vector(7 downto 0); signal p2:std_logic_vector(7 downto 0); begin

process(rst,clk)

begin

m<="10000000";

p1<="00000000";

p2<="00000000";

if(clk'event and clk='1') then

if(rst='0')then

q1<="0000";

else if(d='1')then

if(q1="1111")then

q1<="0000";

else

q1<=q1+'1';

end if;

end if;

end if;

end if;

q<=q1;

case q1 is

when"0000"=>m<="11111111";p<="01111111";

when"0001"=>m<="11111111";p<="01111111";

when"0010"=>m<="11111111";p<="10111111";

when"0011"=>m<="11111111";p<="10111111";

when"0100"=>m<="11111111";p<="11011111";

when"0101"=>m<="11111111";p<="11011111";

when"0110"=>m<="11111111";p<="11101111";

when"0111"=>m<="11111111";p<="11101111";

when"1000"=>m<="11111111";p<="11110111";

when"1001"=>m<="11111111";p<="11110111";

when"1010"=>m<="11111111";p<="11111011";

when"1011"=>m<="11111111";p<="11111011";

when"1100"=>m<="11111111";p<="11111101";

when"1101"=>m<="11111111";p<="11111101";

when"1110"=>m<="11111111";p<="11111110";

when others =>m<="11111111";p<="11111110";

end case;

end process;

end architecture jsq;

【实验现象】

可观察到点阵的一个亮行随时钟脉冲从上往下扫描,并周期循环。

(6)步进电机状态机

【实验原理】

【实验代码】

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity state_stepper_b is

port(clk,dir:in std_logic;

q:out std_logic_vector(3 downto 0));

end state_stepper_b;

architecture arc of state_stepper_b is

type state_type is (s0,s1,s2,s3);--定义状态机的四个状态signal state:state_type;

begin

process( clk)

begin

if (clk'event AND clk='1') then

if (dir='1')then--正转时处理如下

state<=s0;

case state is

when s0=> state<=s1;

when s1=> state<=s2;

when s2=> state<=s3;

when s3=> state<=s0;

end case;

else --反转时处理如下

state<=s3;

case state is

when s3=> state<=s2;

when s2=> state<=s1;

when s1=> state<=s0;

when s0=> state<=s3;

end case;

end if;

end if;

end process;

with state select--各状态对应的二进制数码

q <= "0001" when s0,

"0010" when s1,

"0100" when s2,

"1000" when s3,

"0000" when others;

end arc;

【实验现象】

输入信号:

时钟clk 接10Hz 输入(SW7) P152;方向dir接拨动开关I01(拨码开关SW3 左1)P1 ;

输出信号:4 位输出信号接LED 模块O25—O28。P43~P46;

实验操作

下载程序,将SW7 拨至第二段(10Hz),此时,LED 灯的前1 位会有规律的闪烁。改变方向开关的电平信号,指示灯的移动方向立即改变。

五.实验感想

在数字电路的课程学习中,我们了解到,FPGA 是Field Programmable Gate Array(现场可编程门阵列)的缩写,它是在PAL、GAL、PLD 等可编程器件的基础上进一步发展的产物,是专用集成电路(ASIC)中集成度最高的一种。

通过在电气实践中实际操作FPGA试验箱,亲自下载程序并观察实验现象,我更加认识到,FPGA 作为专用集成电路领域中的一种半定制电路,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。可以认为FPGA 能完成任何数字器件的功能,上至高性能CPU,下至简单的74、40 系列等集成电路。FPGA 内部由门电路和触发器以及系统时钟等阵列构成。

我们可以通过原理图输入或硬件描述语言或混合编写方式任意、

自由地设计一个数字系统,对设计方案进行时序仿真和功能仿真,来验证设计的正确性。尽管初次使用时有些苦难,特别是引脚不知如何连接。但通过实验例程的引导,就能迅速摸索出引脚的连接方法。

FPGA可以应用到许多方面,通过搭载不同的内核,可以应用到不同系统中,完成多种任务设计。由此可见,对于相关专业的学习与工作来说,学好FPGA,学会运用它丰富的功能,是十分有必要的。短暂的课程之余,我们更应当加深对FPGA的学习与了解。

六、学习并使用编程逻辑器件FPGA的心得和体会

在数字电路理论课程的学习中,在第八章里,我们了解了可编程逻辑器件的相关知识。从中,我对现在非常流行的FPGA产生过浓厚的兴趣,却遗憾于无法见识其庐山真面目。所以非常有幸,在本学期电气实践课程的最后,自己能够亲身体验简单设计的完整流程,对FPGA的认识不再仅局限于严谨却苍白的理论,而是真正地自己去实现了些以前要花很多精力连庞杂的线才能实现的功能,确实觉得收获良多。

简明地讲,FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,其出现既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点,一经面世,就很快风靡整个行业。

而通过动手实验,我对于FPGA的工作原理,也有了较之前更清楚明

白的理解。它采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。

而通过这两次的亲手操作FPGA实验,我真切感受到了它的神奇魅力。首先要说的是,本学期数字电路实验相较于上学期模拟电路的实验而言,调试部分很少,大部分都是保证连线正确就可以保证现象的产生以及功能上的实现。然而不得不承认的是,其连线的复杂程度经常让人瞠目结舌,而我们涉及的实验部分还仅仅是数字电路中比较简单的内容,实践设计电路中,这种单独芯片罗列的方式也显然不能满足当今用户需求,总让人觉得现在做的实验似乎并不适用于实际操作,所以,FPGA的实验让我体验到了比较靠近当前真实电路的设计方式,也初步掌握了QUARTUSII集成开发环境的基本操作。

具体的讲,在本学期前面所做的实验中有一个电子顺序锁的实验,连线、各模块联合起来的调试都极为复杂,可以说是目前为止连线最麻烦的实验之一,而这还仅仅实现的是两位的密码设计,显然与实际中动辄多位的设计需求相差甚远。但是,用FPGA操作时,我们通过相关的编程,以及与之前相比简单了许多的连线,就能实现6位的密码设计,且通过改写程序变成更多位的密码,也比单独芯片的连线设计要简单许多,这就更让我们认识到了FPGA可多次重复编程的优越性。总的来讲,FPGA的这两次实验,让我对于可编程逻辑器件的相关理论有了更深刻的理解与掌握,且锻炼了自己熟悉新软件能力,并且初步掌握了VHDL语言,对当前电子电路的设计有了直观的体验,收获很大,感谢学校所提供的这样的机会。

七、电气技术实践(1)(2)的收获、想法与建议

光阴荏苒,日月如梭,时间毕竟如滚滚长江东逝水,就算心里还有留恋,仿佛转瞬之间,这门与我们专业结合最为紧密、持续时间也最长的实验课就要结束了,心里还是有感慨良多的。

两个学期的跨度,从偏僻却充满青春活力的沙河到繁华且富于历史内涵的学院路,从对电气实验各种仪器、元件的陌生无措到能够比较熟练地根据实验内容进行相关操作,我们在老师的悉心教导、严格督促、耐心陪伴中走过了这一年,有成长,更有收获。在此期间,我们有过怎么也调不出现象的慌乱与崩溃,有过整个实验如行云流水的轻松与高兴,更有互帮互助共同解决问题的贴心与温暖,整个电气实践伴随着我们主要专业课的学习而进行,对于我们理论的学习有着不可估量

的实践上的指导意义。通过实验,我们能够验证理论,当然这点在初级理论学习阶段显得不太明显,但是,能够将课本上讲的东西用自己亲手搭建的电路实现,已经很让自己开心了。更重要的是,我们从中认识到了作为工科学生所应具备的良好动手能力是需要培养和锻炼的,也认识到了多年来应试教育所带来的不足,让我们有意识地去弥补自己这方面的缺陷,做一名合格的电子人。

相关主题