EDA技术及应用实验报告(完整版纯手打)_第1页
EDA技术及应用实验报告(完整版纯手打)_第2页
EDA技术及应用实验报告(完整版纯手打)_第3页
EDA技术及应用实验报告(完整版纯手打)_第4页
EDA技术及应用实验报告(完整版纯手打)_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EDA 技术及应用 实验报告 系 部 指导教师 学 号 姓 名 实验一实验一 点亮点亮 LED 设计设计 一 实验目的一 实验目的 通过此实验让用户逐步了解 熟悉和掌握 FPGA 开发软件 QuartusII 的使用 方法及 Verilog HDL 的编程方法 本实验力求以详细的步骤和讲解让读者以最快的方式了解 EDA 技术开发以 及软件的使用 从而快速入门并激起读者对 EDA 技术的兴趣 二 实验内容二 实验内容 SmartSOPC 实验箱上有 8 个发光二极管 LED1 8 并分别与 FPGA 的 50 53 55 176 和 47 49 引脚相连 本实验的内容是建立可用于控制 LED 亮 灭 的简单硬件电路 要求点亮 SmartSOPC 实验箱上的 4 个发光二极管 LED1 LED3 LED5 和 LED7 三 实验原理三 实验原理 FPGA 器件同单片机一样 为用户提供了许多灵活独立的输入 输出 I O 口 单元 FPGA 每个 I O 口可以配置为输入 输出 双向 I O 集电极开路和三 态门等各种组态 作为输出口时 FPGA 的 I O 口可以吸收最大为 24mA 的电流 可以直接驱动发光二极管 LED 等器件 所以只要正确分配并锁定引脚后 在相 应的引脚上输出低电平 0 就可以实现点亮该发光二级管的功能 四 实验步骤四 实验步骤 1 启动 Quarters II 建立一个空白工程 命名为 led test qpf 然后分别建立图形 设计文件 命名为 led test bdf 以及文本编辑文件 led1 v 将他们都添加进工程 中 2 对工程进行设计 在 led1 v 中输入程序代码 并保存 进行综合编译 若在 编译中发现错误 则找出并更正错误 直至编译成功为止 从设计文件中创建模 块 由 led1 v 生成名为 led1 bsf 的模块符号文件 在 led test bdf 中任意空白处双 击鼠标左键 将 symbol 对话框中 libraries project 下的 led1 模块添加到图形文件 led test bdf 中 加入输入 输出引脚 双击各管脚符号 进行管脚命名 完整的 顶层模块原理图如下图所示 选择目标器件并进行引脚锁定 将未使用的管脚设 置为三态输入 led 7 0 OUTPUT led 7 0 led1 inst 3 设置编译选项并编译硬件系统 将 led test bdf 设置为顶层实体 对该工程文 件进行全程编译处理 若在编译过程中发现错误 则找出并更正错误 直到编译 成功为止 4 下载硬件设计到目标 FPGA 将产生的 led test sof 输出对 FPGA 进行配置 5 观察 LED 的状态 五 实验程序五 实验程序 利用连续赋值 assign 语句实现 module led1 led 模块名 led1 output 7 0 led 定义输出端口 assign led 8 b10101010 输出 0 xAA endmodule 利用过程赋值语句实现 暂时已屏蔽 module led1 led 模块名 led1 output 7 0 led 定义输出端口 reg 7 0 led 定义寄存器 always 过程 1 无敏感变量 begin led 8 b10101010 输出 0 xAA end endmudule 六 思考题六 思考题 写出使用 QuartusII 软件开发工程的完整的流程 实验二流水灯实验实验二流水灯实验 一 实验目的一 实验目的 通过此实验让用户进一步了解 熟悉和掌握 CPLD FPGA 开发软件的使用方 法及 Verilog HDL 的编程方法 学习简单时序电路的设计和硬件测试 二 实验内容二 实验内容 本实验的内容是建立可用于控制 LED 流水灯的简单硬件电路 要求在 SmartSOPC 实验箱上实现 LED1 LED8 发光二极管流水灯显示 三 实验原理三 实验原理 1 在 LED1 LED8 引脚上周期性的输出流水数据 如原来输出的数据是 11111100 则表示点亮 LED1 LED2 流水一次后 输出的数据应该为 11111000 而此时则应点亮 LED1 LED3 三个 LED 发光二极管 就可以实现 LED 流水灯 为了观察方便 流水速率最好在 2Hz 左右 在 QuickSOPC 核心板上有 一个 48MHz 的标准时钟源 该时钟脉冲 Clock 与芯片的 28 管脚相连 为了产生 2Hz 的时钟脉冲 在此调用了一个分频模块 int div 模块 位于光盘中 EDA Component 目录下 通过修改分频系数来改变输出频 当分频系数为 24x10 6 时 输出即为 2Hz 的频率信号 2 Int div 分频模块说明 int div 模块是一个占空比为 50 的任意整数分频器 输入时钟为 clock 输出时钟为 clk out 其中 F DIV 为分频系数 分频系数范围 为 1 2 n n F DIV WIDTH 若要改变分频系数 改变参数 F DIV 和 F DIV WIDTH 到相应范围即可 在本例中输入时钟为 48MHz 要得到 2Hz 的 信号 所以分频系数为 48x10 6 2 24x10 6 对于分频系数为 24x10 6 的数需要 一个 25 位宽的计数器即可 四 实验步骤四 实验步骤 1 启动 Quarters II 建立一个空白工程 命名为 led water qpf 2 新建 Verilog HDL 源程序文件 ledwater v 输入程序代码并保存 进行综合编 译 若在编译中发现错误 则找出并更正错误 直至编译成功为止 3 从设计文件中创建模块 由 ledwater v 生成名为 ledwater bsf 的模块符号文件 4 将光盘中 EDA Component 目录下的 int div bsf 和 int div v 拷贝到工程目录 5 新建图形设计文件命名为 led water bdf 并保存 在空白处双击鼠标左键 分 别将 symbol 对话框中 libraries project 下的 ledwater 和 int div 模块放在图形文 件 led water bdf 中 加入输入 输出引脚 双击各管脚符号 进行管脚命名 双 击 int div 的参数框 并修改参数 将 F DIV 的值改为 24000000 F DIV WIDTH 的值改为 25 完整的顶层模块原理图如下图所示 VCC clock INPUT led 7 0 OUTPUT clk led 7 0 ledwater inst1 F DIV24000000 F DIV WIDTH 25 ParameterValue clockclk out int div inst 6 选择目标器件并进行引脚锁定 将未使用的管脚设置为三态输入 7 将 led water bdf 设置为顶层实体 对该工程文件进行全程编译处理 若在编 译过程中发现错误 则找出并更正错误 直到编译成功为止 8 将产生的 led water sof 输出对 FPGA 进行配置 9 更改分频模块 int div 的分频系数 并重新编译下载 观察流水灯的变化 五 实验程序五 实验程序 module ledwater led clk 模块名 ledwater output 7 0 led 定义 LED 输出口 input clk 定义时钟输入口 reg 8 0 led r 定义输出寄存器 assign led led r 7 0 寄存器输出 always posedge clk 在时钟上升沿触发进程 begin led r led r 1 是 则输出左移一位 if led r 9 d0 循环完毕吗 led r 9 b111111111 是 则重新赋初值 end endmodule 六 思考题六 思考题 本实验顶层采用了图形输入的方式 若采用文本输入方式 如何编写 顶层文件 写出相应程序 实验三实验三 键盘 键盘 LED 发光实验发光实验 一 实验目的一 实验目的 通过此实验让用户进一步了解 熟悉和掌握 CPLD FPGA 开发软件的使用方 法及 Verilog HDL 的编程方法 熟悉以 Verilog HDL 文件为顶层模块的设计 学 习和体会分支条件语句 case 的使用方法及 FPGA I O 口的输出控制 二 实验内容二 实验内容 SmartSOPC 实验箱上有 8 个发光二极管 LED1 8 和 8 个按键 KEY1 KEY8 本实验的内容要求在 SmartSOPC 实验箱上完成对 8 个按键 KEY1 KEY8 进行监 控 一旦有按键输入判断其键值 并点亮相应的发光二极管 如若 KEY3 按下 则点亮 LED1 LED3 发光二极管 三 实验原理三 实验原理 FPGA 的所有 I O 控制块允许每个 I O 口引脚单独配置为输出口 不过这种 配置是系统自动完成的 一旦该 I O 口被设置为输入口使用时 如定义 key0 为 输入引脚 input key0 该 I O 控制模块将直接使三态缓冲区的控制端接地 使 得该 I O 口引脚对外呈高阻态 这样该 I O 口引脚即可用作专用输入引脚 只要 正确分配并锁定引脚后 一旦在 KEY1 KEY8 中有按键输入 在检测到键盘输入 的情况下 继续判断其键值并做出相应的处理 四 实验步骤四 实验步骤 1 启动 Quarters II 建立一个空白工程 命名为 keyled qpf 2 新建 Verilog HDL 源程序文件 keyled v 输入程序代码并保存 进行综合编译 若在编译中发现错误 则找出并更正错误 直至编译成功为止 3 选择目标器件并进行引脚锁定 将未使用的管脚设置为三态输入 4 对该工程文件进行全程编译处理 若在编译过程中发现错误 则找出并更正 错误 直到编译成功为止 5 将产生的 keyled sof 输出对 FPGA 进行配置 按下不同按键观察 LED 发光管 的状态 五 实验程序五 实验程序 module keyled key led 模块名 keyled input 7 0 key 定义键盘输入口 output 7 0 led 定义发光管输出口 reg 7 0 led r 定义寄存器 reg 7 0 buffer r assign led led r 输出键值 always key 过程 1 begin buffer r key 读取键值 case buffer r 8 b11111110 led r 8 b11111110 是键 KEY1 则给寄存器赋值 0 xfe 8 b11111101 led r 8 b11111100 是键 KEY2 则给寄存器赋值 0 xfc 8 b11111011 led r 8 b11111000 是键 KEY3 则给寄存器赋值 0 xf8 8 b11110111 led r 8 b11110000 是键 KEY4 则给寄存器赋值 0 xf0 8 b11101111 led r 8 b11100000 是键 KEY5 则给寄存器赋值 0 xe0 8 b11011111 led r 8 b11000000 是键 KEY6 则给寄存器赋值 0 xc0 8 b10111111 led r 8 b10000000 是键 KEY7 则给寄存器赋值 0 x80 8 b01111111 led r 8 b00000000 是键 KEY8 则给寄存器赋值 0 x00 default led r 8 b11111111 否则给寄存器赋值 0 xff endcase end endmodule 六 思考题六 思考题 能否用 if 语句改写本实验程序 如果能 写出相应程序 实验四实验四 静态数码管显示实验静态数码管显示实验 一 实验目的一 实验目的 学习 7 段数码管显示译码器的设计 进一步了解 熟悉和掌握 FPGA 开发软 件 Quartus II 的使用方法及 Verilog HDL 的编程方法 学习 LPM 兆功能模块的调 用 二 实验内容二 实验内容 SmartSOPC 实验箱上有 2 个 4 位动态共阳极数码管 LED12 和 LED13 其中 8 个位码 DIG0 DIG7 和 8 位段码 SEG0 SEG7 分别与 FPGA 相应的引脚相连 这 样 只要 DIG0 DIG7 上一直输出低电平 0 则 8 个数码管将显示相同的数码 因为 8 个 LED 数码管的段码线分别接到了同一引脚上 这样 8 位动态的 LED 数码管就变成了静态的 LED 本实验的内容是建立 7 段译码显示模块 用于控制 LED 数码管的静态显示 要求在 SmartSOPC 实验箱上的数码管依次显示 0 9 和 A F16 个字符 三 实验原理三 实验原理 数码管 LED 显示是工程项目中使用较广的一种输出显示器件 常见的数码 管有共阴和共阳 2 种 共阴数码管是将 8 个发光二极管的阴极连接在一起作为公 共端 而共阳数码管是将 8 个发光二极管的阳极连接在一起作为公共端 公共端 常被称作位码 而将其他的 8 位称作段码 数码管有 8 个段分别为 h g f e d c b 和 a h 为小数点 只要公共端为高电平 1 某个段输出 低电平 0 则相应的段就亮 本实验通过分频模块 int div 分频得到 1Hz 的频率信号 加载于 4 位计数器 的时钟输入端 计数循环输出 0 9 A F16 个数 最后通过七段译码模块译码后 在数码管上显示出来 四 实验步骤四 实验步骤 1 启动 Quarters II 建立一个空白工程 命名为 sled qpf 2 新建 Verilog HDL 源程序文件 decl7s v 输入程序代码并保存 进行综合编译 若在编译中发现错误 则找出并更正错误 直至编译成功为止 3 从设计文件中创建模块 由 decl7s v 生成名为 decl7s bsf 的模块符号文件 4 将光盘中 EDA Component 目录下的 int div bsf 和 int div v 拷贝到工程目录 5 添加 4 位计数器兆功能模块 6 新建图形设计文件命名为 sled bdf 并保存 在空白处双击鼠标左键 分别将 symbol 对话框中 libraries project 下的 counter decl7s 和 int div 模块放在图形文 件 sled bdf 中 在 symbol 对话框中 Name 输入 gnd 添加 gnd 符号 加入输入 输出引脚 双击各管脚符号 进行管脚命名 双击 int div 的参数框 并修改参 数 将 F DIV 的值改为 48000000 F DIV WIDTH 的值改为 26 完整的顶层模 块原理图如下图所示 VCC clock INPUT seg 7 0 OUTPUT dig 7 0 OUTPUT up counter clock q 3 0 counter inst d 3 0 seg 7 0 decl7s inst1 GND F DIV48000000 F DIV WIDTH 26 ParameterValue clockclk out int div inst2 位 位 位 位 位 位 位 位 位 位 位 位 位 位 7 选择目标器件并进行引脚锁定 将未使用的管脚设置为三态输入 8 将 sled bdf 设置为顶层实体 对该工程文件进行全程编译处理 若在编译过程 中发现错误 则找出并更正错误 直到编译成功为止 9 将产生的 sled sof 输出对 FPGA 进行配置 观察 LED 显示状态 五 实验程序五 实验程序 module decl7s d seg 模块名 decl7s input 3 0 d 输入 4 位二进制码 output 7 0 seg 七段译码输出 reg 7 0 seg r 定义数码管输出寄存器 assign seg seg r 输出数码管译码结果 always d begin case d 七段译码 4 h0 seg r 8 hc0 显示 0 4 h1 seg r 8 hf9 显示 1 4 h2 seg r 8 ha4 显示 2 4 h3 seg r 8 hb0 显示 3 4 h4 seg r 8 h99 显示 4 4 h5 seg r 8 h92 显示 5 4 h6 seg r 8 h82 显示 6 4 h7 seg r 8 hf8 显示 7 4 h8 seg r 8 h80 显示 8 4 h9 seg r 8 h90 显示 9 4 ha seg r 8 h88 显示 a 4 hb seg r 8 h83 显示 b 4 hc seg r 8 hc6 显示 c 4 hd seg r 8 ha1 显示 d 4 he seg r 8 h86 显示 e 4 hf seg r 8 h8e 显示 f endcase end endmodule 六 思考题六 思考题 1 本实验采用的是共阳极数码管 若采用共阴极数码管 有什么不同 2 如何显示 HHHHHHHH 和 PPPPPPPP 实验五实验五 动态数码管显示实验动态数码管显示实验 一 实验目的一 实验目的 学习动态扫描显示的原理及电路的设计 二 实验内容二 实验内容 本实验的内容是建立数码管动态扫描显示模块 具体内容如下 1 在 SmartSOPC 实验箱上完成 LED 数码管的动态显示 1 8 8 个数字 2 放慢扫描速度演示动态显示的原理过程 三 实验原理三 实验原理 一个 FPGA 的片子如果带动多个 比如说 8 个 数码管 选用静态显示的话 管脚很容易不够用 于是大多采用动态显示的方式 本次采用共阳极的数码管 其中每个数码管的 8 个段 h g f e d c b 和 a h 为小数点 都分别连接 到 SEG0 SEG7 8 个数码管分别由 8 个选通信号 DIG0 DIG7 来选择 被选通的 数码管显示数据 其余关闭 如果在某一时刻 DIG2 为低电平 0 其余选通信 号为高电平 1 这时仅 DIG2 对应的数码管显示来自段码信号端的数据 其余 7 个数码管呈现关闭状态 根据这种电路状态 如果希望 8 个数码管显示希望的 数据 就必须使得 8 个选通信号 DIG0 DIG7 分别被单独选通 并在此同时 在 段信号输入口加上希望在该对应数码管上显示的数据 于是随着选通信号的扫描 就能实现扫描显示的目的 虽然每次只有一个 LED 显示 但只要扫描显示速率 足够快 由于人的视觉余辉效应 使我们仍会感觉所有的数码管都在同时显示 四 实验步骤四 实验步骤 1 启动 Quarters II 建立一个空白工程 命名为 dled qpf 2 新建 Verilog HDL 源程序文件 scan led v 输入程序代码并保存 进行综合编 译 若在编译中发现错误 则找出并更正错误 直至编译成功为止 3 从设计文件中创建模块 由 scan led v 生成名为 scan led bsf 的模块符号文件 4 将光盘中 EDA Component 目录下的 int div bsf 和 int div v 拷贝到工程目录 5 添加常量兆功能模块 6 新建图形设计文件命名为 dled bdf 并保存 在空白处双击鼠标左键 分别将 symbol 对话框中 libraries project 下的 constant scan led 和 int div 模块放在图 形文件 dled bdf 中 加入输入 输出引脚 双击各管脚符号 进行管脚命名 双 击 int div 的参数框 并修改参数 将 F DIV 的值改为 48000 F DIV WIDTH 的值改为 16 完整的顶层模块原理图如下图所示 VCC clock INPUT dig 7 0 OUTPUT seg 7 0 OUTPUT 305419896 32 constant inst1 clk 1k d 31 0 dig 7 0 seg 7 0 scan led inst2 F DIV48000 F DIV WIDTH 16 ParameterValue clockclk out int div inst 7 选择目标器件并进行引脚锁定 将未使用的管脚设置为三态输入 8 将 dled bdf 设置为顶层实体 对该工程文件进行全程编译处理 若在编译过 程中发现错误 则找出并更正错误 直到编译成功为止 9 将产生的 sled sof 输出对 FPGA 进行配置 观察 LED 数码管上的数字是否为 12345678 然后把分频模块的参数改为 F DIV 24000000 F DIV WIDTH 25 再重新编译下载 观察这次 LED 数码管 上的显示数据 可以看到数据 12345678 动起来了 这正是动态扫描的方法和 过程 五 实验程序五 实验程序 module scan led clk 1k d dig seg 模块名 scan led input clk 1k 输入时钟 input 31 0 d 输入要显示的数据 output 7 0 dig 数码管选择输出引脚 output 7 0 seg 数码管段输出引脚 reg 7 0 seg r 定义数码管输出寄存器 reg 7 0 dig r 定义数码管选择输出寄存器 reg 3 0 disp dat 定义显示数据寄存器 reg 2 0 count 定义计数寄存器 assign dig dig r 输出数码管选择 assign seg seg r 输出数码管译码结果 always posedge clk 1k 定义上升沿触发进程 begin count count 1 b1 end always posedge clk 1k begin case count 选择扫描显示数据 3 d0 disp dat d 31 28 第一个数码管 3 d1 disp dat d 27 24 第二个数码管 3 d2 disp dat d 23 20 第三个数码管 3 d3 disp dat d 19 16 第四个数码管 3 d4 disp dat d 15 12 第五个数码管 3 d5 disp dat d 11 8 第六个数码管 3 d6 disp dat d 7 4 第七个数码管 3 d7 disp dat d 3 0 第八个数码管 endcase case count 选择数码管显示位 3 d0 dig r 8 b01111111 选择第一个数码管显示 3 d1 dig r 8 b10111111 选择第二个数码管显示 3 d2 dig r 8 b11011111 选择第三个数码管显示 3 d3 dig r 8 b11101111 选择第四个数码管显示 3 d4 dig r 8 b11110111 选择第五个数码管显示 3 d5 dig r 8 b11111011 选择第六个数码管显示 3 d6 dig r 8 b11111101 选择第七个数码管显示 3 d7 dig r 8 b11111110 选择第八个数码管显示 endcase end always disp dat begin case disp dat 七段译码 4 h0 seg r 8 hc0 显示 0 4 h1 seg r 8 hf9 显示 1 4 h2 seg r 8 ha4 显示 2 4 h3 seg r 8 hb0 显示 3 4 h4 seg r 8 h99 显示 4 4 h5 seg r 8 h92 显示 5 4 h6 seg r 8 h82 显示 6 4 h7 seg r 8 hf8 显示 7 4 h8 seg r 8 h80 显示 8 4 h9 seg r 8 h90 显示 9 4 ha seg r 8 h88 显示 a 4 hb seg r 8 h83 显示 b 4 hc seg r 8 hc6 显示 c 4 hd seg r 8 ha1 显示 d 4 he seg r 8 h86 显示 e 4 hf seg r 8 h8e 显示 f endcase end endmodule 六 思考题六 思考题 说出数码管动态显示的原理 实验六实验六 按键去抖动实验按键去抖动实验 一 实验目的一 实验目的 学习按键去抖动电路的硬件设计 二 实验内容二 实验内容 本实验的内容是建立按键消抖模块 通过 SmartSOPC 实验箱上的按键 KEY1 经过消抖 或 KEY2 没有消抖 控制数码管显示数字 对比有加消抖 和没有加消抖模块电路的区别 三 实验原理三 实验原理 作为机械开关的键盘 在按键操作时 由于机械触点的弹性及电压突跳等原 因 在触点闭合或开启的瞬间会出现电压抖动 实际应用中如果不进行处理将会 造成误触发 由于这里是低电平表示按键按下 所以按键去抖动的关键在于提取稳定的低 电平状态 虑除前沿 后沿抖动毛刺 对于一个按键信号 可以用一个脉冲对他 进行取样 如果连续三次取样为低电平 可以认为信号已经处于键稳定状态 这 时输出一个低电平按键信号 继续取样的过程中如果不能满足连续三次取样为低 则认为键稳定状态结束 这时输出变为高电平 一通道的消抖电路原理图如下 CLRN D PRN Q DFF inst CLRN D PRN Q DFF inst1 CLRN D PRN Q DFF inst2 VCC key in INPUT VCC clock INPUT key out OUTPUT OR3 inst3 四 实验步骤四 实验步骤 1 启动 Quarters II 建立一个空白工程 命名为 key debounce qpf 2 将上图所示消抖电路用 Verilog HDL 语言描述出来 并拓展多个通道 新建 Verilog HDL 源程序文件 debounce v 输入程序代码并保存 进行综合编译 若 在编译中发现错误 则找出并更正错误 直至编译成功为止 3 从设计文件中创建模块 由 debounce v 生成名为 debounce bsf 的模块符号文 件 4 将光盘中 EDA Component 目录下的 int div bsf 和 int div v 拷贝到工程目录 5 添加 4 位计数器兆功能模块 6 新建图形设计文件命名为 key debounce bdf 并保存 在空白处双击鼠标左键 分别将 symbol 对话框中 libraries project 下的 counter debounce decl7s 和 int div 模块放在图形文件 debounce bsf 中 在 symbol 对话框中 Name 输入 gnd 添加 gnd 符号 输入 and2 添加与门 加入输入 输出引脚 双击各管脚 符号 进行管脚命名 双击 int div 的参数框 并修改参数 将 F DIV 的值改为 240000 F DIV WIDTH 的值改为 18 完整的顶层模块原理图如下图所示 VCC clock INPUT VCC key1 INPUT VCC key2 INPUT seg 7 0 OUTPUT dig 7 0 OUTPUT F DIV240000 F DIV WIDTH 18 ParameterValue clockclk out int div inst KEY WIDTH 1 Parameter Value clk key in KEY WIDTH 1 0 key out KEY WIDTH 1 0 debounce inst1 AND2 inst2 up counter clock q 3 0 counter inst3 d 3 0 seg 7 0 decl7s inst4 GND 位 位 位 位 位 位 位 位 位 位 位 位 位 位 i位 位 位 位 位 位 位 位 7 选择目标器件并进行引脚锁定 将未使用的管脚设置为三态输入 8 将 key debounce bdf 设置为顶层实体 对该工程文件进行全程编译处理 若 在编译过程中发现错误 则找出并更正错误 直到编译成功为止 9 将产生的 key debounce sof 输出对 FPGA 进行配置 分别连续按 KEY1 或 KEY2 观察数码管显示状态 看数值是否连续递增 比较前后两次操作有何不同 五 实验程序五 实验程序 module debounce clk key in key out 按键消抖模块 input clk 系统时钟输入 input KEY WIDTH 1 0 key in 外部按键输入 output KEY WIDTH 1 0 key out 按键消抖输出 reg KEY WIDTH 1 0 dout1 dout2 dout3 寄存器 parameter KEY WIDTH 8 参数 assign key out dout1 dout2 dout3 按键消抖输出 always posedge clk begin dout1 key in dout2 dout1 dout3 dout2 end endmodule 六 思考题六 思考题 比较下面两段程序的异同 并画出电路结构图 always posedge clk begin dout1 key in 非阻塞赋值 dout2 dout1 dout3 dout2 end always posedge clk begin dout1 key in 阻塞赋值 dout2 dout1 dout3 dout2 end 实验七实验七 硬件电子琴实验硬件电子琴实验 一 实验目的一 实验目的 学习利用蜂鸣器和按键设计硬件电子琴 二 实验内容二 实验内容 在 SmartSOPC 实验箱上实现一个简易电子琴 按下 KEY1 KEY7 分别表示 中音 DO RE MI FA SOL LA SI 按住 KEY8 再按 KEY1 KEY7 分别表 示高音的 DO RE MI FA SOL LA SI 三 实验原理三 实验原理 乐曲演奏的原理是 由于组成乐曲的每个音符的频率值 音调 及其持续时 间 音长 是乐曲演奏的 2 个基本数据 因此需要控制输出到扬声器的激励信号 的频率高低和该频率信号持续的时间 频率的高低决定了音调的高低 而乐曲的 简谱与各音名的频率之间也有固定的对应关系 所有不同频率的信号都是从同一 基准频率分频而得来的 由于音阶频率多为非整数 而分频系数又不能为小数 故必须将计算的到的分频数进行四舍五入取整 基准频率和分频系数应综合考虑 加以选择 从而保证音乐不会走调 如在 48MHz 时钟下 中音 1 对应的频率 值为 523 3Hz 的分频系数应该为 48000000 2 523 3 0 xb327 这样只需对系 统时钟进行 45863 次分频即可得到所要的中音 1 至于其他音符 同样可求出对 应的分频系数 这样利用程序可以很轻松地得到对应的乐声 四 实验步骤四 实验步骤 1 在 Quarters II 中建立一个工程项目文件 beep1 qpf 并在该项目下新建 Verilog HDL 源程序文件 beep1 v 输入程序代码并保存 进行综合编译 若在编译中发 现错误 则找出并更正错误 直至编译成功为止 2 选择目标器件并进行引脚锁定 将未使用的管脚设置为三态输入 3 对该工程文件进行全程编译处理 若在编译过程中发现错误 则找出并更正 错误 直到编译成功为止 4 将产生的 beep1 sof 输出对 FPGA 进行配置 按下按键 KEY1 KEY8 就可以开 始使用电子琴来演奏音乐了 五 实验程序五 实验程序 module beep1 clk key beep led 模块名称 beep1 input clk 系统时钟 48MHz input 7 0 key 按键输入 output beep 蜂鸣器输出端 output 7 0 led LED 输出 reg beep r 寄存器 reg 15 0 count count end reg 7 0 key r always posedge clk begin count count 1 b1 计数器加 1 if count count end 计数器清零 beep r beep r 取反输出信号 end end always key begin key r key 取键值 case key r 8 b11111110 count end 16 hb327 中音 1 的分频系数值 8 b11111101 count end 16 h9fa0 中音 2 的分频系数值 8 b11111011 count end 16 h8e32 中音 3 的分频系数值 8 b11110111 count end 16 h8637 中音 4 的分频系数值 8 b11101111 count end 16 h7794 中音 5 的分频系数值 8 b11011111 count end 16 h6a88 中音 6 的分频系数值 8 b10111111 count end 16 h5ee8 中音 7 的分频系数值 8 b01111110 count end 16 h59ab 高音 1 的分频系数值 8 b01111101 count end 16 h4fce 高音 2 的分频系数值 8 b01111011 count end 16 h471a 高音 3 的分频系数值 8 b01110111 count end 16 h431c 高音 4 的分频系数值 8 b01101111 count end 16 h3bca 高音 5 的分频系数值 8 b01011111 count end 16 h3544 高音 6 的分频系数值 8 b00111111 count end 16 h2f74 高音 7 的分频系数值 default count end 16 hffff endcase end assign beep beep r 输出音乐 assign led key r 输出按键状态 endmodule 六 思考题六 思考题 举例说明产生不同音符的原理 实验八实验八 数字时钟设计数字时钟设计 一 实验目的一 实验目的 学习数字时钟的硬件设计 二 实验内容二 实验内容 在 SmartSOPC 实验箱上完成一个可以计时的数字时钟 其显示时间范围是 00 00 00 23 59 59 且该时钟具有暂停计时和清零等功能 三 实验原理三 实验原理 一个完整的时钟应由 3 部分组成 秒脉冲发生电路 计数显示部分和时钟调 整部分 一个时钟的准确与否主要取决于秒脉冲的精确度 为了保证时钟计时准 确我们对系统时钟 48MHz 进行了 48000000 分频 从而得到 1Hz 的秒脉冲 至于 显示部分与 LED 数码管原理相同 而校时电路用户可以自由发挥 如定义 3 个 按键 keystart keymon 和 keyadd 分别用于控制时钟的计时开始 调整功能选择 和加 1 处理 从而完成对现在时间的调整 本实验的校时电路在此仅仅完成了暂 停 清零等基本功能 四 实验步骤四 实验步骤 1 在 Quarters II 中建立一个工程项目文件 clock qpf 并在该项目下新建 Verilog HDL 源程序文件 clock v 输入程序代码并保存 进行综合编译 若在编译中发 现错误 则找出并更正错误 直至编译成功为止 2 选择目标器件并进行引脚锁定 将未使用的管脚设置为三态输入 3 对该工程文件进行全程编译处理 若在编译过程中发现错误 则找出并更正 错误 直到编译成功为止 4 将产生的 clock sof 输出对 FPGA 进行配置 观察数码管的显示状态 按下按 键 KEY1 KEY2 观察数字钟上的时间有什么变化 五 实验程序五 实验程序 module clock clk key dig seg 模块名 clock input clk 输入时钟 input 1 0 key 输入按键 output 7 0 dig 数码管选择输出引脚 output 7 0 seg 数码管段输出引脚 reg 7 0 seg r 定义数码管输出寄存器 reg 7 0 dig r 定义数码管选择输出寄存器 reg 3 0 disp dat 定义显示数据寄存器 reg 24 0 count 定义计数寄存器 reg 23 0 hour 定义现在时刻寄存器 reg sec keyen 定义标志位 reg 1 0 dout1 dout2 dout3 寄存器 wire 1 0 key done 按键消抖输出 assign dig dig r 输出数码管选择 assign seg seg r 输出数码管译码结果 秒信号产生部分 always posedge clk 定义 clock 上升沿触发 begin count count 1 b1 if count 25 d24000000 0 5S 到了吗 begin count 25 d0 计数器清零 sec sec 置位秒标志 end end 按键消抖处理部分 assign key done dout1 dou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论