adc verilog spi 时序

我用的是adc081sd芯片,(由于我们使用的是FPGA不用像单片机那样考虑极性cpol,相位cpha,下面仅仅介绍下跟单片机比较下) 什么是cpol:若cs被拉为低电平时sclk(时钟)是高那么cpol为1,若cs被拉为低电平时sclk为0时,cpol为0;

什么是相位 cpha:若cs被拉为低电平后是第一个时钟沿采集数据就为0,第二个时钟沿采集数据为1.

时钟上升沿对应SDATA位稳定时就为上升沿采集数据(下降沿时芯片内部会自动将数据送到SDTA引脚供上升沿采集),时钟下降沿对应图SDATA位稳定时就为下降沿沿采集数据,例如下图

如下图所示sclk上升沿时SDTA稳定,下降沿数据不稳定(那么时钟的下降沿时AD芯片送数据,上升沿到来采集管脚数据即可)。上升沿采集。

module adc
(
input clk_in,//
input rst_n_in,//
input adc_data,//caiji
output reg cs,
output reg sclk,
output reg[7:0] led

);

//产生状态
reg[5:0] cnt=0;
always@(posedge clk_in or negedge rst_n_in)
begin
if(!rst_n_in)
cnt<=0;
else
begin
if(cnt>=35)cnt<=0;
else cnt<=cnt+1;
end
end

reg[15:0] data_reg=16'b0;

always@(posedge clk_in or negedge rst_n_in)
begin
if(!rst_n_in)begin cs<=1;sclk<=1; end
else
begin
case(cnt)
0:begin sclk<=1; cs<=1; end
1:begin cs<=0; end

2:begin sclk<=0;end
3:begin sclk<=1;data_reg[15]<=adc_data;end //采集了数据最高位z2

4:begin sclk<=0;end
5:begin sclk<=1;data_reg[14]<=adc_data;end //采集了数据位z1

6:begin sclk<=0;end
7:begin sclk<=1;data_reg[13]<=adc_data;end//采集了数据z0

8:begin sclk<=0;end
9:begin sclk<=1;data_reg[12]<=adc_data;end//采集了数据DB7

10:begin sclk<=0;end
11:begin sclk<=1;data_reg[11]<=adc_data;end//采集了数据DB6

12:begin sclk<=0;end
13:begin sclk<=1;data_reg[10]<=adc_data;end//采集了数据DB5

14:begin sclk<=0;end
15:begin sclk<=1;data_reg[9]<=adc_data;end//采集了数据DB4

16:begin sclk<=0;end
17:begin sclk<=1;data_reg[8]<=adc_data; end//采集了数据DB3

18:begin sclk<=0;end ////采集了DB2
19:begin sclk<=1; data_reg[7]<=adc_data; end

20:begin sclk<=0;end //
21:begin sclk<=1;data_reg[6]<=adc_data;end//采集了数据DB1

22:begin sclk<=0;end //
23:begin sclk<=1;data_reg[5]<=adc_data;end//采集了数据DB0

24:begin sclk<=0;end //
25:begin sclk<=1;data_reg[4]<=adc_data;end//采集了数据ZERO 4

26:begin sclk<=0;end //
27:begin sclk<=1;data_reg[3]<=adc_data;end//采集了数据ZERO 3

28:begin sclk<=0;end //
29:begin sclk<=1;data_reg[2]<=adc_data;end//采集了数据ZERO 2

30:begin sclk<=0;end //
31:begin sclk<=1;data_reg[1]<=adc_data;end//采集了数据ZERO 1

32:begin sclk<=0;end //
33:begin sclk<=1;data_reg[0]<=adc_data;end //采集了数据ZERO 0
34:begin cs<=1; led<=data_reg[12:5]; end //将数据锁存,采下次数据时led的数据不会发生跳变
endcase
end
end

endmodule

 

posted @ 2016-08-13 11:41  深水无声  阅读(1403)  评论(0编辑  收藏  举报