这个程序是在上一篇和AVR通讯 以及PWM控制的基础之上写的,这个程序是有问题的,具体问题在8364的EOC信号低电平时间只有不到1us,时间很短,而他的时钟信号不能超过5M,这个eoc信号触发外部中断来读取数据没有问题,但是在这个程序的第二第三个状态机中病没有检测到这个信号,所以出现的状况就是一直卡在第二个状态机。
另外由于每个状态机可能有不同的延迟,通过仿真发现毛刺现象比较突出,现在正在写改进的程序,这个程序仅作参考。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity kbctest is
port(
rst,clk : in std_logic; --时钟和复位信号
--avr 读写相关信号线
ale,rd,wr : in std_logic; --地址锁存、读、写信号
ad : inout std_logic_vector(7 downto 0); --地址数据信号线
--指示灯
led1,led2 : out std_logic;
--pwm
pwm1,pwm2 : out std_logic;
--ad8364信号线
adc_d: in std_logic_vector(15 downto 0);
adc_a: out std_logic_vector(2 downto 0); --a2,a1,a0
adc_reset: out std_logic;
adc_cs: out std_logic;
adc_wr: out std_logic;
adc_rd: out std_logic;
adc_hold: out std_logic_vector(2 downto 0); --只用两路ad 开启一路hold信号
adc_eoc: in std_logic;
adcclk_out: out std_logic;
statepoint: out std_logic_vector(3 downto 0)--用来指示处于第几个状态,方便调试
--放大增益控制
);
end kbctest;
architecture art of kbctest is
------------------------------------------------全局信号定义-------------------------------------------------------------------
--avr访问操作相关信号
signal adr : std_logic_vector(7 downto 0); --地址寄存器
signal data_buf : std_logic_vector(7 downto 0);
signal data_outctl : std_logic;
--pwm部分相关寄存器定义 寄存器暂时定义为8位
signal pwmfreq_reg : std_logic_vector(7 downto 0);
signal pwmocr1_reg : std_logic_vector(7 downto 0);
signal pwmocr2_reg : std_logic_vector(7 downto 0);
signal pwm_cnt : std_logic_vector(7 downto 0);
--时钟分频相关变量
signal clkcnt : std_logic_vector(16 downto 0);
signal adc_clk : std_logic; --adc时钟信号
s