閱讀407 返回首頁    go 阿裏雲 go 技術社區[雲棲]


怎樣製作一個簡單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.1 Amy_S_lcd12864 IP與System Interconnect Fabric的連線框圖

圖1.2 某帶有Amy_S_lcd12864 IP的Avalon係統框圖

圖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。

Naming Convention for Avalon Signal Type

圖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通信框圖

圖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

  上一篇:go php之利用遞歸寫無限極分類
  下一篇:go 怎樣在WPS上實現代碼語法高亮.