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
001
|
/*-----版權聲明-----
|
002
|
*
艾米電子工作室——讓開發變得更簡單
|
003
|
*
網站:https://www.amy-studio.com
|
004
|
*
淘寶:https://amy-studio.taobao.com
|
005
|
*
QQ(郵箱):amy-studio@qq.com
|
006
|
*-----文件信息-----
|
007
|
*
文件名稱:Amy_S_lcd12864_avalon_interface.v
|
008
|
*
最後修改日期:3.20, 2010
|
009
|
*
描述:Lcd12864的Avalon接口描述文件
|
010
|
*------------------
|
011
|
*
創建者:張亞峰
|
012
|
*
創建日期:3.20, 2009
|
013
|
*
版本:1.0
|
014
|
*
描述:原始版本
|
015
|
*------------------
|
016
|
*
修改者:
|
017
|
*
修改日期:
|
018
|
*
版本:
|
019
|
*
描述:
|
020
|
*-------------------
|
021
|
*/
|
022
|
023
|
module Amy_S_lcd12864_avalon_interface(
|
024
|
//
Clcok Input
|
025
|
input csi_clk,
|
026
|
input csi_reset_n,
|
027
|
//
Avalon-MM Slave
|
028
|
input avs_chipselect,
|
029
|
input [1:0]
avs_address,
|
030
|
input avs_write,
|
031
|
input [31:0]
avs_writedata,
|
032
|
input avs_read,
|
033
|
output [31:0]
avs_readdata,
|
034
|
//
Conduit End
|
035
|
//
lcd12864 interface
|
036
|
output reg coe_e,
|
037
|
output reg coe_rw,
|
038
|
output reg coe_rs,
|
039
|
inout [7:0]
coe_data_io
|
040
|
);
|
041
|
042
|
//++++++++++++++++++++++++++++++++++++++
|
043
|
//
寫 開始
|
044
|
//++++++++++++++++++++++++++++++++++++++
|
045
|
reg [7:0]
coe_data_o;
|
046
|
047
|
always @( posedge csi_clk, negedge csi_reset_n)
|
048
|
begin
|
049
|
if (!csi_reset_n)
|
050
|
begin
|
051
|
coe_e
<= 1'b0 ;
|
052
|
coe_rw
<= 1'b0 ;
|
053
|
coe_rs
<= 1'b0 ;
|
054
|
coe_data_o
<= 8'b0 ;
|
055
|
end
|
056
|
else if (avs_chipselect
& avs_write)
|
057
|
begin
|
058
|
case (avs_address)
|
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];
|
063
|
endcase
|
064
|
end
|
065
|
end
|
066
|
//--------------------------------------
|
067
|
//
寫 結束
|
068
|
//--------------------------------------
|
069
|
070
|
//++++++++++++++++++++++++++++++++++++++
|
071
|
//
讀 開始
|
072
|
//++++++++++++++++++++++++++++++++++++++
|
073
|
reg [7:0]
readdata_r;
|
074
|
wire [7:0]
coe_data_i;
|
075
|
076
|
always @( posedge csi_clk)
|
077
|
if (avs_chipselect
& avs_read)
|
078
|
begin
|
079
|
if (avs_address
== 3)
|
080
|
readdata_r
<= coe_data_i;
|
081
|
else
|
082
|
readdata_r
<= 8'b0 ;
|
083
|
end
|
084
|
else
|
085
|
readdata_r
<= 8'b0 ;
|
086
|
|
087
|
assign avs_readdata
= { 24'b0 ,
readdata_r};
|
088
|
//--------------------------------------
|
089
|
//
讀 結束
|
090
|
//--------------------------------------
|
091
|
092
|
093
|
//++++++++++++++++++++++++++++++++++++++
|
094
|
//
雙向口 開始
|
095
|
//++++++++++++++++++++++++++++++++++++++
|
096
|
reg coe_data_o_en;
|
097
|
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 ;
|
103
|
104
|
assign coe_data_i
= coe_data_io;
|
105
|
assign coe_data_io
= coe_data_o_en ? 8'bz :
coe_data_o;
|
106
|
//--------------------------------------
|
107
|
//
雙向口 結束
|
108
|
//--------------------------------------
|
109
|
|
110
|
endmodule
|
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