内容发布更新时间 : 2025/6/18 16:12:50星期一 下面是文章的全部内容请认真阅读。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADC0809 IS
PORT(D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --来自0809转换好的8位数据 CLK: IN STD_LOGIC; --状态机工作时钟 RST: IN STD_LOGIC; --系统复位控制
EOC: IN STD_LOGIC; --转换状态指示,低电平表示正在转换 ALE:OUT STD_LOGIC; --8个模拟信号通道地址锁存信号 START:OUT STD_LOGIC; --转换开始信号
OE:OUT STD_LOGIC; --数据输出三态控制信号 ADDA:OUT STD_LOGIC; --信号通道最低位控制信号 --LOCK_T:OUT STD_LOGIC; --观察数据锁存时钟
Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --8位数据输出 END ADC0809;
ARCHITECTURE behav OF ADC0809 IS
TYPE states IS(s0,s1,s2,s3,s4); --定义各状态子类型 SIGNAL cs,next_state: states:=s0;
SIGNAL REGL: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL LOCK: STD_LOGIC;--转换后数据输出锁存时钟信号
attribute keep : boolean;
attribute keep of LOCK : signal is true; BEGIN
ADDA<='0';--当ADDA<='0',选择模拟信号通道IN0;当ADDA<='1',则选择通道IN1 --LOCK_T<=LOCK;
COM: PROCESS(cs,EOC) BEGIN --规定各状态转换方式 CASE cs IS
WHEN s0=> ALE<='0';START<='0';OE<='0';LOCK<='0';next_state<=s1; --0809初始化 WHEN s1=> ALE<='1';START<='1';OE<='0';LOCK<='0';next_state<=s2 ;--启动采样 WHEN s2=> ALE<='0';START<='0';OE<='0';LOCK<='0';
IF(EOC='1') THEN next_state<=s3; --EOC=1表明转换结束 ELSE next_state<=s2; END IF; --转换未结束,继续等待
WHEN s3=> ALE<='0';START<='0';OE<='1';LOCK<='0';next_state<=s4;--开启OE,输出转换好的数据
WHEN s4=> ALE<='0';START<='0';OE<='1';LOCK