前言
一、模块接口
用户接口主要是将读到的数据进行输出,AD7606接口则是上篇介绍的一些主要控制接口
module AD7606_drive#(
parameter P_RANGE = 0
)(
input i_clk ,//50MHz 1 cycle = 20ns
input i_rst ,
/*------user interface------*/
input i_user_ctrl ,
output [3 :0] o_user_chnl ,
output [15:0] o_user_data_1 ,
output o_user_valid_1 ,
output [15:0] o_user_data_2 ,
output o_user_valid_2 ,
output [15:0] o_user_data_3 ,
output o_user_valid_3 ,
output [15:0] o_user_data_4 ,
output o_user_valid_4 ,
output [15:0] o_user_data_5 ,
output o_user_valid_5 ,
output [15:0] o_user_data_6 ,
output o_user_valid_6 ,
output [15:0] o_user_data_7 ,
output o_user_valid_7 ,
output [15:0] o_user_data_8 ,
output o_user_valid_8 ,
/*------AD7606 interface------*/
output o_ad_psb_sel ,
output o_ad_stby ,
output o_ad_range ,
output [2 :0] o_ad_osc ,
output o_ad_reset ,
output o_ad_convstA ,
output o_ad_convstB ,
output o_ad_cs ,
output o_ad_rd ,
input i_ad_busy ,
input i_ad_firstdata ,
input [15:0] i_ad_data
);
二、状态机转移
状态转移过程:
always @(*)begin
case(r_st_cur)
P_ST_RESET : r_st_nxt = r_st_cnt == 10 ? P_ST_CONVST : P_ST_RESET ;
P_ST_CONVST : r_st_nxt = ri_user_ctrl ? P_ST_BUSY : P_ST_CONVST ;
P_ST_BUSY : r_st_nxt = r_st_cnt >= 10 && !ri_ad_busy ? P_ST_READ : P_ST_BUSY ;
P_ST_READ : r_st_nxt = r_st_cnt == 16 - 1 ? P_ST_WAIT : P_ST_READ ;
P_ST_WAIT : r_st_nxt = r_st_cnt == 70 ? P_ST_RESET : P_ST_WAIT ;
default : r_st_nxt = P_ST_RESET;
endcase
end
P_ST_RESET :复位状态,需要满足至少50ns,所以状态计数器需要计数多少个周期需要看自己的设计当中时钟频率,我这里是50Mhz,状态计数器计数到10即200ns,符合时序。
P_ST_CONVST :转换状态,即控制CONVSTA/B信号产生上升沿。图中黄线部分
P_ST_BUSY :忙状态,等待一段时间后开始读忙信号,不忙则进入读数据状态
P_ST_READ :控制CS和RD信号开始读数据,读8个数据,在RD上升沿进行读数据
P_ST_WAIT :等待状态,俩次转换操作之间需要等待一个tCYCLE,AD7606在并行模式下需要5us,具体内容参考上一篇介绍。