名称:AD7321代码12位ADC,SPI接口模数转换连接DAC0832输出(代码在文末付费下载)
软件:QuartusII
语言:VHDL
代码功能:
使用VHDL语言编写代码,实现AD7321的控制,将模拟信号转换为数字信号,再经过处理后,将数据通过DAC0832转换为模拟信号输出。
AD7321输入,(2000-输入)/6(仿真输出=009),DAC0832输出。
要求:有vhdl代码(详尽注释),有fpga连线图,有完整功能仿真结果,有方案分析。
演示视频:
FPGA代码Verilog/VHDL代码资源下载网:www.hdlcode.com
部分代码展示
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --AD控制模块,输出011110011010 ENTITY?AD7321?IS ???PORT?( ??????clk?????:?IN?STD_LOGIC;--时钟 ??????rst?????:?IN?STD_LOGIC;--复位 ??????CS_n????:?OUT?STD_LOGIC;--AD控制信号 ??????SCLK????:?OUT?STD_LOGIC;--AD控制信号 ??????DOUT????:?IN?STD_LOGIC;--AD控制信号 ??????DIN?????:?OUT?STD_LOGIC;--AD控制信号 ??????DB??????:?OUT?STD_LOGIC_VECTOR(11?DOWNTO?0)--输出AD值 ???); END?AD7321; ARCHITECTURE?behaval?OF?AD7321?IS ???TYPE?State_type?IS?(s_init,?s_cs_h,?s_sclk,?s_end);??--?定义状态 ???SIGNAL?state?:?State_type; ???SIGNAL?cs_h_cnt?:?STD_LOGIC_VECTOR(3?DOWNTO?0)?:=?"0000";--CS计数 ???SIGNAL?sclk_cnt?:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000";--sclk计数 BEGIN --状态机控制 ???PROCESS?(clk,?rst) ???BEGIN ??????IF?(rst?=?'1')?THEN--复位 ?????????state?<=?s_init; ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN--时钟上升沿 ?????????CASE?state?IS ????????????WHEN?s_init?=>--初始状态 ???????????????state?<=?s_cs_h; ????????????WHEN?s_cs_h?=>--cS高电平状态 ???????????????IF?(cs_h_cnt?>=?"1010")?THEN--计数10个时钟 ??????????????????state?<=?s_sclk; ???????????????END?IF; ????????????WHEN?s_sclk?=>--SCLK状态 ???????????????IF?(sclk_cnt?>=?"00100000")?THEN--计数32时钟 ??????????????????state?<=?s_end;--结束 ???????????????END?IF; ????????????WHEN?s_end?=>--结束状态 ???????????????state?<=?s_init; ????????????WHEN?OTHERS?=> ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ???--根据状态控制CS信号 ???PROCESS?(clk,?rst) ???BEGIN ??????IF?(rst?=?'1')?THEN ?????????CS_n?<=?'1';--复位 ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN--时钟上升沿 ?????????IF?(state?=?s_cs_h)?THEN--CS高电平状态 ????????????CS_n?<=?'1';--输出高电平 ?????????ELSIF?(state?=?s_sclk)?THEN--SCLK状态 ????????????CS_n?<=?'0';--输出低电平 ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???--根据状态控制SCLK信号 ???PROCESS?(clk,?rst) ???BEGIN ??????IF?(rst?=?'1')?THEN ?????????SCLK?<=?'1';--复位 ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN--时钟上升沿 ?????????IF?(state?=?s_sclk)?THEN--SCLK状态 ????????????SCLK?<=?NOT(sclk_cnt(0));--SCLK输出sclk_cnt(0)取反信号作为SCLK ?????????ELSIF?(state?=?s_end)?THEN ????????????SCLK?<=?'1'; ?????????END?IF; ??????END?IF; ???END?PROCESS;
设计文档:
1. 工程文件

2. 程序文件

连线图

3. 程序编译

4. RTL图

5. 仿真图



阅读全文
1137