EDA实验箱实验指导书

更新时间:2023-03-08 06:20:36 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验二 流水灯

1. 实验目的

通过本实验让学生进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VHDL语言的编程方法;学习简单的时序电路的设计和硬件测试。

2. 实验内容

本实验的内容是控制实验箱上的发光二极管LED1—LED8,使之实现流水灯显示。 3. 实验原理

在LED1~LED8引脚上周期性地输出流水数据,即输出的数据依次为11111111、11111110、11111100、11111000、11110000、11100000、11000000、10000000、00000000,如此循环显示,输出数据“0”,表示点亮相应的LED小灯。为了方便观察,流水的速率控制在2Hz左右。在核心板上有一个48MHz的标准时钟源,该时钟源与芯片EP2C5的23脚相连。为了产生2Hz的时钟源,在此调用了分频模块int_div。

4. 实验步骤

(1) 启动Quartus II,建立一个空白工程,然后命名为led_waterflow.qpf。

(2) 新建ledwater.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。生产符号文件ledwater.bsf (File→ Create/_Update → Create Symbol Files for Current File)。 流水灯程序参考

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY ledwater IS PORT(

clk: IN STD_LOGIC;

led: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END;

ARCHITECTURE one

SIGNAL BEGIN

led<=led_r(7 DOWNTO 0); PROCESS(clk) BEGIN

IF clk’event and clk=’1’ THEN

led_r<=led_r(7 DOWNTO 0) & '0';

IF led_r=\ --循环完毕吗?

led_r<=\ --是,则重新赋初值

END IF;

OF ledwater

IS

led_r:STD_LOGIC_VECTOR(8 DOWNTO 0);

END IF; END PROCESS;

END;

(3) 将实验模块库里的int_div.vhd和int_div.bsf拷贝到工程目录下。

1

(4) 新建图形文件,命名为led_waterflow.bdf并保存。在空白处双击鼠标,打开symbol对话框,在symbol对话框的左上角的libraies中,分别将project下的ledwater和int_div模块放在图形文件led_waterflow.bdf中,加入输入input、输出output引脚,双击各引脚符号,进行引脚命名。完整的顶层模块原理图如下图1所示。双击int_div中的参数框,并修改参数,如下图2所示。将F_DIV的值改为24000000,F_DIV_WIDTH的值改为25,单击“确定”按钮保存修改的参数。

图 流水灯顶层模块

图 参数修改对话框

如果在led_waterflow.bdf上不能看到参数设置框,在空白出右击鼠标,选择Show Parameter Assignments命令来显示参数设置框。

(5) 将实验模块选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。

(6) 将led_waterflow.bdf设置成顶层实体Project→ Set as Top-level Entity。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

(7) 把JP20的led0~led7的跳帽插上,使发光二极管有效。下载程序到芯片上,观察流

2

水灯的变化。更改分频模块的分频系数,并重新编译下载,观察流水灯的变化。

表 引脚锁定方法 信号 EP2C5 Led[0] Led[1] Led[2] Led[3] Led[4] 116 110 114 107 112 引脚 EP1C12 128 127 126 125 124 Led[5] Led[6] Led[7] clock 信号 EP2C5 105 63 106 23 引脚 EP1C12 123 122 121 153

3

实验三 读取按键信号

1. 实验目的

通过本实验让学生进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VHDL语言的编程方法;并熟悉VHDL文件为顶层模块的设计;学习和体会分支条件语句case的使用方法及FPGA I/O口的输出控制。

2. 实验内容

实验箱上有8个发光二极管LED1~LED8和8个按键KEY1~KEY8。本实验的内容是用这8个按键分别控制8个发光二极管,一旦有键按下,则点亮相应的发光二极管。

3. 实验原理

FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的。当该I/O口被设置为输入口使用时(如定义key1为输入引脚:input),该I/O控制块将直接使三态缓冲的控制端接地,使得该I/O引脚对外呈高阻态,这样该I/O引脚即可用作专用输入引脚。正确分配并锁定引脚后,一旦在KEY1~KEY8中有键输入,即可在检测到键盘输入的情况下,继续判断其键盘并作出相应的处理。

4. 实验步骤

(1) 启动Quartus II,建立一个空白工程,然后命名为key_led.qpf。

(2) 新建key_led.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。 程序参考

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY keyled

PORT(

key: led: );END;

ARCHITECTURE one OF keyled IS

SIGNAL led_r: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL buffer_r:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN led<=led_r;

PROCESS(key,buffer_r) BEGIN

buffer_r<=key; CASE buffer_r IS

WHEN \led_r<=\ WHEN \led_r<=\ WHEN \led_r<=\ WHEN \led_r<=\ WHEN \led_r<=\ WHEN \led_r<=\

4

IN

STD_LOGIC_VECTOR(7 DOWNTO 0); OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

IS

WHEN \led_r<=\ WHEN \led_r<=\ WHEN

OTHERS=>

led_r<=\

END CASE; END PROCESS;

END;

(3) 选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。

表引脚锁定方法

信号 Led[0] Led[1] Led[2] Led[3] Led[4] Led[5] Led[6] Led[7] 引脚 EP2C5 116 110 114 107 112 105 63 106 EP1C12 信号 Key[0] Key[1] Key[2] Key[3] Key[4] Key[5] Key[6] Key[7] 引脚 EP2C5 56 59 57 61 58 64 60 68 EP1C12

(4) 对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

(5) JP6是一个3针的插座,如果把短接帽接到下面,使下面两个插针短接,则按键有效;如果把短接帽接到上面,使上面两个插针短接,则矩阵键盘有效。本实验令按键有效,把短接帽接到下面。把JP20的led0~led7的跳帽插上,使发光二极管有效。下载程序到芯片上,按下KEY1~KEY8的任何一键,观察发光二极管LED1~LED8的亮灭状态。

5

实验四 静态数码管显示

1. 实验目的

通过本实验让学生学习7段数码管显示译码器的设计,进一步了解、熟悉和掌握FPGA开发软件Quartus II的使用方法及VHDL语言的编程方法,学习LPM兆功能模块的调用。 2. 实验内容

实验箱上有2个4位动态共阳极数码管LEDD4和LEDD3,其中8个位码DIG0~DIG7和8位段码SEG0~SEG7分别与FPGA相应的引脚相连。这样只要DIG0~DIG7上一直输出低电平“0”,则8个数码管将显示相同的数码,这样8位动态数码管就变成了静态数码管。

本实验的内容是建立7段译码显示模块,用于控制LED数码管的静态显示。要求在试验箱上循环显示0~9和A~F 16个字符。

3. 实验原理

数码管LED显示是工程项目中使用较广的一种输出显示器件。常见的数码管有共阴和共阳两种。共阴数码管是将8个发光二极管的阴极连接在一起作为公共端,而共阳数码管是将8个发光二极管的阳极连接在一起作为公共端。公共端常称为位码,而将其它8位称为段码,分别为:a、b、c、d、e、f、g、h,其中h为小数点。对于共阳极数码管,只要公共端为高电平“1”,某个段输出为低电平“0”,则相应的段就亮。 本实验通过分频模块得到1Hz的频率信号,加载于4位计数器的时钟输入端,计数循环输出0~9和A~F 16个字符,通过7段译码模块后在数码管上显示出来。

4. 实验步骤

(1) 启动Quartus II,建立一个空白工程,然后命名为sled.qpf。

(2) 新建decl7s.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。生产符号文件decl7s.bsf (File→ Create/_Update → Create Symbol Files for Current File)。 程序参考

LIBRARY IEEE; USE USE USE PORT(

d:

IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入4位二进制码

--七段译码输出

seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

IEEE.STD_LOGIC_1164.ALL; IEEE.STD_LOGIC_UNSIGNED.ALL; IEEE.STD_LOGIC_ARITH.ALL;

ENTITY decl7s IS

);END;

ARCHITECTURE ONE OF decl7s IS

SIGNAL seg_r:STD_LOGIC_VECTOR(7 DOWNTO 0); --定义数码管输出寄存器 BEGIN seg<=seg_r; PROCESS(d) BEGIN

CASE d IS

WHEN WHEN WHEN

X\X\X\

seg_r<=X\显示0 seg_r<=X\显示1 seg_r<=X\显示2

6

--输出数码管译码结果

--七段译码

WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN

X\X\X\X\X\X\X\X\X\X\X\X\X\

seg_r<=X\显示3 seg_r<=X\显示4 seg_r<=X\显示5 seg_r<=X\显示6 seg_r<=X\显示7 seg_r<=X\显示8 seg_r<=X\显示9 seg_r<=X\显示a seg_r<=X\显示b seg_r<=X\显示c seg_r<=X\显示d seg_r<=X\显示e seg_r<=X\显示f

OTHERS=> seg_r<=X\

END CASE;

END PROCESS; END;

(3) 将实验模块库里的int_div.vhd和int_div.bsf拷贝到工程目录下。 (4) 添加4位兆计数器功能模块。步骤如下:

① 在Quartus II主界面中选择Tools—Mega Wizard Plug-In Manager,打开如图所示的兆功能模块向导。选择Create a new custom megafunction variation新建一个新的兆功能模块。

图 添加兆功能模块向导对话框——Page1

② 单击Next进入向导第2页,按照如下图所示填写。选择LPM_COUNTER,设置号输出文件的类型和路径,使用Cyclone族的器件。

③ 单击Next进入向导第3页,,按照如下图所示填写。选择4位计数器。

④ 剩余步骤不需更改设置,在这里可以一步一步单击Next,或者直接单击Finish结束。注意在结束时一定要选择生成“*.bsf”符号文件。

7

图 添加兆功能模块向导对话框——Page2

图 添加兆功能模块向导对话框——Page3

8

(5) 新建图形设计文件,命名为sled.bdf并保存。文件的设计如下图所示。

图 静态LED显示顶层模块图

(6) 选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。

表 引脚锁定方法

信号 EP2C5 seg[0] seg[1] seg[2] seg[3] seg[4] seg[5] seg[6] seg[7] clock 145 142 143 139 141 137 138 134 23 引脚 EP1C12 161 144 159 141 156 139 143 140 153 dig[0] dig[1] dig[2] dig[3] dig[4] dig[5] dig[6] dig[7] 信号 EP2C5 135 127 133 117 128 115 118 113 引脚 EP1C12 138 137 136 135 134 133 132 131

(7) 将sled.bdf设置成顶层实体(Project—Set as Top-level Entity)。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

(8) 下载程序到芯片上,观察数码管的显示状态。

9

实验五 动态数码管显示

1. 实验目的

学习动态扫描显示的原理及电路的设计。

2. 实验内容

本实验内容是建立数码管动态扫描显示模块。在试验箱上完成LED数码管的动态显示1~8这8个数。稳定显示后,放慢扫描速度演示动态显示的原理过程。

3. 实验原理

数码管LED显示是工程项目中使用较广的一种输出显示器件。常见的数码管共阴和共阳两种。共阴数码管是将8个发光二极管的阴极连接在一起作为公共端,而共阳数码管是将8个发光二极管的阳极连接在一起作为公共端。公共端常称为位码,而将其它8位称为段码,分别为:a、b、c、d、e、f、g、h,其中h为小数点,只要公共端为高电平“1”,某个段输出为低电平“0”,则相应的段就亮。把每个数码管的8个段都分别连接到SEG0~SEG7,8个数码管分别由8个选通信号DIG0~DIG7来选择。被选通的数码管显示,其余关闭。例如在某一时刻,DIG2为“0”,其余数码管选通信号为“1”,这是仅DIG2对应的LED数码管显示来自段码信号端的数据,而其他数码管成关闭状态。根据这种电路状态,如果希望8个数码管全都显示想要的数据,就必须使得8个选通信号DIG0~DIG7分别单独选通,同时在段输入端加上对应的数据。虽然每次只有一个LED显示,但只要扫描的速率够快,由于人眼视觉的余晖效益,我们仍会感觉所有数码管都在同时显示。

4. 实验步骤

(1) 启动Quartus II,建立一个空白工程,然后命名为dled.qpf。

(2) 新建scan_led.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。生产符号文件scan_led.bsf (File→ Create/_Update → Create Symbol Files for Current File)。 程序参考:

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY scan_led IS PORT(

clk_1k: d:

IN IN

STD_LOGIC;

STD_LOGIC_VECTOR(31 DOWNTO 0);

--输入要显示的数据 --数码管选择输出引脚 --数码管段输出引脚

dig: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END ENTITY;

ARCHITECTURE one OF scan_led IS

SIGNAL seg_r: SIGNAL dig_r: SIGNAL SIGNAL BEGIN

10

count:

STD_LOGIC_VECTOR(7 DOWNTO 0); STD_LOGIC_VECTOR(7 DOWNTO 0); STD_LOGIC_VECTOR(2 DOWNTO 0);

--定义数码管输出寄存器 --定义数码管选择输出寄存器 --定义显示数据寄存器 --定义计数寄存器

disp_dat: STD_LOGIC_VECTOR(3 DOWNTO 0);

dig<=dig_r; seg<=seg_r; PROCESS(clk_1k) BEGIN

IF

RISING_EDGE(clk_1k) THEN

count<=count+1;

END IF; END PROCESS; PROCESS(clk_1k) BEGIN

IF

RISING_EDGE(clk_1k) THEN

CASE count IS

WHEN \disp_dat<=d(31 DOWNTO 28); --第一个数码管 WHEN \disp_dat<=d(27 DOWNTO 24); --第二个数码管 WHEN \disp_dat<=d(23 DOWNTO 20); --第三个数码管 WHEN \disp_dat<=d(19 DOWNTO 16); --第四个数码管 WHEN \disp_dat<=d(15 DOWNTO 12); --第五个数码管 WHEN \disp_dat<=d(11 DOWNTO 8); WHEN \disp_dat<=d(7 DOWNTO 4); WHEN \disp_dat<=d(3 DOWNTO 0); END CASE; CASE count IS

--选择数码管显示位

--选择第一个数码管显示 --选择第二个数码管显示 --选择第三个数码管显示 --选择第四个数码管显示 --选择第五个数码管显示 --选择第六个数码管显示 --选择第七个数码管显示 --选择第八个数码管显示

WHEN \dig_r<=\ WHEN \dig_r<=\ WHEN \dig_r<=\ WHEN \dig_r<=\ WHEN \dig_r<=\ WHEN \dig_r<=\ WHEN \dig_r<=\ WHEN \dig_r<=\ END CASE;

--第六个数码管 --第七个数码管 --第八个数码管

END IF; END PROCESS; PROCESS(disp_dat)

BEGIN

CASE disp_dat IS

WHEN X\seg_r<=X\显示0 WHEN X\seg_r<=X\显示1 WHEN X\seg_r<=X\显示2 WHEN X\seg_r<=X\显示3 WHEN X\seg_r<=X\显示4 WHEN X\seg_r<=X\显示5 WHEN X\seg_r<=X\显示6

11

WHEN X\seg_r<=X\显示7 WHEN X\seg_r<=X\显示8 WHEN X\seg_r<=X\显示9 WHEN X\seg_r<=X\显示a WHEN X\seg_r<=X\显示b WHEN X\seg_r<=X\显示c WHEN X\seg_r<=X\显示d WHEN X\seg_r<=X\显示e WHEN X\seg_r<=X\显示f

END CASE; END PROCESS;

END;

(3) 将实验模块库里的int_div.vhd和int_div.bsf拷贝到工程目录下。 (4) 添加4位兆计数器功能模块。步骤如下:

① 在Quartus II主界面中选择Tools—Mega Wizard Plug-In Manager,打开如图所示的兆功能模块向导。选择Create a new custom megafunction variation新建一个新的兆功能模块。

图 添加兆功能模块向导对话框——Page1

② 单击Next进入向导第2页,按照如下图所示填写。选择LPM_CONSTANT,设置好输出文件的类型和路径,使用Cyclone族的器件。

12

图 添加兆功能模块向导对话框——Page2

③ 单击Next进入向导第3页,,按照如下图所示填写。数据宽度32位,数值为12345678H。

13

图 添加兆功能模块向导对话框——Page3

④ 剩余步骤不需更改设置,在这里可以一步一步单击Next,或者直接单击Finish结束。如下图所示。注意在结束时一定要选择生成“*.bsf”符号文件。

14

图 添加兆功能模块向导对话框——结束页

(5) 新建图形设计文件,命名为dled.bdf并保存。文件的设计如下图所示。

图 动态LED顶层显示模块

(6) 选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。

表 引脚锁定方法

15

表 引脚锁定方法

信号 EP2C5 seg[0] seg[1] seg[2] seg[3] seg[4] seg[5] seg[6] seg[7] clock 145 142 143 139 141 137 138 134 23 引脚 EP1C12 161 144 159 141 156 139 143 140 153 dig[0] dig[1] dig[2] dig[3] dig[4] dig[5] dig[6] dig[7] 信号 EP2C5 135 127 133 117 128 115 118 113 引脚 EP1C12 138 137 136 135 134 133 132 131

(7) 将dled.bdf设置成顶层实体(Project—Set as Top-level Entity)。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

(8) 下载程序到芯片上,观察数码管的显示状态。

(9) 稳定显示后,放慢扫描速度演示动态显示的原理过程。

16

实验 蜂鸣器输出报警声

1. 实验目的

学习交流蜂鸣器的发声原理。 2. 实验内容

在实验箱上的蜂鸣器输出报警笛声。

3. 实验原理

实验箱上有一个交流蜂鸣器BUZZER,只要在BEEP上输入一定频率的脉冲,蜂鸣器就会发出高低音调不同的声音。

4. 实验步骤

(1) 启动Quartus II,建立一个空白工程,然后命名为beep.qpf。

(2) 新建beep.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。 程序参考:

LIBRARY IEEE; USE USE USE

IEEE.STD_LOGIC_1164.ALL; IEEE.STD_LOGIC_UNSIGNED.ALL; IEEE.STD_LOGIC_ARITH.ALL;

ENTITY beep IS

PORT(

clk_48M : output

:

IN

STD_LOGIC;

OUT STD_LOGIC);

END ;

ARCHITECTURE one of beep IS

SIGNAL SIGNAL BEGIN

PROCESS(clk_48M) BEGIN

PROCESS(count(9)) BEGIN

beep_r<= not (count(13) AND count(24) AND count(27)); END PROCESS; output<=beep_r;

IF

RISING_EDGE(clk_48M)THEN IF

count=

\

count <= \count<=count+1; count: beep_r:

STD_LOGIC_VECTOR(27 DOWNTO 0); STD_LOGIC;

ELSE END IF;

END IF;

END PROCESS;

END;

17

(3) 选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。

表 引脚锁定方法

信号 beep 引脚 EP2C5 103 EP1C12 119 信号 clk 引脚 EP2C5 23 EP1C12 153

(4) 对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

(5) 将JP2 和JP20的beep接上,使得蜂鸣器有效。下载程序到芯片上,将跳线短接帽接好,此时可以听到蜂鸣器发出“滴滴”的报警声。

18

实验 1位全加器的文本输入(波形仿真用)

1. 实验目的

通过此实验让学生逐步了解、熟悉和掌握FPGA开发软件Quartus II的使用方法及VHDL的编程方法。学习电路的仿真方法。

2. 实验内容

本实验的内容是建立一个1位全加器。在实验箱上的按键KEY1~KEY3分别为A、B和Cin,并通过LED1~LED3指示相应的状态。输出Sum和Cout通过LED7和LED8指示。 3. 实验原理

1位全加器的真值表如下所示。

表 1位全加器逻辑功能真值表

A 0 0 1 1 0 0 1 1 B 0 1 0 1 0 1 0 1 Cin 0 0 0 0 1 1 1 1 Sum 0 1 1 0 1 0 0 1 Cout 0 0 0 1 0 1 1 1 4. 实验步骤

(1) 启动Quartus II,建立一个空白工程,然后命名为full_add.qpf。

(2) 新建full_add.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。 程序参考:

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY full_add IS PORT(

a,b,cin:

IN STD_LOGIC;

key1,key2,key3: OUT STD_LOGIC; sum,cout: OUT STD_LOGIC ); END;

ARCHITECTURE one OF full_add BEGIN Key1<=a; a_r b_r

<= '0' & a; <= '0' & b;

--将1位矢量扩为2位 --将1位矢量扩为2位

IS

SIGNAL sum_r,a_r,b_r,cin_r:STD_LOGIC_VECTOR( 1 DOWNTO 0);

cin_r<= '0' & cin; --将1位矢量扩为2位

sum_r<=a_r+b_r+cin_r; sum<=sum_r(0);

19

cout<=sum_r(1); END;

(3) 波形仿真步骤如下:

① 在Quartus II主界面中选择File→ New命名,打开新建文件对话框,从中选择Vector Waveform File,如下图所示。单击OK建立一个空的波形编辑窗口。选择File→Save as 改名为full_add.vwf。此时会看到窗口内出现如下图所示。

在空白处双击鼠标左键

图 新建文件对话框 图 新建波形文件界面

② 在上图所示的Name选项卡内双击鼠标左键,弹出如图 所示的对话框。在该对话框中单击Node Finder按钮,弹出如图 所示的对话框。

图 添加节点对话框

③ 按照下图所示进行选择和设置,先按下“list”按钮,再按下“>>”按钮添加所有节点,最后按下“ok”按钮。

20

图 添加节点

④ 波形编辑器默认的仿真结束时间为1us,根据仿真需要可以设置仿真文件的结束时间。选择Edit→ End Time命令可以更改。这里采用默认值不需更改。

图 添加完节点的波形图

⑤ 编辑输入节点的波形。编辑时将使用到波形编辑工具栏中的各种工具。下图显示了工具栏中各种工具的功能。

21

图 波形编辑器工具条

⑥ 在Quartus II主界面下选择Processing→ Simulator Tool 命令,弹出如下图对话框。按下图步骤进行选择和设置

⑦ 观察仿真结果是否与设计相符合,如果不符合,须重新设计文件,再进行综合编译、仿真,直到仿真结果与设计相符为止。

22

图 仿真设置对话框

图 1位全加器仿真波形图

(4)选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。

表 引脚锁定方法

信号 EP2C5 Led0 Led1 Led2 sum

116 110 114 63 引脚 EP1C12 128 127 126 122 23

Key0 Key1 Key2 cout 信号 EP2C5 56 59 57 106 引脚 EP1C12 75 78 77 121 (5)P6是一个3针的插座,如果把短接帽接到下面,使下面两个插针短接,则按键有效;如果把短接帽接到上面,使上面两个插针短接,则矩阵键盘有效。本实验令按键有效,把短接帽接到下面。把JP20的LED1~LED8的跳帽插上,使发光二极管有效。下载程序,按下KEY1~KEY3,观察发光二极管LED1~LED3、LED7、LED8的状态。

24

实验 直流电机PWM控制

1. 实验目的

学习使用PWM对直流电机进行调速控制,掌握PWM控制的工作原理。

2. 实验内容

本实验的内容是设计使用PWM信号来控制直流电机的加速、减速,并控制其正转、反转、停止、启动等操作。利用Quartus II完成设计仿真,最后在实验箱上进行硬件测试。速度等级分为16级(0~F),用KEY1输入并由LED1~LED4指示(LED1为最高位,LED为最低位)。Key2控制电机的停止和启动,由LED8指示其状态,key3控制电机正反转,电机转到时检测反馈回来的脉冲通过频率计测量最后显示在数码管1~8上。

3. 实验原理

对直流电机进行调速,可以通过PWM(Pulse-Width Modulation,脉宽调制)波来控制电机调速。 4. 实验步骤

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY moto_test IS PORT(

clock_48M: key: pwm_in: pwm_en:

IN STD_LOGIC; IN STD_LOGIC; OUT STD_LOGIC;

--系统时钟(48MHz)

--产生的PWM波输入 --PWM控制使能端

IN STD_LOGIC_VECTOR(2 DOWNTO 0);--按键输入(key1~key3)

duty_cycle: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--PWM占空比控制输出 motoa,motob:OUT STD_LOGIC; led: ); END;

ARCHITECTURE one OF moto_test IS SIGNAL duty_cycle_io: SIGNAL pwm_en_io: SIGNAL count: SIGNAL moto_dir: SIGNAL clk: BEGIN

led<=NOT (pwm_en_io & duty_cycle_io);--LED输出状态指示 pwm_en <= pwm_en_io;

25

STD_LOGIC_VECTOR(3 DOWNTO 0); STD_LOGIC;

STD_LOGIC_VECTOR(16 DOWNTO 0);--时钟分频计数器 STD_LOGIC;--电机正反转

STD_LOGIC_VECTOR(2 DOWNTO 0);--按键消抖输出

STD_LOGIC;--分频时钟

STD_LOGIC_VECTOR(2 DOWNTO 0);

--PWM波输出

OUT STD_LOGIC_VECTOR(4 DOWNTO 0)

SIGNAL dout1,dout2,dout3:STD_LOGIC_VECTOR(2 DOWNTO 0);--消抖寄存器 SIGNAL k_debounce: SIGNAL key_edge:

duty_cycle <= duty_cycle_io;

PROCESS(clock_48M) BEGIN

IF RISING_EDGE(clock_48m) THEN

IF count<120000 THEN

count<=count+1; clk<='0';

count<=B\clk<='1';

ELSE

END IF;

END IF;

-------------------------------------------<<按键消抖部分

END PROCESS; PROCESS (clock_48m) BEGIN

PROCESS (clock_48M) BEGIN

IF RISING_EDGE(clock_48M) THEN

k_debounce<=dout1 OR dout2 OR dout3;--按键消抖输出. END IF;

IF RISING_EDGE(clock_48M) THEN

IF clk='1' THEN

dout1<=key; dout2<=dout1; dout3<=dout2;

END IF;

END IF;

END PROCESS;

END PROCESS;

key_edge<=NOT (dout1 OR dout2 OR dout3) AND k_debounce;

PROCESS(clock_48M)--按键1 控制电动机速度 BEGIN

PROCESS(clock_48M)--按键2,控制电动机启动、停止

IF RISING_EDGE(clock_48M) THEN

IF key_edge(0)='1' THEN

duty_cycle_io<=duty_cycle_io+1; END IF;

END IF;

END PROCESS;

26

BEGIN

PROCESS(clock_48M)--按键3,控制电动机正/反转 IF RISING_EDGE(clock_48M) THEN

IF key_edge(1)='1' THEN

pwm_en_io<=NOT pwm_en_io; END IF;

END IF;

END PROCESS;

BEGIN IF RISING_EDGE(clock_48M) THEN IF key_edge(2)='1' THEN

moto_dir <=NOT moto_dir;

END IF;

END IF;

END PROCESS;

motoa<=pwm_in WHEN moto_dir='1' ELSE '0'; motob<='0' WHEN moto_dir='1' ELSE pwm_in; END;

27

实验 用状态机实现对TLC549的采样控制(A/D实验)

1. 实验目的

熟悉串行模/数转换芯片TLC549的使用方法,掌握利用有限状态机实现一般的时序逻辑分析的方法,了解一般状态机的设计与应用。

2. 实验内容

本实验的内容是利用状态机实现对TLC549的采样控制,制作一个简易电压表。在实验箱上进行硬件测试。实验时利用调节电位器RW1改变ADC的模拟输入值,数据采样读取后由数码管LEDD3显示。最后用万用表测量输入电压,并与读到的数据做比较。 3. 实验原理

TLC549是一个8位的串行模/数转换器,A/D转换时间最大17us,I/O时钟频率可达1.1MHz。如下图为TLC549的访问时序,从图中可以看出当CS拉低时,ADC前一次的转换数据(A) 的最高位A7立即出现在数据线DATA OUT上,之后的数据在时钟I/O CLOCK的下降沿改变,可在I/O CLOCK的上升沿读数据。读完8位数据后,ADC开始转换这一次的采样信号(B),以便在下一次读取。转换时,片选信号CS要置高电平。设计操作时序要注意Tsu(CS)、Tconv、I/O CLOCK的频率等几个参数。Tsu(CS) 为CS拉低到I/O CLOCK第一个时钟到来时间,至少要1.4us;Tconv为ADC的转换时钟,不超过1.7us;I/O CLOCK不能超过1.1MHz。其他参数参考数据手册。

图 TLC549访问时序

由于ADC是8位的,所以采样的电压值为

V?D256?VREF

VREF为参考电压值,其中V为采样值;D为ADC转换后读取的8位二进制数,这里是2.5V。

4. 实验步骤

(1) 启动Quartus II,建立一个空白工程,然后命名为tlc549.qpf。

(2) 新建adc.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。生产符号文件adc.bsf (File→ Create/_Update → Create Symbol Files for Current File)。 程序参考

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL;

28

USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY adc IS GENERIC( CLK_DIV_BITS: ); PORT( clock: reset: enable: sdat_in: adc_clk: cs_n:

IN IN

IN IN

STD_LOGIC;--系统时钟 STD_LOGIC;--转换使能 STD_LOGIC;--复位,高电平有效 STD_LOGIC;--TLC549串行数据输入

Integer:=5;

CLK_DIV_VALUE: Integer:=31

OUT STD_LOGIC;--TLC549 I/O时钟 OUT STD_LOGIC;--TLC549 片选控制

data_ready:OUT STD_LOGIC;--指示有新的数据输出

data_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--AD转换数据输出 ); END;

ARCHITECTURE one OF adc IS SIGNAL adc_clk_r: SIGNAL cs_n_r:

STD_LOGIC; STD_LOGIC;

SIGNAL data_ready_r:STD_LOGIC;

SIGNAL data_out_r: STD_LOGIC_VECTOR(7 DOWNTO 0);--AD转换数据输出. SIGNAL sdat_in_r: SIGNAL q:

SIGNAL bit_count: SIGNAL div_clk: SIGNAL clk_count: SIGNAL buf1,buf2: SIGNAL rec_done:

STD_LOGIC;--数据输出锁存

STD_LOGIC_VECTOR(7 DOWNTO 0);--移位寄存器,用于接收或发送数据 STD_LOGIC_VECTOR(5 DOWNTO 0);--移位计数器

STD_LOGIC;

SIGNAL bit_count_rst:STD_LOGIC;--ADC时钟计数全能控制.

STD_LOGIC_VECTOR(CLK_DIV_BITS-1 DOWNTO 0);--时钟盼频计数器 STD_LOGIC;

STD_LOGIC;--数据读取完毕的标志

SIGNAL ready_done: STD_LOGIC;--cs_n拉低(大于1.4us)后的标志 SIGNAL conv_done: STD_LOGIC;--数据转换完毕的标志

TYPE states IS(idle,adc_ready,adc_receive,adc_conversion,adc_data_load); SIGNAL adc_state,adc_next_state:states; BEGIN

adc_clk<=adc_clk_r; cs_n<=cs_n_r; data_out<=data_out_r; data_ready<=data_ready_r; PROCESS (clock) BEGIN

IF RISING_EDGE(clock) THEN

sdat_in_r<=sdat_in; END IF;

29

END PROCESS;

-----------------------------------------<<时钟分频计数器 PROCESS (clock) BEGIN

IF RISING_EDGE(clock) THEN

IF reset='1' THEN

clk_count<=\IF clk_count<

CLK_DIV_VALUE THEN

ELSE

clk_count<=clk_count+1; div_clk<='0'; clk_count<=\div_clk<='1';

ELSE

END IF;

END IF;

END IF;

END PROCESS;

--------------------------------------------<<状态机ADC PROCESS (clock) BEGIN

IF RISING_EDGE(clock) THEN

IF reset='1' THEN

adc_state<=idle;

adc_state<=adc_next_state; ELSE END IF;

END IF;

END PROCESS;

--------------------------------------------<

cs_n_r<='0'; bit_count_rst<='0'; data_ready_r<='0'; CASE adc_state IS

WHEN idle=>

cs_n_r<='1'; bit_count_rst<='1'; IF

--复位移位计数器.

enable='1' THEN

adc_next_state<=adc_ready; adc_next_state<=idle;

--初始状态

ELSE END IF;

30

本文来源:https://www.bwwdw.com/article/9d1.html

Top