问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于FPGA的状态机设计ADC0809采样控制电路VHDL代码Quartus仿真

创作时间:
作者:
@小白创作中心

基于FPGA的状态机设计ADC0809采样控制电路VHDL代码Quartus仿真

引用
CSDN
1.
https://blog.csdn.net/xiakunpei123/article/details/139076435

本文介绍了一种基于FPGA的状态机设计方法,用于控制ADC0809模数转换器的采样过程。通过VHDL语言实现状态机逻辑,并在Quartus平台上进行仿真验证。文章详细描述了ADC0809的工作原理和状态机设计流程,并提供了完整的VHDL代码示例。

ADC0809工作原理

ADC0809是一种8通道8位逐次逼近型模数转换器,其工作流程如下:

  1. 首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
  2. 此地址经译码选通8路模拟输入之一到比较器。
  3. START上升沿将逐次逼近寄存器复位。
  4. 下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。
  5. 直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
  6. 当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。

状态机设计

本设计采用状态机方法控制ADC0809的采样过程。状态机包含以下状态:

  • s_idle:空闲状态
  • s_start:启动转换状态
  • s_ADDR:输入地址状态
  • s_ALE:锁存地址状态
  • s_wait:等待转换完成状态
  • s_OE:使能三态门状态
  • s_DATA:读取AD值状态
  • s_END:结束状态

VHDL代码实现

以下是VHDL代码实现:

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY ADC0809 IS
 PORT (
 clk : IN STD_LOGIC;--时钟
 reset : IN STD_LOGIC;--复位
 ADDA : OUT STD_LOGIC;--地址
 ADDB : OUT STD_LOGIC;--地址
 ADDC : OUT STD_LOGIC;--地址
 ALE : OUT STD_LOGIC;--ALE
 START : OUT STD_LOGIC;--START
 OE : OUT STD_LOGIC;--OE
 EOC : IN STD_LOGIC;--EOC
 DB : IN STD_LOGIC_VECTOR(7 DOWNTO 0)--AD量化值
 );
END ADC0809;

ARCHITECTURE behave OF ADC0809 IS
type state_type IS (s_idle,s_start,s_ADDR,s_ALE,s_wait,s_OE,s_DATA,s_END);--状态
signal state:state_type;
 SIGNAL DATA : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000";
BEGIN
 --定义状态
 PROCESS (clk, reset)
 BEGIN
 IF (reset = '1') THEN
 state <= s_idle;--复位
 ELSIF (clk'EVENT AND clk = '1') THEN
 CASE state IS
 WHEN s_idle =>
 state <= s_ADDR;--输入地址
 WHEN s_ADDR =>
 state <= s_ALE;--锁存地址
 WHEN s_ALE =>
 state <= s_start;--开始转换
 WHEN s_start =>
 IF (EOC = '0') THEN
 state <= s_wait;--等待
 ELSE
 state <= s_start;
 END IF;
 WHEN s_wait =>--等待转换完成
 IF (EOC = '1') THEN--转换完成
 state <= s_OE;
 END IF;
 WHEN s_OE =>--使能三态门
 state <= s_DATA;
 WHEN s_DATA =>--读取AD值
 state <= s_END;
 WHEN s_END =>--结束
 state <= s_idle;
 WHEN OTHERS =>
 END CASE;
 END IF;
 END PROCESS;
 --输入地址
 PROCESS (clk, reset)
 BEGIN
 IF (reset = '1') THEN
 ADDA <= '0';
 ADDB <= '0';
 ADDC <= '0';
 ELSIF (clk'EVENT AND clk = '1') THEN
 IF (state = s_ADDR) THEN--输入地址状态,选择通道1
 ADDA <= '0';
 ADDB <= '0';
 ADDC <= '1';
 END IF;
 END IF;
 END PROCESS;
 --
 PROCESS (clk, reset)
 BEGIN
 IF (reset = '1') THEN
 ALE <= '0';--复位
 ELSIF (clk'EVENT AND clk = '1') THEN
 IF (state = s_ALE) THEN--锁存地址
 ALE <= '1';----锁存地址
 ELSE
 ALE <= '0';
 END IF;
 END IF;
 END PROCESS;

工程文件和仿真结果

以下是工程文件和仿真结果的截图:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号