电脑串口引脚定义键盘显示器的eda引脚锁定

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
EDA十进制计数器的设计设计,器,计数,EDA,十进制,计数器的,eda,Eda,计数器,eda的
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
EDA十进制计数器的设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口EDA实验箱核心板数码管引脚锁定对应表_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
EDA实验箱核心板数码管引脚锁定对应表
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢您所在位置: &
&nbsp&&nbsp
数字电路及EDA实验系统设计及其应用分析.pdf 116页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
硕士学位论文
数字电路及EDA实验系统设计及其应用
姓名:徐琼燕
申请学位级别:硕士
专业:机械工程
指导教师:刘国平;孙丽霞
培养大批应用型、技能型人才是我国高职教育的目标,实验教学是理论联系
实际的重要环节,对培养高职学生的技术应用能力、创新能力具有不可替代的
作用。而先进的实验教学要以先进的实验设备为物质基础。数字电路是高职电
类专业一门技术基础课,具有较强的实践性。本研究针对高职学生学习特点,
以高职学生数字电路实验课程的教学大纲为指导,重点研究了数字电路实验系
统的设计及其应用。该数字电路实验系统基本满足高职院校学生的教学需求,
通过实验系统可以达到锻炼学生的动手操作、扩展电路、软硬件结合以及实现
仿真等教学目的。主要研究内容和成果包括:
(1)概述并分析了现有数字电路实验系统的发展现状。
(2)设计了适合高职院校教学使用的全开放式数字电路及EDA实验系统,
并对其各个模块进行了详细分析。包括7数码管及其驱动电路、CPLD芯片接口
电路、扫描驱动类接口电路、通用数字接口电路、模拟器件及接口电路、稳压
电源、时钟源、单脉冲及相位滞后脉冲等组成部分。
(3)应用研制的实验系统,针对培养应用型、技能型人才的高职教育的目
标,以能力培养为核心,编排了17个所需开设的实验内容。具体的实验可分为
三类:基础性实验、设计性实验和综合设计性实验。
进行软件仿真,后构建真实电路的方法。提高了实验成功率,减少了实验器材
关键词:数字电路、EDA、系统设计、实验设计、仿真
Cultivatinglarge
application—oriented,skills-based
ofChina'sVocationalEducationandthe
experimentalteachingimportant
Vocational
actual,which
playsirreplaceable
student’S
circuitisa
technologyinnovation.Digitalprofessional
foundationcoursesandhas
researchfeaturesthe
strongpracticality.This
Vocationaland
curriculum,
guidedby digital experiment
focusonthe
正在加载中,请稍后...1688.com,阿里巴巴打造的全球最大的采购批发平台
1688/淘宝会员(仅限会员名)请在此登录
cbulogin.center.et2Server is OK当前位置: >>
EDA实验箱实验指导书
实验二 流水灯1. 实验目的 通过本实验让学生进一步了解、 熟悉和掌握 CPLD/FPGA 开发软件的使用方法及 VHDL 语言的编程方法;学习简单的时序电路的设计和硬件测试。 2. 实验内容 本实验的内容是控制实验箱上的发光二极管 LED1―LED8,使之实现流水灯显示。 3. 实验原理 在 LED1~LED8 引脚上周期性地输出流水数据,即输出的数据依次为 、 000000, 如此循环显示,输出数据“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: led: );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=&& THEN led_r&=&&; END IF; END IF; END PROCESS; END; --循环完毕吗? --是,则重新赋初值 OF ledwater IS IN STD_LOGIC;OUT STD_LOGIC_VECTOR(7 DOWNTO 0)led_r:STD_LOGIC_VECTOR(8 DOWNTO 0);(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 的值改为 ,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 ISPORT( key: led: );END; ARCHITECTURE one OF keyled IS SIGNAL led_r: STD_LOGIC_VECTOR(7 DOWNTO 0); IN STD_LOGIC_VECTOR(7 DOWNTO 0);OUT 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&= CASE buffer_r IS WHEN &&=& led_r&=&&; WHEN &&=& led_r&=&&; WHEN &&=& led_r&=&&; WHEN &&=& led_r&=&&; WHEN &&=& led_r&=&&; WHEN &&=& led_r&=&&; 4 WHEN &&=& led_r&=&&; WHEN &&=& led_r&=&&; WHEN END CASE; END PROCESS; END; OTHERS=& led_r&=&&;(3) 选择目标器件并对相应的引脚进行锁定,这里选择的器件为 Altera 公司的 Cyclone II 系列的 EP2C5Q208C8, 或者 Cyclone I 系列的 EP1C12Q240C8。 引脚锁定方法如下表所列。 表引脚锁定方法引脚 信号 EP2C5 Led[0] Led[1] Led[2] Led[3] Led[4] Led[5] Led[6] Led[7] 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 IEEE.STD_LOGIC_1164.ALL; IEEE.STD_LOGIC_UNSIGNED.ALL; IEEE.STD_LOGIC_ARITH.ALL;ENTITY decl7s IS PORT( d: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入 4 位二进制码 --七段译码输出seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END; ARCHITECTURE ONE OF decl7s ISSIGNAL seg_r:STD_LOGIC_VECTOR(7 DOWNTO 0); --定义数码管输出寄存器 BEGIN seg&=seg_r; PROCESS(d) BEGIN CASE d IS WHEN WHEN WHEN X&0&=& X&1&=& X&2&=& seg_r&=X&c0&;--显示 0 seg_r&=X&f9&;--显示 1 seg_r&=X&a4&;--显示 2 6 --输出数码管译码结果 --七段译码 WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN END CASE; END PROCESS; END;X&3&=& X&4&=& X&5&=& X&6&=& X&7&=& X&8&=& X&9&=& X&a&=& X&b&=& X&c&=& X&d&=& X&e&=& X&f&=&seg_r&=X&b0&;--显示 3 seg_r&=X&99&;--显示 4 seg_r&=X&92&;--显示 5 seg_r&=X&82&;--显示 6 seg_r&=X&f8&;--显示 7 seg_r&=X&80&;--显示 8 seg_r&=X&90&;--显示 9 seg_r&=X&88&;--显示 a seg_r&=X&83&;--显示 b seg_r&=X&c6&;--显示 c seg_r&=X&a1&;--显示 d seg_r&=X&86&;--显示 e seg_r&=X&8e&;--显示 fOTHERS=& seg_r&=X&FF&;(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图 添加兆功能模块向导对话框――Page38 (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: dig: seg: ); END ENTITY; IN IN STD_LOGIC; STD_LOGIC_VECTOR(31 DOWNTO 0); --输入要显示的数据 --数码管选择输出引脚 --数码管段输出引脚OUT STD_LOGIC_VECTOR(7 DOWNTO 0); OUT STD_LOGIC_VECTOR(7 DOWNTO 0)ARCHITECTURE one OF scan_led IS SIGNAL SIGNAL SIGNAL SIGNAL BEGIN 10 seg_r: dig_r: disp_dat: count: STD_LOGIC_VECTOR(7 DOWNTO 0); STD_LOGIC_VECTOR(7 DOWNTO 0); STD_LOGIC_VECTOR(3 DOWNTO 0); STD_LOGIC_VECTOR(2 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 &000&=& disp_dat&=d(31 DOWNTO 28); WHEN &001&=& disp_dat&=d(27 DOWNTO 24); WHEN &010&=& disp_dat&=d(23 DOWNTO 20); WHEN &011&=& disp_dat&=d(19 DOWNTO 16); --第一个数码管 --第二个数码管 --第三个数码管 --第四个数码管 --第五个数码管 --第六个数码管 --第七个数码管 --第八个数码管WHEN &100&=& disp_dat&=d(15 DOWNTO 12); WHEN &101&=& disp_dat&=d(11 DOWNTO 8); WHEN &110&=& WHEN &111&=& END CASE; CASE count IS disp_dat&=d(7 DOWNTO 4); disp_dat&=d(3 DOWNTO 0);--选择数码管显示位 --选择第一个数码管显示 --选择第二个数码管显示 --选择第三个数码管显示 --选择第四个数码管显示 --选择第五个数码管显示 --选择第六个数码管显示 --选择第七个数码管显示 --选择第八个数码管显示WHEN &000&=& dig_r&=&&; WHEN &001&=& dig_r&=&&; WHEN &010&=& dig_r&=&&; WHEN &011&=& dig_r&=&&;WHEN &100&=& dig_r&=&&; WHEN &101&=& dig_r&=&&; WHEN &110&=& WHEN &111&=& END CASE; END IF; END PROCESS; dig_r&=&&; dig_r&=&&;PROCESS(disp_dat) BEGIN CASE disp_dat IS WHEN X&0&=& seg_r&=X&c0&;--显示 0 WHEN X&1&=& seg_r&=X&f9&;--显示 1 WHEN X&2&=& seg_r&=X&a4&;--显示 2 WHEN X&3&=& seg_r&=X&b0&;--显示 3 WHEN X&4&=& seg_r&=X&99&;--显示 4 WHEN X&5&=& seg_r&=X&92&;--显示 5 WHEN X&6&=& seg_r&=X&82&;--显示 611 WHEN X&7&=& seg_r&=X&f8&;--显示 7 WHEN X&8&=& seg_r&=X&80&;--显示 8 WHEN X&9&=& seg_r&=X&90&;--显示 9 WHEN X&a&=& seg_r&=X&88&;--显示 a WHEN X&b&=& seg_r&=X&83&;--显示 b WHEN X&c&=& seg_r&=X&c6&;--显示 c WHEN X&d&=& seg_r&=X&a1&;--显示 d WHEN X&e&=& seg_r&=X&86&;--显示 e WHEN X&f&=& seg_r&=X&8e&;--显示 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 位,数值为 H。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 END ; ARCHITECTURE one of beep IS SIGNAL SIGNAL BEGIN PROCESS(clk_48M) BEGIN IF RISING_EDGE(clk_48M)THEN IF count= &1111& THEN count: beep_r: STD_LOGIC_VECTOR(27 DOWNTO 0); STD_LOGIC; : : IN STD_LOGIC;OUT STD_LOGIC);count &= &0000&; ELSE count&=count+1; END IF; END IF; END PROCESS;PROCESS(count(9)) BEGIN beep_r&= not (count(13) AND count(24) AND count(27)); END PROCESS; output&=beep_r; END; 17 (3) 选择目标器件并对相应的引脚进行锁定,这里选择的器件为 Altera 公司的 Cyclone II 系列的 EP2C5Q208C8, 或者 Cyclone I 系列的 EP1C12Q240C8。 引脚锁定方法如下表所列。表 引脚锁定方法引脚 信号 EP2C5 beep 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 14. 实验步骤 (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 PORT( a,b,cin: IN STD_LOGIC; full_add ISkey1,key2,key3: OUT STD_LOGIC; sum,cout: END; ARCHITECTURE one OF full_add IS OUT STD_LOGIC );SIGNAL sum_r,a_r,b_r,cin_r:STD_LOGIC_VECTOR( 1 DOWNTO 0); BEGIN Key1&=a; a_r b_r &= &= '0' & '0' & '0' & --将 1 位矢量扩为 2 位 --将 1 位矢量扩为 2 位 --将 1 位矢量扩为 2 位cin_r&=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 Key0 Key1 Key2 cout 信号 EP2C5 56 59 57 106 EP1C12 75 78 77 121 引脚23 (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 IN STD_LOGIC; --系统时钟(48MHz)STD_LOGIC_VECTOR(2 DOWNTO 0);--按键输入(key1~key3) IN STD_LOGIC; --产生的 PWM 波输入 --PWM 控制使能端OUT STD_LOGIC;duty_cycle: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--PWM 占空比控制输出 motoa,motob:OUT STD_LOGIC; led: ); END; --PWM 波输出OUT STD_LOGIC_VECTOR(4 DOWNTO 0)ARCHITECTURE one OF moto_test IS SIGNAL duty_cycle_io: SIGNAL pwm_en_io: SIGNAL count: STD_LOGIC_VECTOR(3 DOWNTO 0); STD_LOGIC; STD_LOGIC_VECTOR(16 DOWNTO 0);--时钟分频计数器SIGNAL dout1,dout2,dout3:STD_LOGIC_VECTOR(2 DOWNTO 0);--消抖寄存器 SIGNAL moto_dir: SIGNAL k_debounce: SIGNAL clk: SIGNAL key_edge: STD_LOGIC;--电机正反转 STD_LOGIC_VECTOR(2 DOWNTO 0);--按键消抖输出STD_LOGIC;--分频时钟 STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN led&=NOT (pwm_en_io & duty_cycle_io);--LED 输出状态指示 pwm_en &= pwm_en_ 25 duty_cycle &= duty_cycle_PROCESS(clock_48M) BEGIN IF RISING_EDGE(clock_48m) THEN IF count&120000 THEN count&=count+1; clk&='0'; ELSE count&=B&0_00_0000&; clk&='1'; END IF; END IF; END PROCESS; -------------------------------------------&&按键消抖部分 PROCESS (clock_48m) BEGIN IF RISING_EDGE(clock_48M) THEN IF clk='1' THEN dout1&= dout2&=dout1; dout3&=dout2; END IF; END IF; END PROCESS;PROCESS (clock_48M) BEGIN IF RISING_EDGE(clock_48M) THEN k_debounce&=dout1 OR dout2 OR dout3;--按键消抖输出. END IF; END PROCESS; key_edge&=NOT (dout1 OR dout2 OR dout3) AND k_PROCESS(clock_48M)--按键 1 控制电动机速度 BEGIN 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;PROCESS(clock_48M)--按键 2,控制电动机启动、停止26 BEGIN IF RISING_EDGE(clock_48M) THEN IF key_edge(1)='1' THEN pwm_en_io&=NOT pwm_en_ END IF; END IF; END PROCESS;PROCESS(clock_48M)--按键 3,控制电动机正/反转 BEGIN IF RISING_EDGE(clock_48M) THEN IF key_edge(2)='1' THEN moto_dir &=NOT moto_ END IF; END IF; END PROCESS; motoa&=pwm_in WHEN moto_dir='1' ELSE '0'; motob&='0' WHEN moto_dir='1' ELSE pwm_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=D × VREF 256其中 V 为采样值; 为 ADC 转换后读取的 8 位二进制数, REF 为参考电压值, D V 这里是 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: CLK_DIV_VALUE: ); PORT( clock: reset: enable: sdat_in: adc_clk: cs_n: IN IN IN STD_LOGIC;--系统时钟 Integer:=5; Integer:=31STD_LOGIC;--复位,高电平有效 IN STD_LOGIC;--转换使能STD_LOGIC;--TLC549 串行数据输入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: STD_LOGIC;--数据输出锁存 STD_LOGIC_VECTOR(7 DOWNTO 0);--移位寄存器,用于接收或发送数据 STD_LOGIC_VECTOR(5 DOWNTO 0);--移位计数器SIGNAL bit_count_rst:STD_LOGIC;--ADC 时钟计数全能控制. SIGNAL div_clk: SIGNAL clk_count: SIGNAL buf1,buf2: STD_LOGIC; STD_LOGIC_VECTOR(CLK_DIV_BITS-1 DOWNTO 0);--时钟盼频计数器 STD_LOGIC;SIGNAL ready_done: STD_LOGIC;--cs_n 拉低(大于 1.4us)后的标志 SIGNAL rec_done: STD_LOGIC;--数据读取完毕的标志SIGNAL conv_done: STD_LOGIC;--数据转换完毕的标志 TYPE states IS(idle,adc_ready,adc_receive,adc_conversion,adc_data_load); SIGNAL adc_state,adc_next_state: 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_ END IF;29 END PROCESS; -----------------------------------------&&时钟分频计数器 PROCESS (clock) BEGIN IF RISING_EDGE(clock) THEN IF reset='1' THEN clk_count&=&00000&; ELSE IF clk_count& CLK_DIV_VALUE THENclk_count&=clk_count+1; div_clk&='0'; ELSE clk_count&=&00000&; div_clk&='1'; END IF; END IF; END IF; END PROCESS; --------------------------------------------&&状态机 ADC PROCESS (clock) BEGIN IF RISING_EDGE(clock) THEN IF reset='1' THEN adc_state&= ELSE adc_state&=adc_next_ END IF; END IF; END PROCESS; --------------------------------------------&&ADC 状态机转换逻辑 PROCESS (adc_state,ready_done,rec_done,conv_done,enable) BEGIN 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_ ELSE adc_next_state&= END IF; --复位移位计数器. --初始状态30 WHEN adc_ready=& --准备接收 IF ready_done='1' THEN adc_next_state&=adc_ ELSE adc_next_State&=adc_ END IF; WHEN adc_receive=& --接收数据 IF rec_done='1' THENadc_next_state&=adc_ ELSE adc_next_state&=adc_ END IF; WHEN adc_conversion=& cs_n_r&='1'; IF conv_done='1' THEN adc_next_state&=adc_data_ ELSE adc_next_state&=adc_ END IF; WHEN adc_data_load=& data_ready_r&='1';--数据输出标志. adc_next_state&= WHEN OTHERS=&adc_next_state&= END CASE; END PROCESS; PROCESS (clock)--位移位计数器 BEGIN IF RISING_EDGE(clock) THEN IF reset='1' THEN bit_count&=&000000&; ELSIF bit_count_rst='1' THEN bit_count&=&000000&; ELSIF div_clk='1' THEN --转换前的采样的数据.bit_count&=bit_count+1; END IF; END IF; END PROCESS; ready_done&='1' rec_done&='1' conv_done&='1' WHEN bit_count=4 ELSE '0';--准备读取数据WHEN bit_count=19 ELSE '0';--接收数据完毕 WHEN bit_count=63 ELSE '0';--接收数据完毕---------------------&&在接收位计数器 4-20 间 8 个 adc clk PROCESS(bit_count) BEGIN IF bit_count&20 AND bit_count&=4 THEN31 adc_clk_r&=NOT bit_count(0); ELSE adc_clk_r&='0'; END IF; END PROCESS; PROCESS(clock) BEGIN IF RISING_EDGE(clock) THEN buf1&=adc_clk_r; buf2&=buf1; END IF; END PROCESS; PROCESS(clock)--读取数据 BEGIN IF RISING_EDGE(clock) THEN IF(buf1='1' AND buf2='0' )THEN--ADC 时钟上升沿 q&=q(6 DOWNTO 0) & sdat_in_r; ELSIF data_ready_r='1' data_out_r&=q; END IF; END IF; END PROCESS; END; THEN --输出读取的数据.(3) 将实验模块库里的 int_div.vhd 和 int_div.bsf 拷贝到工程目录下。 (4) 新建图形文件,命名为 tlc549adc.bdf 并保存。其原理图如下。图 TLC549 的采样控制顶层模块原理图(5) 将实验模块选择目标器件并对相应的引脚进行锁定,这里选择的器件为 Altera 公司 的 Cyclone II 系列的 EP2C5Q208C8,或者 Cyclone I 系列的 EP1C12Q240C8。引脚锁定方法32 如下表所列。表 引脚锁定方法 引脚 信号 EP2C5 Seg[0] Seg[1] Seg[2] Seg[3] Seg[4] Seg[5] Seg[6] Seg[7] 145 142 143 139 141 137 138 134 EP1C12 161 144 159 141 156 139 143 140 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 adc_clk cs_n sdat_in clock 引脚 信号 EP2C5 97 90 102 23 EP1C12 118 117 120 153 引脚(6) 将 tlc549adc.bdf 设置成顶层实体 Project―Set as Top-level Entity。对该工程文件进 行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。 (7) 下载程序到芯片上,调节电位器 RW1,用万用表测量电压挡测量模/数转换器信号 输入的电压。 观察数码管上显示的数值, 将数码管的数据转换计算后与万用表的读数做比较。33 实验1.用状态机实现对 TLC5620 的控制(D/A 实验)实验目的 熟悉串行数/模转换芯片 TLC5620 的使用方法,掌握利用有限状态机实现 DAC 的接口 程序。 2. 实验内容 本实验箱上有一个 4 通道 8 位的 D/A 转换器 TLC5620。本实验的内容是使用状态机产 生时序实现对 TLC5620 的控制,使 A、B、C、D 四个通道分别输出期望的电压值,用万用 表检测并与理论的电压值比较。利用 Quartus II 完成设计仿真等工作,最后在实验箱上进行 硬件测试。 为配合本实验操作,本实验提供一个接口测试模块 dac_test。该模块放在 lib 文件夹下。 该模块主要提供按键输入、数码显示等操作,使用说明如下:按下 KEY1,选择通道,在数 码管 LEDD4 上显示;按下 KEY2、KEY3 输入 8 位数/模数转换值,在数码管 LEDD4 上显 示;按下 KEY4 选择输出电压模式,是一倍输出还是两倍输出,在数码管 LEDD3 上显示(0 表示 1 倍;1 表示 2 倍) ;按 KEY5,将当前数据发送到 dac 模块并启动一次数/模转换。 3. 实验原理 TLC5620 是一个 4 通道 8 位的 D/A 转换器,时钟频率最大可达到 1MHz。TLC5620 传 输一帧数据为 11 位,高位先传送,格式如下表所示。D10、D9 位为通道选择位;其对应关 系如表所示。D8 为输出电压模式选择,若为“0”则输出电压范围为 0~VREF,若为“1”则 输出电压范围为 0~2VREF,其中 VREF 为参考电压,这里的参考电压为 2.5V;D7~D0 为数据 位。 表 TLC5620 的数据格式D10 D9 D8 输出模式 RNG D7 D6 D5 D4 D3 D2 D1 D0 8 位数据 D7~D0通道选择表 通道选择对应关系D10 0 0 1 1 D9 0 1 0 1 通道 DACA DACB DACC DACDTLC5620 的访问时序如图所示,其中 CLK 为 DAC 的时钟;DATA 为串行数据,锁存 于时钟的下降沿;LOAD 为数据锁存控制信号,当一帧数据传送完毕时,拉低 LOAD 信号 线,即把数据锁存起来;LDAC 为 DAC 输出更新控制信号,当 LDAC 为低电平时,即把锁 存在锁存器的数据送到 DAC 并转换输出。本实验时钟置 LDAC 为低电平,也就是说,加载 信号 LOAD 一但产生,数据即可转换输出。详细的时序控制、参数设置请参考数据手册。 TLC5620 的输出电压为CODE (1 + RNG ) 256 其中 V0 为采样值;DACA/B/C/D 代表 4 个不同的通道; VREF 为参考电压,CODE 为 8 位二 V ( DACA / B / C / D) = VREF进制数,范围为 0~255,数值为 0 或 1。34 图 TLC5620 访问时序图 4.实验步骤 (1) 启动 Quartus II 建立一个空白工程,然后命名为 tlc5620dac.qpf。 (2) 新建 VHDL 源程序文件 dac.vhd。进行综合编译。若在编译过程中发现错误,则找 出并更正错误。直至编译成功为止。 程序参考:IEEE.STD_LOGIC_1164.ALL; IEEE.STD_LOGIC_UNSIGNED.ALL; IEEE.STD_LOGIC_ARITH.ALL;LIBRARY IEEE; USE USE USEENTITY dac IS GENERIC( CLK_DIV: CLK_DIV_BITS: ); PORT( clock: rst: IN IN STD_LOGIC; Integer:=63; Integer:=6STD_LOGIC; STD_LOGIC_VECTOR(10 DOWNTO 0);--DAC 11 位数据输入. --//bit[10:9] 通道选择 00:CHA; 01:CHB; 10:CHC; 11:CHD. --//bit[8] RNG bit 输出电压(0:参考电压到地;1:两倍参考电压到地) --//bit[7:0] DAC 转换代码,范围 0~255. --//输出电压 Vo=REF*(CODE/256)*(1+RNG bit)wr_data: INwr_act:INSTD_LOGIC;--写控制.dac_clk: OUT STD_LOGIC;--DAC 时钟输出 dac_data: OUT STD_LOGIC;--DAC 数据输出 dac_load: OUT STD_LOGIC;--DAC 数据加载信号输出 dac_ldac: OUT STD_LOGIC--DAC 更新锁存信号输出. ); END; ARCHITECTURE one OF dac IS SIGNAL counter: SIGNAL dac_clk_r: SIGNAL dac_data_r: STD_LOGIC_VECTOR(CLK_DIV_BITS-1 DOWNTO 0); STD_LOGIC; STD_LOGIC;35 SIGNAL dac_load_r:STD_LOGIC;SIGNAL bit_counter: STD_LOGIC_VECTOR(4 DOWNTO 0);--DAC 数据输出位计数器. SIGNAL div_clk: STD_LOGIC;--分频时钟SIGNAL bit_counter_rst:STD_LOGIC;--位计数器复位信号. SIGNAL dac_dat_send_finish: STD_LOGIC;TYPE states IS (dac_idle,dac_send,dac_store);--状态机 SIGNAL dac_sta,dac_sta_next: BEGIN PROCESS(clock,rst) BEGIN IF RISING_EDGE(clock) IF rst='1' THEN counter&=&000000&; ELSE IF counter&CLK_DIV THEN counter&=counter + 1; div_clk&='0'; ELSE counter&=&000000&; div_clk&='1'; END IF; END IF; END IF; END PROCESS; --&&状态机 PROCESS(clock,rst) BEGIN IF RISING_EDGE(clock) IF rst='1' THEN dac_sta&=dac_ ELSE dac_sta&=dac_sta_ END IF; END IF; END PROCESS; PROCESS(dac_sta,wr_act,div_clk,dac_dat_send_finish)--状态描述 BEGIN dac_load_r&='1'; bit_counter_rst&='0'; dac_sta_next&=dac_ CASE dac_sta IS WHEN dac_idle=& bit_counter_rst&='1'; IF wr_act='1' THEN --空闲时复位发送位计数器. --有写数据信号时,进入发送状态. THEN THEN36 dac_sta_next&=dac_ ELSE dac_sta_next&=dac_ END IF; WHEN dac_send=&--位数据发送完成后进入数据锁存状态 IF dac_dat_send_finish ='1' THEN dac_sta_next&=dac_ ELSE dac_sta_next&=dac_ END IF; WHEN dac_store=& bit_counter_rst&='1';--发送位计数器复位. dac_load_r&='0';--Load 变低进行数据锁存. IF div_clk ='1' THEN dac_sta_next&=dac_ ELSE dac_sta_next&=dac_ END IF; END CASE; END PROCESS; PROCESS( clock) BEGIN IF rising_edge(clock) THENIF bit_counter_rst='1' THEN bit_counter&=&00000&; --发送位计数器清 0 ELSIF div_clk='1' THEN --发送位计数器累加bit_counter&=bit_counter + 1; END IF; END IF; END PROCESS; --当发送位计数器计数到 24 时,发送完毕. dac_dat_send_finish&='1' WHEN bit_counter=24 else '0'; PROCESS(bit_counter(4 DOWNTO 1),wr_data) BEGIN CASE bit_counter(4 DOWNTO 1) IS --发送计数器每 4:1 位变换换时,发送 1bit 数据.WHEN &0001&=& dac_data_r&=wr_data(10);--先高位. WHEN &0010&=& dac_data_r&=wr_data(9); WHEN &0011&=& dac_data_r&=wr_data(8); WHEN &0100&=& dac_data_r&=wr_data(7); WHEN &0101&=& dac_data_r&=wr_data(6); WHEN &0110&=& dac_data_r&=wr_data(5); WHEN &0111&=& dac_data_r&=wr_data(4); WHEN &1000&=& dac_data_r&=wr_data(3); WHEN &1001&=& dac_data_r&=wr_data(2);37 WHEN &1010&=& dac_data_r&=wr_data(1); WHEN &1011&=& dac_data_r&=wr_data(0); WHEN OTHERS=& END CASE; END PROCESS; PROCESS(bit_counter)--在发送位计数器 2-24 间产生 dac clk BEGIN IF (bit_counter& 24) AND (bit_counter&=2) THEN dac_clk_r&=NOT bit_counter(0); ELSE dac_clk_r&='0'; END IF; END PROCESS; dac_clk&=dac_clk_r; dac_data&=dac_data_r; dac_load&=dac_load_r; dac_ldac&='0'; END; dac_data_r&='1';(3) 建立波形仿真文件对 dac.vhd 进行仿真验证。验证仿真结果是否与设计相符合,如 果不符合, 则重新设计文件, 然后再进行综合编译、 仿真, 直到仿真结果与设计相符合为止。 (4) 将实验模块库里的 dac_test.bsf 和 dac_test.vhd 拷贝到工程目录下。 (5) 新建图形设计文件进行硬件测试,命名为 tlc5620.bdf 并保存。其模块原理图如图 所示。图 TLC5620 数模转换顶层测试模块原理图(6) 将实验模块选择目标器件并对相应的引脚进行锁定, 这里选择的器件为 Altera 公司 的 Cyclone II 系列的 EP2C5Q208C8,或者 Cyclone I 系列的 EP1C12Q240C8。引脚锁定方法 如下表所示。 表 引脚锁定方法引脚 信号 EP2C5 Seg[0] Seg[1] Seg[2] 145 142 143 EP1C12 Dig[1] Dig[2] Dig[3] 信号 EP2C5 127 133 117 EP1C12 Key[2] Key[3] Key[4] 引脚 信号 EP2C5 57 61 58 EP1C12 引脚38 Seg[3] Seg[4] Seg[5] Seg[6] Seg[7] Dig[0]139 141 137 138 134 135Dig[4] Dig[5] Dig[6] Dig[7] Key[0] Key[1]128 115 118 113 56 59dac_clk dac_load dac_data dac_ldac clock101 104 96 99 23(7) 将 tlc5620adc.bdf 设置为顶层实体,对该工程进行全编译处理,若在编译过程中发 现错误,则找出错误并更正错误,直至编译成功为止。 (8) 连接硬件,下载程序。通过 KEY1~KEY4 输入数据,按下 KEY5 启动 DAC 进行转 换,用万用表测电压挡测量数/模转换器输出电压值,重复多次,记录万用表的电压读数并 与输入的值做比较。39
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 15针串口引脚图 的文章

 

随机推荐