名称:基于FPGA的AD7705输入设计VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
AD7705输入,(4000-输入)/7(仿真输出=学号后3位),8位∪ART发送输出。
每位交一个pdf文档,联系应用井至少比较一种不同方案进行方案分析。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
AD7705模块仿真
--042=(4000-x)/7
--x=3706
--==0000111001111010
数据拆分模块仿真
分频模块
UART发送模块
部分代码展示:
-042=(4000-x)/7 --x=3706 --==0000111001111010 LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; USE ieee.std_logic_arith.all; --AD7705驱动 ENTITY AD7705_driver IS PORT ( clk_in : IN STD_LOGIC; reset_n : IN STD_LOGIC;--系统复位信号,低有效 AD_data_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);--输出AD数据 AD_DRDY_n : IN STD_LOGIC;--AD7705 AD_dout : IN STD_LOGIC;--AD7705 AD_CS : OUT STD_LOGIC;--AD7705 AD_clk : OUT STD_LOGIC;--AD7705 AD_din : OUT STD_LOGIC--AD7705 ); END AD7705_driver; ARCHITECTURE behave OF AD7705_driver IS type state_type is( s_reset ,--FFFF s_communicate_clkreg ,--8'h20 s_clk_reg ,--8'h03 s_communicate_setreg ,--8'h10 s_set_reg ,--8'h40 s_communicate_datareg ,--8'h38,读通道1 s_read_data ,--读数16bit s_wait_DRDY --等待DRDY==0 ); SIGNAL state :state_type:=s_reset; --定义寄存器 SIGNAL communicate_clkreg : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00100000"; SIGNAL clk_reg : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000011"; SIGNAL communicate_setreg : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00010000"; SIGNAL set_reg : STD_LOGIC_VECTOR(7 DOWNTO 0) := "01000000"; SIGNAL communicate_datareg : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00111000"; SIGNAL cycle_cnt : integer := 0; SIGNAL AD_clk_reg : STD_LOGIC := '0'; SIGNAL AD_clk_reg_cnt : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"; SIGNAL clk_en : STD_LOGIC := '0'; SIGNAL AD_din_reg : STD_LOGIC := '0'; SIGNAL AD_clk_reg_buf : STD_LOGIC := '0'; SIGNAL AD_clk_reg_down : STD_LOGIC; SIGNAL AD_clk_reg_rise : STD_LOGIC; SIGNAL AD_data : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000"; SIGNAL result : INTEGER := 0; --计算结果 BEGIN AD_CS <= '0';--CS保持低电平 --AD_clk最大5M,上升沿读写 PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (reset_n = '0') THEN AD_clk_reg_cnt <= "00000000"; ELSIF (AD_clk_reg_cnt = "00001001") THEN--使用5M时钟,50/5=10; AD_clk_reg_cnt <= "00000000"; ELSE AD_clk_reg_cnt <= AD_clk_reg_cnt + "00000001"; END IF; END IF; END PROCESS; --50M分频为5MHz PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (AD_clk_reg_cnt >= "00000101") THEN AD_clk_reg <= '1'; ELSE AD_clk_reg <= '0'; END IF; END IF; END PROCESS; AD_clk <= AD_clk_reg AND clk_en;--5M AD_din <= AD_din_reg AND clk_en; PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN AD_clk_reg_buf <= AD_clk_reg; END IF; END PROCESS; AD_clk_reg_down <= NOT(AD_clk_reg) AND AD_clk_reg_buf;--AD_clk_reg的下降沿 AD_clk_reg_rise <= AD_clk_reg AND NOT(AD_clk_reg_buf);--AD_clk_reg的上升沿 --初始化及读取AD值状态机 PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (reset_n = '0') THEN state <= s_reset; cycle_cnt <= 0; clk_en <= '0'; communicate_clkreg <= "00100000"; clk_reg <= "00000011"; communicate_setreg <= "00010000"; set_reg <= "01000000"; communicate_datareg <= "00111000
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=767
阅读全文
388