FPGA之ADS8344驱动程序*
前言
在学习完小梅老师的《线性序列机与TLV1544驱动设计》后,本人受到小梅老师“用线性序列机”设计AD/DA驱动程序的启发后开始渴望掌握这种方法,于是开始拿“ADS8344”练手。
ADS8344简介
ADS8344是采用20引脚QSDP封装或SSOP封装的芯片,是一个高速、低功耗、16位逐次逼近型ADC。(咱就做个简单的简介,更详细内容可以去参考ASD8344的数据手册)
模块代码分析
端口定义代码
module ADS8344(
Clk,
Rst_n,
Do_Conv, //开始转换使能信号
ADS_CHSEL, //模拟通道选择、模拟输入方式选择和功率管理选择信号
ADS_DONE, //转换完成信号
ADS_DATA,
DATA_Valid, //数据有效信号,转换完成的有效数据给ADS_DATA
ADS8344_CS,
ADS8344_DCLK,
ADS8344_DIN,
ADS8344_BUSY,
ADS8344_DOUT
);
端口类型定义
input Clk;
input Rst_n;
input Do_Conv;
input [7:0]ADS_CHSEL;
output reg [15:0]ADS_DATA;
output reg ADS_DONE;
output reg DATA_Valid;
output reg ADS8344_CS;
output reg ADS8344_DCLK;
output reg ADS8344_DIN;
input ADS8344_BUSY;
input ADS8344_DOUT;
定义两个寄存器,ADS_RDATA用于寄存ADS_DOUT转换输出的数据,LSM_CNT为9位的序列计数器
reg [15:0]ADS_RDATA; //ADS8344_DOUT输出的数据先寄存在ADS_RDATA,当DATA_Valid为1时数据给ADS_DATA
reg [8:0]LSM_CNT; //序列计数器
复位
always@(posedge Clk or negedge Rst_n )
if(!Rst_n)
LSM_CNT<=9'd0;
else if((LSM_CNT<301)&&Do_Conv)
LSM_CNT<=LSM_CNT+1'b1;
else if(LSM_CNT==301)
LSM_CNT<=9'd0;
always@(posedge Clk or negedge Rst_n )
if(!Rst_n)
begin
ADS8344_CS<=1'b1;
ADS8344_DCLK<=1'b0;
ADS8344_DIN<=1'b0;
ADS_DONE<=1'b0;
ADS_RDATA[15:0]<=16'd0;
DATA_Valid<=1'b0;
ADS_DATA<=16'd0;
end
当复位为1时(Rst_n==1’b1),开始执行程序,判断序列机LSM_CNT状态,根据其状态执行其相应状态下的语句。LSM_CNT