407
阿裏雲
技術社區[雲棲]
怎樣製作一個簡單ip,以方便在Quartus II和Nios II中使用?.[Nios II][上]
概述:此處,我以Lcd12864(ST7920)作為範例,進行粗淺講解,望各位網友踴躍拍磚。
0 軟硬件環境
軟件:Altera Quartus II 9.1 + Nios II 9.1 Software Build Tools for Eclipse
硬件:艾米電子EP2C8開發板(EP2C8Q208C8 + 16 bit SDRAM 64MB + EPCS4)
1 硬件部分
1.1 Avalon-MM接口(讀作:阿窩龍妹妹接口)
Avalon Memory-Mapped接口,簡稱為 Avalon-MM接口,用於在存儲映射係統中描述主從元件(component)的讀/寫接口。

圖1.1 Amy_S_lcd12864 IP與System Interconnect Fabric的連線框圖

圖1.2 某帶有Amy_S_lcd12864 IP的Avalon係統框圖
1.2 從設備讀寫時序
請參考手冊《Avalon Interface Specification》,此處略去。
1.3 HDL模塊及說明
1.3.1 模塊介紹
表1.1 Amy_S_lcd12864 IP的HDL源代碼模塊介紹
文件名稱 |
功能描述 |
Amy_S_lcd12864_avalon_interface.v |
Amy_S_lcd12864 Avalon接口文件 |
1.3.2 源代碼
注:本文所涉及verilog代碼,是按照Verilog 2001規範編寫的。Avalon信號類型命名參考圖1.3。

圖1.3 Naming Convention for Avalon Signal Type
1.3.2.1 Amy_S_lcd12864_avalon_interface.v
005
|
*
QQ(郵箱):amy-studio@qq.com
|
007
|
*
文件名稱:Amy_S_lcd12864_avalon_interface.v
|
009
|
*
描述:Lcd12864的Avalon接口描述文件
|
023
|
module Amy_S_lcd12864_avalon_interface(
|
028
|
input avs_chipselect,
|
029
|
input [1:0]
avs_address,
|
031
|
input [31:0]
avs_writedata,
|
033
|
output [31:0]
avs_readdata,
|
035
|
//
lcd12864 interface
|
039
|
inout [7:0]
coe_data_io
|
042
|
//++++++++++++++++++++++++++++++++++++++
|
044
|
//++++++++++++++++++++++++++++++++++++++
|
045
|
reg [7:0]
coe_data_o;
|
047
|
always @( posedge csi_clk, negedge csi_reset_n)
|
056
|
else if (avs_chipselect
& avs_write)
|
059
|
0:
coe_e <= avs_writedata[0];
|
060
|
1:
coe_rw <= avs_writedata[0];
|
061
|
2:
coe_rs <= avs_writedata[0];
|
062
|
3:
coe_data_o <= avs_writedata[7:0];
|
066
|
//--------------------------------------
|
068
|
//--------------------------------------
|
070
|
//++++++++++++++++++++++++++++++++++++++
|
072
|
//++++++++++++++++++++++++++++++++++++++
|
073
|
reg [7:0]
readdata_r;
|
074
|
wire [7:0]
coe_data_i;
|
076
|
always @( posedge csi_clk)
|
077
|
if (avs_chipselect
& avs_read)
|
079
|
if (avs_address
== 3)
|
080
|
readdata_r
<= coe_data_i;
|
087
|
assign avs_readdata
= { 24'b0 ,
readdata_r};
|
088
|
//--------------------------------------
|
090
|
//--------------------------------------
|
093
|
//++++++++++++++++++++++++++++++++++++++
|
095
|
//++++++++++++++++++++++++++++++++++++++
|
098
|
always @( posedge csi_clk)
|
099
|
if (avs_chipselect
& avs_write)
|
100
|
coe_data_o_en
<= 1'b0 ;
|
101
|
else if (avs_chipselect
& avs_read)
|
102
|
coe_data_o_en
<= 1'b1 ;
|
104
|
assign coe_data_i
= coe_data_io;
|
105
|
assign coe_data_io
= coe_data_o_en ? 8'bz :
coe_data_o;
|
106
|
//--------------------------------------
|
108
|
//--------------------------------------
|
1.3.3 一些說明
ST7920的E、RW和RS都是單向的,而DATA總線是雙向的;故在此處nios既需要寫數據給ST7920,又需要從ST7920讀數據。
從42行到68行,即nios向ST7920寫數據。注意,誰給nios寫數據呢?請看圖1.4。

圖1.4 NII、nios cpu和ST7920通信框圖
從70行到90行,是nios從ST7920讀數據。由於隻有DATA總線需要讀,其他的管腳就不寫了,嗬嗬。
從93行到108行,是對DATA雙向總線的處理。讀或寫隻是簡單由Avalon的讀、寫信號來控製的。這個技巧是我從open-cores裏麵的基於wishbone總線的IIC從設備的IP上學到的。注意:ST7920是低速設備,此處隻做簡單處理;高速設備請大家自行斟酌。
還有一點需要說明,chipselect在Nios II 9.0之後就不是必須的信號,此處加上,隻為和以前的版本兼容。
最後更新:2017-04-04 02:25:10