簡 介:
集成電路設計越來越向系統級的方向發展,并且越來越強調模塊化的設計。SPI(Serial Peripheral Bus)總線是Motorola公司提出的一個同步串行外設接口,容許CPU 與各種外圍接口器件以串行方式進行通信、交換信息。本文簡述了SPI總線的特點,介紹了其4條信號線,SPI串行總線接口的典型應用。
重點描述了SPI串行總線接口在一款802.11b芯片中的位置,及該接口作為基帶和射頻的通訊接口所完成的功能,并給出了用硬件描述語言Verilog HDL 實現該接口的部分程序。該實現已經在Modelsim 中完成了仿真, 并經過了FPGA 驗證, 最后給出了仿真和驗證的結果。
在SOC設計中,利用EDA 工具設計芯片實現系統功能已經成為支撐電子設計的通用平臺。并逐步向支持系統級的設計方向發展。而且,在設計過程中,越來越強調模塊化設計。
SPI總線是Motorola公司提出的一個同步串行外設接口,具有接口線少、通訊效率高等特點。本文給出的是利用Verilog HDL實現的SPI總線模塊,該模塊是802.11b無線局域網芯片中一個子模塊,該模塊完成了芯片中基帶(base band)與RF的通訊工作。
1 SPI總線接口概述
SPI(Serial Parallel Bus)總線是Motorola公司提出的一個同步串行外設接口,允許CPU 與各種外圍接口器件(包括模/數轉換器、數/模轉換器、液晶顯示驅動器等)以串行方式進行通信、交換信息。他使用4條線:串行時鐘線(SCK)、主機輸入/從機輸出線(MISO)、主機輸出/從機輸入線(MOSI)、低電平有效的使能信號線(CS)。這樣,僅需3~4根數據線和控制線即可擴展具有SPI接口的各種I/O器件 其典型結構如圖1所示。
SPI總線具有以下特點:
(1)連線較少,簡化電路設計。并行總線擴展方法通常需要8根數據線、8~16根地址線、2~3根控制線。而這種設計,僅需4根數據和控制線即可完成并行擴展所實現的功能。
(2)器件統一編址,并與系統地址無關,操作SPI獨立性好。
(3)器件操作遵循統一的規范,使系統軟硬件具有良好的通用性。
2 SPI總線接口的設計與實現
該模塊是802.1lb無線局域網芯片中的一子模塊,其在芯片中的位置如圖2所示。
其中base band(基帶)為SPI的主控器(master),RF(射頻)為SPI的受控器(slave)。SPI interface作為baseband與RF的通訊接口,主要完成以下工作:
(1)將從base band接收到的16位的并行數據,轉換為RF所能接收的串行數據,并將該數據根據SPI協議送給RF。
(2)產生RF所需的時鐘信號SCLK,使能信號CSB。
(3)接收從RF傳回的串行數據,并將其轉換為并行數據。
(4)將base band發送的數據,與RF返回的數據進行比較,并把比較結果傳給base band。
下面給出用Verilog HDL語言實現前兩項功能的關鍵程序,相關變量的聲明在此略去。
//generate a counter
always@ (posedge clock or negedge reset)
begin
if(!reset)
counter《= 0;
else if(enable)
begin
if(counter《 53)
counter=counter + 1;
end
end
//generate signal “csb”
always@ (posedge clock or negedge reset)
begin
if(!reset)
csb 《=1;
else if(counter》= 1 && counter 《= 50)
csb = 0;
else
csb = 1;
end
//Generate “sclk”
always@ (posedge clock or negedge reset)
begin
case(counter)
6‘d02: sclk = 1;
6’d05: sclk = 1;
6‘d08: sclk = 1;
6’d11: sclk = 1;
6‘d14: sclk = 1;
6’d17: sclk = 1;
6‘d20: sclk = 1;
6’d23: sclk = 1;
6‘d26: sclk = 1;
6’d29: sclk = 1;
6‘d32: sclk = 1;
6’d35: sclk = 1;
6‘d38: sclk = 1;
6’d41: sclk = 1;
6‘d44: sclk = 1;
6’d47: sclk = 1;
default sclk = 0;
endcase
end
always@ (counter or csb)
begin
if(csb == 0)
case(counter)
6‘h00,
6’h01,
6‘h02,
6’h03:mosi_index = 5‘h00;
6’h04,
6‘h05,
6’h06:mosi_index = 5‘h01;
6’h07,
6‘h08,
6’h09:mosi_index = 5‘h02;
6’h0A,
6‘h0B,
6’h0C:mosi_index = 5‘h03;
6’h0D,
6‘h0E,
6’h0F:mosi_index = 5‘h04;
6’h10,
6‘h11,
6’h12:mosi_index = 5‘h05;
6’h13,
6‘h14,
6’h15:mosi_index = 5‘h06;
6’h16,
6‘h17,
6’h18:mosi_index = 5‘h07;
6’h19,
6‘h1A,
6’h1B:mosi_index = 5‘h08;
6’h1C,
6‘h1D,
6’hlE:mosi_index = 5‘h09;
6’h1F,
6‘h20,
6’h21:mosi_index = 5‘h0A ;
6’h22,
6‘h23,
6’h24:mosi_index = 5‘h0B;
6’h25,
6‘h26,
6’h27:mosi_index = 5‘h0C ;
6’h28,
6‘h29,
6’h2A:mosi_index = 5‘h0D ;
6’h2B,
6‘h2C,
6’h2D:mosi_index = 5‘h0E;
6’h2E,
6‘h2F,
6’h30:mosi_index = 5‘h0F;
default:mosi_index = 5’h00;
endcase
else
mosi_index = 5‘h00:
end
assign mosi=spi_data[mosi_index3];
用Verilog HDL實現的SPI總線接口模塊,在ModelSim 中編譯、調試,并做了前仿真。
前仿真通過后,又在Altera公司的EPXA10 Develop Board上做了FPGA驗證,結果與在ModelSim 中的仿真結果一致。最后在base band與RF的聯合調試過程中,該SPI總線接口模塊達到了預期的要求。
編輯:jq
-
cpu
+關注
關注
68文章
10863瀏覽量
211763 -
soc
+關注
關注
38文章
4165瀏覽量
218257 -
SPI
+關注
關注
17文章
1706瀏覽量
91582 -
CS
+關注
關注
0文章
54瀏覽量
24522 -
MOSI
+關注
關注
0文章
5瀏覽量
3997
原文標題:SPI串行總線接口的Verilog實現
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論