📄 ad7864_controller.v.bak
字号:
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 [9: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[9] && fifo_usedw[8] && fifo_usedw[7]) 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'd80:begin
ad_conv <= 1'b1;
state <= state + 16'd1;
end
16'd120:begin
if(ad_busy)begin
state <= state + 16'd1;
end
else begin
state <= 16'd0;
end
end
16'd600: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'd632: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'd640:begin
fifo_data <= fifo_data_buf;
state <= state + 16'd1;
end
16'd648:begin
//fifo_data <= fifo_data_buf;
fifo_write <= 1'b1;
state <= state + 16'd1;
end
16'd664:begin
fifo_write <= 1'b0;
ad_cs <= 1'b0;
ad_read <= 1'b0;
state <= state + 16'd1;
end
16'd696: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'd704:begin
fifo_data <= fifo_data_buf;
state <= state + 16'd1;
end
16'd712:begin
//fifo_data <= fifo_data_buf;
fifo_write <= 1'b1;
state <= state + 16'd1;
end
17'd728:begin
fifo_write <= 1'b0;
ad_cs <= 1'b0;
ad_read <= 1'b0;
state <= state + 16'd1;
end
16'd760: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'd768:begin
fifo_data <= fifo_data_buf;
state <= state + 16'd1;
end
16'd776:begin
//fifo_data <= fifo_data_buf;
fifo_write <= 1'b1;
state <= state + 16'd1;
end
17'd792:begin
fifo_write <= 1'b0;
ad_cs <= 1'b0;
ad_read <= 1'b0;
state <= state + 16'd1;
end
16'd824: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'd832:begin
fifo_data <= fifo_data_buf;
state <= state + 16'd1;
end
16'd840:begin
//fifo_data <= fifo_data_buf;
fifo_write <= 1'b1;
state <= state + 16'd1;
end
16'd856:begin
fifo_write <= 1'b0;
ad_cs <= 1'b1;
ad_read <= 1'b1;
state <= state + 16'd1;
//fifo_data <= 16'h0;
end
16'd896: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 + -