⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad9851.vhd

📁 用VHDL语言编写的DDS正弦函数发生器
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY AD9851 IS
	PORT(SYS_CLK,MCU_CLK,FLAG,FM_EN:IN STD_LOGIC;
		 MPF:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
		 FM_DATA:IN STD_LOGIC_VECTOR(31 DOWNTO 0);
		 FM_CORT:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
		 DAT_IN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
		 DAT_OUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
		 REST,FQ_UD,W_CLK:OUT STD_LOGIC);
END;
ARCHITECTURE ONE OF AD9851 IS
	SIGNAL DATA_TEMP,DATA_RE:STD_LOGIC_VECTOR(39 DOWNTO 0);
	SIGNAL COTR:STD_LOGIC_VECTOR(2 DOWNTO 0);
	SIGNAL STAT:STD_LOGIC_VECTOR(3 DOWNTO 0);
	BEGIN
------------------------------------------------------------------------------------
	PROCESS(MCU_CLK,FM_CORT)--单片机发送数据,FPGA接收数据,FM控制
		BEGIN
		IF FM_EN='1' THEN --FM
			COTR<=FM_CORT;
			DATA_TEMP(39 DOWNTO 32)<="00000001";
			DATA_TEMP(31 DOWNTO 0)<=FM_DATA;
		ELSIF MCU_CLK'EVENT AND MCU_CLK='1' THEN
			IF MPF="01" THEN --PSK
				COTR<=DAT_IN(2 DOWNTO 0);
				IF FLAG='0' THEN
					DATA_TEMP(7 DOWNTO 0)<="00000001";
				ELSIF FLAG='1' THEN
					DATA_TEMP(7 DOWNTO 0)<="10000001";
				END IF;
			ELSIF MPF="10" THEN --FSK
				COTR<=DAT_IN(2 DOWNTO 0);
				IF FLAG='0' THEN--接收控制字
					DATA_TEMP<="0000000100000001011011000001011011000001";--1M
				ELSIF FLAG='1' THEN
					DATA_TEMP<="0000000100000000001001000110100010101100";--100K
				END IF;
			ELSIF MPF="11" THEN
				IF FLAG='0' THEN --接收控制字
					COTR<=DAT_IN(2 DOWNTO 0);
				ELSIF FLAG='1' THEN --接收频率、相位数据
					DATA_TEMP(39 DOWNTO 8)<=DATA_TEMP(31 DOWNTO 0);
					DATA_TEMP(7 DOWNTO 0)<=DAT_IN;
				END IF;
			END IF;
		END IF;
	END PROCESS;
------------------------------------------------------------------------------------
	PROCESS(SYS_CLK)
		BEGIN
------------------------------------------------------------------------------------
--COTR="000"系统复位处于空闲状态,  		COTR="001"系统发送数据初始化
--COTR="010"系统发送频率,相位数据,FSK, 	COTR="011"系统发送相位数据,PSK
--COTR="100"AD9851复位,            		COTR="101"
------------------------------------------------------------------------------------
		IF SYS_CLK'EVENT AND SYS_CLK='1' THEN
			IF COTR="001" THEN --当COTR="001"时,系统发送数据初始化
				STAT<="0000";
				W_CLK<='0';
				FQ_UD<='0';
			--写频率----------------------------------------------------------------
			ELSIF COTR="010" THEN --当COTR="010"时,系统发送频率,相位数据
				IF STAT="0000" THEN --0
					DAT_OUT<=DATA_TEMP(39 DOWNTO 32);--相位
					STAT<="0001";
				ELSIF STAT="0001" THEN--1
					W_CLK<='1';
					STAT<="0010";
				ELSIF STAT="0010" THEN--2
					DAT_OUT<=DATA_TEMP(31 DOWNTO 24);--频率1
					W_CLK<='0';
					STAT<="0011";
				ELSIF STAT="0011" THEN--3
					W_CLK<='1';
					STAT<="0100";
				ELSIF STAT="0100" THEN--4
					DAT_OUT<=DATA_TEMP(23 DOWNTO 16);--频率2
					W_CLK<='0';
					STAT<="0101";
				ELSIF STAT="0101" THEN--5
					W_CLK<='1';
					STAT<="0110";
				ELSIF STAT="0110" THEN--6
					DAT_OUT<=DATA_TEMP(15 DOWNTO 8);--频率3
					W_CLK<='0';
					STAT<="0111";
				ELSIF STAT="0111" THEN--7
					W_CLK<='1';
					STAT<="1000";
				ELSIF STAT="1000" THEN--8
					DAT_OUT<=DATA_TEMP(7 DOWNTO 0);--频率4
					W_CLK<='0';
					STAT<="1001";
				ELSIF STAT="1001" THEN--9
					W_CLK<='1';
					STAT<="1010";
				ELSIF STAT="1010" THEN--10
					W_CLK<='0';
					FQ_UD<='1';
					STAT<="1011";
				ELSIF STAT="1011" THEN--11
					FQ_UD<='0';
					STAT<="1111";			
				END IF;
			--PSK---------------------------------------------------------------
			ELSIF COTR="011" THEN --当COTR="011"时,系统发送相位数据
				IF STAT="0000" THEN
					DAT_OUT<=DATA_TEMP(7 DOWNTO 0);
					STAT<="0001";
				ELSIF STAT="0001" THEN
					W_CLK<='1';
					STAT<="0010";
				ELSIF STAT="0010" THEN
					W_CLK<='0';
					FQ_UD<='1';
					STAT<="0011";
				ELSIF STAT="0011" THEN
					FQ_UD<='0';
					STAT<="1111";
				END IF;
			--AD9851复位---------------------------------------------------------
			ELSIF COTR="100" THEN --当COTR为"100"时,AD9851复位
				IF STAT="0000" THEN
					REST <= '1';
					STAT<="0001";
				ELSIF STAT="0001" THEN
					REST <= '1';
					STAT<="0010";
				ELSIF STAT="0010" THEN
					REST <= '0';
					W_CLK <= '0';
					FQ_UD <= '0';
					STAT<="1101";
				END IF;
			END IF;
		END IF;
	END PROCESS;
	------------------------------------------------------------------
END;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -