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
上板驗證



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