adc verilog spi 時序

2022-11-24 21:46:56 字數 2688 閱讀 5972

我用的是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;

[email protected](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;

endend

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

[email protected](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