📄 ad9851.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 + -