FPGA设计 6位8通道同步采集AD芯片MAX11046 Verilog驱动源码:
/*
* @Description: MAX11046 divider
*/
module max11046_dev(
input clk,
input rst_n,
input en, //开始采集信号
input sny_clk, //同步信号
input eoc, //转换结束输出
output reg wr, //写使能 输入(低电平有效)
output reg cs, //片选 输入(低电平有效)
output reg rd, //读使能 输入(低电平有效)
output convst, //启动转换 输入(上升沿结束采样,并开始对捕获的样本进行转换。 当COVST为低电平时, ADC处于采集模式)
inout [15:0] db, //数据信号 输入输出
output [127:0] mdb, //数据输出
output reg rev_done //获取数据完成
);
reg [15:0] dataBus;
reg [127:0] r_mdb;
reg [3:0] channel;
reg [4:0] cur_state;
reg [4:0] next_state;
reg [7:0] time_cnt;
reg time_cnt_clr; //计数器清零信号
reg st_dong;
parameter st_cfg = 5'b0_0001; //配置状态
parameter st_mesu = 5'b0_0010; //采样状态
parameter st_covt = 5'b0_0100; //转换状态
parameter st_rdata = 5'b0_1000; //接收单通道数据
parameter st_nover = 5'b1_0000; //接收数据
//寄存器配置
parameter cr0 = 1'b0; //采集模式 0:convst 下降沿开始采集上升沿开始转换 1:一旦先前的转换完成,获取模式就会启动。 上升沿开始转换
parameter cr1 = 1'b0; //必须为0
parameter cr2 = 1'b1; //0:偏移二进制 1:补码二进制
parameter cr3 = 1'b0; //0:内部基准电源 1:外部基准电源
assign db = wr ? 16'hzzzz : dataBus ;
assign convst = sny_clk;
assign mdb = r_mdb;
//系统主频50MHZ,每个节拍20nS
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
time_cnt <= 8'b0;
else if(time_cnt_clr)
time_cnt <= 8'b0;
else
time_cnt <= time_cnt + 8'b1;
end
always @ (posedge clk or negedge rst_n) begin
if(!rst_n)
cur_state <= st_cfg;
else
cur_state <= next_state ;
end
always @ (*) begin
case(cur_state)
st_cfg:begin
if(st_dong)begin
next_state = st_mesu;
end
else begin
next_state = st_cfg;
end
end
st_mesu:begin
if(st_dong)begin
next_state = st_covt;
end
else begin
next_state = st_mesu;