名称:ADS8364及AD5758驱动设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
ADS8364及AD5758驱动设计
本设计的要求如下:ADS8364输入,(5400-输入)/9 (仿真时=学号后3位),AD5758输出。根据要求,使用FPGA为主控芯片,需要先控制ADS8364将模拟信号转换为数字信号,再在FPGA内进行数字信号处理,处理方式为(5400-输入)/9,得到计算结果后,再通过AD5758芯片将其转换为模拟信号输出。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
分频模块
ADS8364模块
AD5758模块
部分代码展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --?定义AD5758实体?? ENTITY?AD5758?IS?? ???PORT?(?? ??????clk_in????:?IN?STD_LOGIC;????????????--?输入时钟信号?? ??????rst_in????:?IN?STD_LOGIC;????????????--?输入复位信号?? ??????data_in??:?IN?STD_LOGIC_VECTOR(15?DOWNTO?0);??--?输入的16位数据?? ??????da_addr???:?OUT?STD_LOGIC_VECTOR(1?DOWNTO?0);??--?输出的2位地址信号?? ??????da_sync???:?OUT?STD_LOGIC;???????????--?输出的同步信号?? ??????da_sclk???:?OUT?STD_LOGIC;???????????--?输出的串行时钟信号?? ??????da_reset??:?OUT?STD_LOGIC;???????????--?输出的复位信号?? ??????da_ldac???:?OUT?STD_LOGIC;???????????--?输出的加载DAC信号?? ??????da_sdi????:?OUT?STD_LOGIC???????????--?输出的串行数据输入信号?? ???);?? END?AD5758;?? ?? --?定义behave架构?? ARCHITECTURE?behave?OF?AD5758?IS?? ???SIGNAL?AD5758_spi_data?:?STD_LOGIC_VECTOR(31?DOWNTO?0);??--?SPI数据信号,32位?? ???SIGNAL?send_data?:?STD_LOGIC_VECTOR(31?DOWNTO?0);????????--?发送数据信号,32位?? ???SIGNAL?crc?:?STD_LOGIC_VECTOR(7?DOWNTO?0);???????????????--?CRC校验值,8位?? ???SIGNAL?crc_value?:?STD_LOGIC_VECTOR(7?DOWNTO?0);?????????--?CRC期望值或计算值,8位?? ???SIGNAL?state_cnt?:?STD_LOGIC_VECTOR(1?DOWNTO?0);?????????--?状态计数器,2位?? ???SIGNAL?wait_time?:?INTEGER;?????????????????????????????--?等待时间计数器?? ???SIGNAL?work_window?:?INTEGER;???????????????????????????--?工作窗口计数器?? BEGIN?? ?? ???--?处理时钟和复位信号,更新状态计数器?? ???PROCESS?(clk_in,?rst_in)?? ???BEGIN?? ??????IF?((NOT(rst_in))?=?'1')?THEN??????????--?当复位信号 ?????????state_cnt?<=?"00";??????????????????--?初始化状态计数器为"00"?? ??????ELSIF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN??--?当检测到时钟上升沿时?? ?????????CASE?state_cnt?IS??????????????????--?根据状态计数器的值进行状态转换?? ????????????WHEN?"00"?=>?? ???????????????state_cnt?<=?"01";????????????--?状态从"00"转到"01"?? ????????????WHEN?"01"?=>?? ???????????????IF?(wait_time?>?40)?THEN??????--?如果等待时间大于40?? ??????????????????state_cnt?<=?"10";?????????--?状态转到"10"?? ???????????????ELSE?? ??????????????????state_cnt?<=?"01";?????????--?否则保持在"01"状态?? ???????????????END?IF;?? ????????????WHEN?"10"?=>?? ???????????????IF?(work_window?>?32)?THEN????--?如果工作窗口大于32?? ??????????????????state_cnt?<=?"11";?????????--?状态转到"11"?? ???????????????ELSE?? ??????????????????state_cnt?<=?"10";?????????--?否则保持在"10"状态?? ???????????????END?IF;?? ????????????WHEN?OTHERS?=>?null;?????????????--?对于其他情况,不执行任何操作?? ?????????END?CASE;?? ??????END?IF;?? ???END?PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1229
阅读全文