FPGA之SSI接口協議實現


     SSI(Synchronous Serial Interface,同步串行接口)是一個全雙工的串行接口,允許芯片與多種串行設備通信。它是高精度絕對編碼器種一種比較常見的接口方式,采用主機主動式讀出方式,即在主控者發出的時鍾脈沖的控制下,從最高有效位(MSB)開始同步傳輸數據。下面以SSI3為例,具體講解它的接口實現方式。

時序圖

 

注意事項

1、時鍾頻率:100kHz至2MHz,這里取1MHz,就是1T=1us.

2、數據發送階段:Trc=(16+0.5)us(SSI3數據位是16位)

 

3、Tmu(數據更新待階段)=20us+/-1us;

4、Timg(數據等待階段)必須要大於Tmu(數據更新階段),為了保證滿足時序要求,這里Timg只要大於21us即可;

5、一個完整工作周期=Trc(數據發送階段)+Timg(數據等待階段)=(16+0.5+21)us,也就是一個完整工作周期至少要>37.5us,這里為了保證滿足時序需求,取到40us。

6、當檢測到Error為0(可靠數據),將數據發送階段的16bit數據保存輸出即可。

程序設計

設計目的:按照時序要求,FPGA輸出1M的采樣時鍾給編碼器,當error為0時,采樣16bit數據輸出

1、SSI3的數據線為外部輸入信號,為了避免亞穩態,需要將數據打拍消抖處理

 1  always  @(posedge clk or negedge rst_n)begin    //prevent the Metastability
 2       if(rst_n==1'b0)begin
 3           data_in_ff0<=0;
 4           data_in_ff1<=0;
 5           data_in_ff2<=0;
 6       end
 7       else begin
 8           data_in_ff0<=data_in;
 9           data_in_ff1<=data_in_ff0;
10           data_in_ff2<=data_in_ff1;
11       end
12   end

 2、設計采樣時鍾

 1  //produce 1M clk 
 2      always @(posedge clk or negedge rst_n)begin
 3          if(!rst_n)begin
 4              cnt <= 0;
 5          end
 6          else if(add_cnt)begin
 7              if(end_cnt)
 8                  cnt <= 0;
 9              else
10                  cnt <= cnt + 1;
11          end
12      end
13 
14      assign add_cnt = flag_begin==1  ;       
15      assign end_cnt = add_cnt && cnt== 50-1 ;   //1us ,pruduce 1M
16 
17      //begin
18      always @(posedge clk or negedge rst_n)begin
19          if(!rst_n)begin
20              cnt_bit <= 0;
21          end
22          else if(add_cnt_bit)begin
23              if(end_cnt_bit)
24                  cnt_bit <= 0;
25              else
26                  cnt_bit <= cnt_bit + 1;
27          end
28      end
29 
30      assign add_cnt_bit = end_cnt;       
31      assign end_cnt_bit = add_cnt_bit && cnt_bit==40-1 ;    //set up 40us   
32 
33      assign dout_clk_high=add_cnt==1&&cnt==1-1&&cnt_bit>=2-1&&cnt_bit<=18-1;
34      assign dout_clk_low =add_cnt==1&&cnt==25-1&&cnt_bit>=1-1&&cnt_bit<=17-1;
35 
36      always  @(posedge clk or negedge rst_n)begin
37          if(rst_n==1'b0)begin
38              dout_clk<=1;
39          end
40          else if(dout_clk_high==1)begin
41              dout_clk<=1;
42          end
43          else if(dout_clk_low==1)begin
44              dout_clk<=0;
45          end
46          
47      end

 

上板驗證

 

 注意:未經允許,禁止轉載,違法必究!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM