基于ads1256的ADC控制实现

回顾上期状态机的条件:

复制代码
// -----------------------------------------------------------------------------
// Copyright (c) 2014-2025 All rights reserved
// -----------------------------------------------------------------------------
// Author : lvjitao lvjitao_o@163.com
// File   : adc_ctrl_ads1256.v
// Create : 2025-10-18 09:06:14
// Revise : 2025-10-18 17:06:45
// Editor : sublime text3, tab size (4)
// -----------------------------------------------------------------------------
`timescale  1ns/1ps


module adc_ctrl_ads1256(
	//uart
	input	wire		clk,
	input	wire		rst_n,

	input	wire [7:0]	pi_data_rx,

	input	wire		pi_flag_rx,
	output	wire [7:0]	po_data_tx,
	output	wire		po_flag_tx,		

	//1256	spi	interface\
	input	wire		miso,

	output	wire		cs_n,
	output	reg		sclk,
	output	wire		mosi,

	//1256	ads1256 signal\
	input	wire		drdy,		//adctive low

	output	reg		reset,		//adctive low
	output 	wire		sync		//adctive low
	

    );

localparam	IDLE		=	10'b0000000001;
localparam	PREPARE_C	=	10'b0000000010;
localparam	WREG		=	10'b0000000100;
localparam	SYNC_S		=	10'b0000001000;
localparam	WAKEUP		=	10'b0000010000;
localparam	WAIT1		=	10'b0000100000;
localparam	RDATAC		=	10'b0001000000;
localparam	MISO		=	10'b0010000000;
localparam	WAIT2		=	10'b0100000000;
localparam	SDATAC		=	10'b1000000000;

localparam	RESET_MAX 	= 	500 - 1;
localparam 	CLK_CNT_MAX	= 	50 - 1;
localparam	STATE_CNT_MAX = 34;

//cmd
localparam	CMD_WREG	=	24'h510078;
localparam	CMD_SYNC	=	8'hFC;
localparam	CMD_WAKEUP	=	8'h00;
localparam	CMD_RDATAC	= 	8'h03;
localparam	CMD_SDATAC	=	8'h0F;

reg [9:0] 	state;
reg [1:0]	drdy_reg = 0;

reg [8:0]	reset_adc_cnt;

reg [5:0]	clk_cnt;
reg [5:0]	state_cnt;
reg [56:0]	shift_reg;

reg 		mosi_wreg;

assign cs_n = 1'b0;
assign sync = 1'b1;


always @(posedge clk ) begin
	if (rst_n == 1'b0) begin
		// reset
		reset_adc_cnt <= 0;
	end
	else if (reset_adc_cnt != RESET_MAX) begin
		reset_adc_cnt <= reset_adc_cnt + 1'b1;
	end
end

always @(posedge clk ) begin
	if (rst_n == 0) begin
		// reset
		reset <= 0;
	end
	else if (reset_adc_cnt == RESET_MAX) begin
		reset <= 1;
	end
end



always @(posedge clk ) begin
	if (rst_n == 0) begin
		// reset
		state <= 'd0;
	end
	else case (state)
		IDLE: begin
			if (pi_flag_rx == 1'b1 && pi_data_rx == 8'hcc) begin
				state <= PREPARE_C;
			end
			else begin
				state <= IDLE;
			end
		end

		PREPARE_C: begin
			if (drdy_reg == 2'b10) begin
				state <= WREG;
			end
			else begin
				state <= PREPARE_C;
			end
		end

		WREG: begin
			if (state_cnt == STATE_CNT_MAX && clk_cnt == CLK_CNT_MAX) begin
				state <= SYNC_S;
			end
		end


		default: state <= IDLE;

	endcase
end



always @(posedge clk ) begin
	drdy_reg <= {drdy_reg[0], drdy};
end

always @(posedge clk ) begin
	if (rst_n == 0) begin
		// reset
		clk_cnt <= 0;
	end

	else if (state == WREG ) begin
		if (clk_cnt == CLK_CNT_MAX) begin
			clk_cnt <= 0;
		end

		else begin
			clk_cnt <= clk_cnt + 1'b1;
		end

	end
end

always @(posedge clk ) begin
	if (rst_n == 0) begin
		// reset
		state_cnt <=  0;
	end
	else if (state == WREG ) begin
		if (state_cnt ==STATE_CNT_MAX && clk_cnt == CLK_CNT_MAX) begin
			state_cnt <= 0;
		end
		else  if(clk_cnt == CLK_CNT_MAX)  begin
			state_cnt <= state_cnt + 1;
		end

	end
	else begin
		state_cnt <= 0;
	end
end

always @(posedge clk ) begin
	if (rst_n == 0) begin
		// reset
		sclk <= 0;
	end
	else if (state == WREG && state_cnt <= 'd23) begin
		 	if (clk_cnt == CLK_CNT_MAX[6:1]) begin
				sclk <= 1'b1;
			end
			else if (clk_cnt == CLK_CNT_MAX) begin
				sclk <= 1'b0;
			end
	end
	else begin
		sclk <= 0;
	end

end


always @(posedge clk ) begin
	if (rst_n == 0) begin
		// reset
		shift_reg <= {CMD_WREG, CMD_SYNC, CMD_WAKEUP, CMD_RDATAC, CMD_SDATAC};
	end
	else if (state ==IDLE) begin
		shift_reg <= {CMD_WREG, CMD_SYNC,CMD_WAKEUP, CMD_RDATAC, CMD_SDATAC};
	end
	else if (state == WREG && state_cnt >= 1'd1 &&state_cnt <= 'd24) begin
		if (clk_cnt == CLK_CNT_MAX[6:1]) begin
			shift_reg <= {shift_reg[54:0], 1'b0 };
		end
	end
end


always @(*) begin
	if (state == WREG && state_cnt <= 'd23) begin
		// reset 
		mosi_wreg = shift_reg[55];
	end
	else begin
		mosi_wreg = 1'b0;
	end
end


endmodule

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2025 All rights reserved
// -----------------------------------------------------------------------------
// Author : lvjitao lvjitao_o@163.com
// File   : tb_adc_ctrl_ads1256.v
// Create : 2025-10-18 16:17:48
// Revise : 2025-10-18 16:32:02
// Editor : sublime text3, tab size (4)
// -----------------------------------------------------------------------------
`timescale  1ns/1ps


