FPGA与VHDL语言学习4
目录
1.《自动售货机控制器设计》,输入程序代码,对代码进行编译,试用Assignments→Assignment Editor进行I/O引脚锁定,重新编译
2.《信号发生器设计》,输入程序代码,对代码进行编译,试用Assignments→Assignment Editor进行I/O引脚锁定,重新编译
3.DDS正弦信号发生器(可以通过网络查找相关DDS的技术信息),参照图7-49,用图形方式连接电路
1.参考FPGA与VHDL语言实验指导书中 的实验五《自动售货机控制器设计》,输入程序代码,对代码进行编译,试用Assignments→Assignment Editor进行I/O引脚锁定,重新编译。这里因为没有硬件电路板支持,只是学习如何进行引脚锁定及软件与硬件的关系。对项目进行波形图仿真,把程序与引脚锁定图及仿真结果图通过作业系统上交,说明仿真结果正确的理由。
实验五、自动售货机控制器设计
0.原理:
对仿真图进行分析: rst为复位信号,clk为时钟输入信号,nickel_ in、 dime_ _in、
quarter_ in分别为5美分、10美分与25美分输入信号; candy_ ou为糖果发放输出信号,nickel. out与dime out分别为5美分与10美分找零信号,都为输出信号; p state代表当前投入的总金额。当rs输入为1时,所有的输出都为0,p_ state为st0状态;当rst与nickel in、quarter_ in信号都为时,dime_ in为1时,所有的输出都为0,但在下一-个脉冲上升沿作用下,当前状态由st0跳到st10;再在上述的基础上,投入25美分的硬币,即quarter _in信号为1,在下一-个脉冲上升沿作用下,当前状态由st10变为st35, 此时输出信号candy. out与dime _out都为1, 即自动售货机发放糖果并实现10美分找零。以此类推,即可实现自动售货控制器的全部功能。
1.在 QuartusⅡ中创建项目,并完成相关设备配置。
2.确定所有状态,并完成状态转移图。
3.新建 VHDL 文档,输入代码并编译通过。
该设计为单一种类25美分糖果自动售货控制器,它只能识别5美分、10美分与25美分硬币,不能识别其他种类的硬币。它具有金额积累功能,当累积金额达到或超过25美分,系统将实现自动发放糖果与找零功能,但不能处理当投入硬币的累积金额达到25美分后继续投入硬币的情况。
输入信号是nickel_ in (投入5美分),dime_ in (投入10美分)和quarter_ in (投入25美分)。另外两个必要的输入是clk(时钟)和rst (复位)。自动售货机相应的3个输出: cand_ out用于控制发放糖果,nickel out用于控制找回5美分的零钱, dime _out用于 控制找回10美分零钱。
给出了有限状态机的转移图。圆圈里的数代表顾客投进来的总钱数(接受5美分、10美分或25美分的硬币)。状态为空闲状态。从它开始,如果投入5美分硬币,将跳转到状态5;如果投入10美分硬币,则跳转到状态10;如果投入25美分硬币,则跳转到状态25。随着投币数量的增加,状态不断跳转,如果投入的币值达到25美分,就可以进入状态25,然后售货机会发放糖果,并跳转回状态0。如果投入的总币值超过了25美分,那么售货机要进入与找零相关的状态。例如,当投入的市值达到40美分时,需要先退出5美分硬币(进入状态35)然后再退出10美分,发放糖果并进入状态0。
4.新建波形文件,分别进行功能仿真与时序仿真。
功能仿真:为了实验准确性进行了多次仿真
下图,100ns-200ns投入5美分,200ns-300ns投入10美分,300ns-400ns投入5美分,400ns-500ns投入25美分,共投入45美分,糖果25美分,应找零20美分并输出糖果,即两个dime_out,验证成功。
下图,100ns-200ns投入5美分,200ns-300ns投入10美分,300ns-400ns投入25美分,共投入40美分,糖果25美分,应找零15美分并输出糖果,即1个dime_out和一个nickel_out,验证成功。
下图,100ns-200ns投入5美分,200ns-300ns投入5美分,300ns-400ns投入10美分,450ns-550ns投入10美分,共投入30美分,糖果25美分,应找零5美分并输出糖果,即一个nickel_out,验证成功。
下图,100ns-200ns投入5美分,200ns-300ns投入5美分,450ns-550ns投入5美分,600ns-700ns投入25美分,共投入40美分,糖果25美分,应找零15美分并输出糖果,即1个dime_out和一个nickel_out,验证成功。
时序仿真:
5.手动完成引脚分配,重新编译项目。
引脚分配:clk -> SW[17]; rst -> SW[16]; quarter_in -> SW[2]; dime_in -> SW[1]; nickel_in -> SW[0]; candy_out -> LEDR[5];
dime_out -> LEDR[1]; nickel_out -> LEDR[0]
- Netlist Viewers下无符号数比较器a的RTL结构
2.参考FPGA与VHDL语言实验指导书中 的实验八《信号发生器设计》,输入程序代码,对代码进行编译,试用Assignments→Assignment Editor进行I/O引脚锁定,重新编译。这里因为没有硬件电路板支持,只是学习如何进行引脚锁定及软件与硬件的关系。对项目进行波形图仿真,把程序与引脚锁定图及仿真结果图通过作业系统上交,说明仿真结果正确的理由。
实验八、信号发生器设计
转化为数字形式为“0101 1100”
1.在 QuartusⅡ中创建项目,并完成相关设备配置。
2.新建 VHDL 文档,输入代码并编译通过。
- 方法一:使用状态机实现
3.新建波形文件,分别进行功能仿真与时序仿真。
功能仿真:波形仿真与要求相同,都是“0101 1100”
时序仿真:波形仿真与要求相同,都是“0101 1100”
4.完成引脚分配,并重新编译通过。
引脚分配:clk 接内部 28MHz 时钟; 输出信号连到扩展 IO 头中的某一针,如 IO_A[0]。
Netlist Viewers下无符号数比较器a的RTL结构
- 方法二:直接实现
3.新建波形文件,分别进行功能仿真与时序仿真。
功能仿真:波形仿真与要求相同,都是“0101 1100”
时序仿真:波形仿真与要求相同,都是“0101 1100”
- Netlist Viewers下无符号数比较器a的RTL结构
3.参考PPT第七章第十节的DDS信号发生器原理,设计一个DDS正弦信号发生器(可以通过网络查找相关DDS的技术信息),参照图7-49,用图形方式连接电路。参照图7-50,对DDS正弦信号发生器进行仿真测试,把DDS正弦信号发生器设计图及仿真测试图通过作业系统上交,并说明仿真测试结果正确的理由。
DDS正弦信号发生器实验
直接数字频率合成器(Direct Digital Synthesizer) 是从相位概念出发直接合成所需波形的一种频率合成技术。DDS以较高的频率通过相位累加来产生给定频率的数字化波形。根据抽样理论,产生的最高频率不能超过1/2时钟频率(Nyquist速率)。
下图是根据DDS原理图做出的电路原理图的顶层设计,其中相位累加器的位宽为32。下图共有三个主要元件。
1)32为加法器ADD32.由LPM_ADD_SUB宏模块构成。设置了2阶流水线结构,使其在控制下由更高的运算速度和输入数据的稳定性。
2)32为寄存器DFF32。由LPM_FF宏模块担任。ADD32与DFF32构成一个32为累加器。其高10位A[31…32]作为波形数据ROM的地址。
3)正弦波形数据ROM。正弦波形数据ROM模块sin_rom的地址线和数据线尾款输出都是10位。
4)频率控制字输入B[17…10]
5)DAC驱动数据口DAC[9…0]
仿真波形:DAC的数据是MIF文件里预先储存好的。且频率符合
。这是频率控制字B[31…0]与由DAC[9…0]驱动的DAC的正弦信号频率的关系。BB是由B[17…10]构成,当BB增加时,也应变大,输出频率变大。因此BB越大,输出数据越快。BB=21时DAC的速度小于 BB=DE时DAC的速度。验证正确。
再次仿真,符合公式:
,且数据是MIF文件预存的,验证正确。
Netlist Viewers下DDS的RTL结构
-----频率控制公式
由于软件中无LPM_FF的模块,可以像上图直接键入器件再更改,也可以由VHDL语言生成。
程序如下:
testdff.vhd-------------DFF32
LIBRARY ieee, lpm;
USE ieee.std_logic_1164.ALL;
USE lpm.lpm_components.ALL;
ENTITY testdff IS
PORT (inputs : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
clk : IN STD_LOGIC;
outputs : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END testdff;
ARCHITECTURE dff8 OF testdff IS
BEGIN
U1 : lpm_ff
GENERIC MAP(lpm_width => 32)
PORT MAP(data => inputs,
clock => clk,q => outputs);
END;
TESTDFF的模块如下图所示: