基于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
相关推荐
易享电子21 小时前
基于单片机车窗环境监测控制系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
cycf1 天前
系统同步接口输入延迟(五)
fpga开发
cmc10281 天前
131.如何区分FPGA芯片型号是-2l还是-2方法
fpga开发
sz66cm1 天前
FPGA基础 -- 无毛刺时钟切换(glitch-free clock switching)
fpga开发
Blossom.1181 天前
把AI“绣”进丝绸:生成式刺绣神经网络让古装自带摄像头
人工智能·pytorch·python·深度学习·神经网络·机器学习·fpga开发
电子凉冰1 天前
FPGA强化-VGA显示设计与验证
fpga开发
XINVRY-FPGA1 天前
XC7A100T-2FGG484I Xilinx Artix-7 FPGA
arm开发·嵌入式硬件·fpga开发·硬件工程·信息与通信·信号处理·fpga
cmc10281 天前
129.FPGA绑定管脚时差分管脚只绑_p是不行的,tx与rx只绑一个也不行
fpga开发
望获linux1 天前
【实时Linux实战系列】FPGA 与实时 Linux 的协同设计
大数据·linux·服务器·网络·数据库·fpga开发·操作系统