module tb_adc_ctrl_ads1256(

    );

reg 		clk, rst_n;
reg 		pi_flag;
reg [7:0] 	pi_data;

wire 		sclk;
wire		cs_n, mosi, miso, reset;
reg			drdy;


initial begin
	clk = 0;
	rst_n = 0;
	repeat(10) @(posedge clk);
	rst_n = 1;
end


always #10 clk = ~clk; 


initial begin
	drdy	= 0;
	pi_flag = 0;
	pi_data = 0;
	#10;
	@(posedge rst_n);
	repeat(10) @(posedge clk);
	pi_flag <= 1;
	pi_data <= 8'hcc;
	@(posedge clk);
	pi_flag <= 1'b0;

end


initial begin
	#10;
	gen_drdy();
end


task gen_drdy;
	integer i;
	begin
		for(i=0; i<1000; i=i+1)begin
			drdy <= 0;
			#31000;
			drdy <= 1;
			#2333;


		end
	end


endtask



	adc_ctrl_ads1256 inst_adc_ctrl_ads1256(
			.clk        (clk),
			.rst_n      (rst_n),
			.pi_data_rx (pi_data_rx),
			.pi_flag_rx (pi_flag_rx),
			.po_data_tx (),
			.po_flag_tx (),
			.miso       (miso),
			.cs_n       (cs_n),
			.sclk       (sclk),
			.mosi       (mosi),
			.drdy       (drdy),
			.reset      (reset),
			.sync       (sync)
		);



endmodule
相关推荐
坏孩子的诺亚方舟16 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐16 天前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐16 天前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH17 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡17 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安17 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐18 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯18 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客18 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA18 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发