⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad7864_controller.v

📁 多功能卡的源代码
💻 V
字号:
module ad7864_controller(reset_,
CLK_66M,
sample_start,
ad_conv,
ad_cs,
ad_read,
ad_busy,
ad_data,
fifo_data,
fifo_write,
fifo_usedw,
state,
ad_busy_flag
);
input reset_;
input CLK_66M;
input sample_start;
input ad_busy;
input [11:0] ad_data;
input [8:0] fifo_usedw;

output ad_conv;
reg ad_conv;
output ad_cs;
reg ad_cs;
output ad_read;
reg ad_read;
output [15:0] fifo_data;
reg [15:0] fifo_data;
output fifo_write;
reg fifo_write;
output [15:0] state;
reg [15:0] state;
output ad_busy_flag;
wire ad_busy_flag;

reg work_ena;
reg [15:0] fifo_data_buf;

assign ad_busy_flag = ad_busy;
always @(posedge CLK_66M or negedge reset_)begin
	if(!reset_) begin
		ad_conv <= 1'b1;
		ad_cs <= 1'b1;
		ad_read <= 1'b1;
		fifo_write <= 1'b0;
		state <= 16'h0;
		work_ena <= 1'b0;
		fifo_data <= 16'h0;
	end
	else begin
		if (!sample_start) begin
		case(state)
			16'd0:begin
				if(fifo_usedw[8] && fifo_usedw[7] && fifo_usedw[6]) begin
					work_ena <= 1'b0;
				end
				else begin
					work_ena <= 1'b1;
				end
				ad_conv <= 1'b1;
				ad_cs <= 1'b1;
				ad_read <= 1'b1;
				fifo_write <= 1'b0;
				state <= state + 16'd1;
			end
			16'd66:begin
				if(fifo_usedw[8] && fifo_usedw[7] && fifo_usedw[6]) begin
					work_ena <= 1'b0;
					state <= 16'd0;
				end
				else begin
					work_ena <= 1'b1;
					state <= state + 16'd1;
				end
			end
			16'd67:begin
				if(work_ena)begin
					ad_conv <= 1'b0;
					state <= state + 16'd1;
				end
				else begin
					state <= 16'd0;
				end
			end
			16'd180:begin
				ad_conv <= 1'b1;
				state <= state + 16'd1;
			end
			16'd220:begin
				if(ad_busy)begin
					state <= state + 16'd1;
				end
				else begin
					state <= 16'd0;
				end
			end
			16'd700:begin  //开始准备获得数据
				fifo_data <= 16'h0;
				if(!ad_busy)begin
					ad_cs <= 1'b0;
					ad_read <= 1'b0;
					state <= state + 16'd1;
				end
				else begin
					ad_cs <= 1'b1;
					ad_read <= 1'b1;
					state <= state;
				end
			end
			16'd732:begin
				ad_cs <= 1'b1;
				ad_read <= 1'b1;
				fifo_data_buf <= {2'b11,2'b00,ad_data[11:0]};//read the first data
				state <= state + 16'd1;
			end
			17'd740:begin
				fifo_data <= fifo_data_buf;
				state <= state + 16'd1;
			end
			16'd748:begin
				//fifo_data <= fifo_data_buf;
				fifo_write <= 1'b1;
				state <= state + 16'd1;
			end
			16'd764:begin
				fifo_write <= 1'b0;
				ad_cs <= 1'b0;
				ad_read <= 1'b0;
				state <= state + 16'd1;
			end
			16'd796:begin
				ad_cs <= 1'b1;
				ad_read <= 1'b1;
				fifo_data_buf <= {2'b11,2'b01,ad_data[11:0]};//read the second data
				state <= state + 16'd1;
			end
			16'd804:begin
				fifo_data <= fifo_data_buf;
				state <= state + 16'd1;
			end
			16'd812:begin
				//fifo_data <= fifo_data_buf;
				fifo_write <= 1'b1;
				state <= state + 16'd1;
			end
			17'd828:begin
				fifo_write <= 1'b0;
				ad_cs <= 1'b0;
				ad_read <= 1'b0;
				state <= state + 16'd1;
			end
			16'd860:begin
				ad_cs <= 1'b1;
				ad_read <= 1'b1;
				fifo_data_buf <= {2'b11,2'b10,ad_data[11:0]};//read the third data
				state <= state + 16'd1;
			end
			16'd868:begin
				fifo_data <= fifo_data_buf;
				state <= state + 16'd1;
			end
			16'd876:begin
				//fifo_data <= fifo_data_buf;
				fifo_write <= 1'b1;
				state <= state + 16'd1;
			end
			17'd892:begin
				fifo_write <= 1'b0;
				ad_cs <= 1'b0;
				ad_read <= 1'b0;
				state <= state + 16'd1;
			end
			16'd924:begin
				ad_cs <= 1'b1;
				ad_read <= 1'b1;
				fifo_data_buf <= {2'b11,2'b11,ad_data[11:0]};//read the forth data
				state <= state + 16'd1;
			end
			16'd932:begin
				fifo_data <= fifo_data_buf;
				state <= state + 16'd1;
			end
			16'd940:begin
				//fifo_data <= fifo_data_buf;
				fifo_write <= 1'b1;
				state <= state + 16'd1;
			end
			16'd956:begin
				fifo_write <= 1'b0;
				ad_cs <= 1'b1;
				ad_read <= 1'b1;
				state <= state + 16'd1;
				//fifo_data <= 16'h0;
			end
			16'd996:begin
				state <= state + 16'd1;
				fifo_data <= 16'h0;
			end
			default:begin
				state <= state + 16'd1;
			end
		endcase	
		end
	end
end

endmodule 
/*
不管采样率是多少,时钟周期
经过32个周期,计数1ffff次,需要131071*15.15ns = 1.98572565ms
首先开始,复位之后先停顿1us,判断FIFO是否足够500个数据
	如果足够,则逻辑停止
	否则,逻辑继续工作
发出conv信号,持续150ns,10个周期
等待7.14us=500*15.15ns
1.发出CS_和RD_,
等待32个周期,
收回CS和RD,并读取数据
等待16个周期,写FIFO
2.等待16个周期,收回写FIFO信号,发出CS_和RD_
等待32个周期,
收回CS和RD,并读取数据
等待16个周期,写FIFO
3.等待16个周期,收回写FIFO信号,发出CS_和RD_
等待32个周期,
收回CS和RD,并读取数据
等待16个周期,写FIFO
4.等待16个周期,收回写FIFO信号,发出CS_和RD_
等待32个周期,
收回CS和RD,并读取数据
等待16个周期,写FIFO
等待16个周期,收回写FIFO信号
一直计数到本次周期结束
*/



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -