日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[原创].怎样制作一个简单ip,以方便在Quartus II和Nios II中使用?

發布時間:2025/3/20 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [原创].怎样制作一个简单ip,以方便在Quartus 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.vAmy_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
/*-----版權聲明-----* 艾米電子工作室——讓開發變得更簡單 * 網站:http://www.amy-studio.com* 淘寶:http://amy-studio.taobao.com* QQ(郵箱):amy-studio@qq.com*-----文件信息-----* 文件名稱:Amy_S_lcd12864_avalon_interface.v* 最后修改日期:3.20, 2010* 描述:Lcd12864的Avalon接口描述文件*------------------* 創建者:張亞峰* 創建日期:3.20, 2009* 版本:1.0* 描述:原始版本*------------------* 修改者:* 修改日期:* 版本:* 描述:*-------------------*/module Amy_S_lcd12864_avalon_interface(// Clcok Inputinput csi_clk,input csi_reset_n,// Avalon-MM Slaveinput avs_chipselect,input [1:0] avs_address,input avs_write,input [31:0] avs_writedata,input avs_read,output [31:0] avs_readdata, // Conduit End // lcd12864 interfaceoutput reg coe_e,output reg coe_rw, output reg coe_rs,inout [7:0] coe_data_io );//++++++++++++++++++++++++++++++++++++++ // 寫 開始 //++++++++++++++++++++++++++++++++++++++ reg [7:0] coe_data_o;always@(posedge csi_clk, negedge csi_reset_n) beginif (!csi_reset_n)begin coe_e <= 1'b0;coe_rw <= 1'b0;coe_rs <= 1'b0;coe_data_o <= 8'b0;endelse if (avs_chipselect & avs_write)begincase (avs_address)0: coe_e <= avs_writedata[0];1: coe_rw <= avs_writedata[0];2: coe_rs <= avs_writedata[0];3: coe_data_o <= avs_writedata[7:0];endcaseend end //-------------------------------------- // 寫 結束 //--------------------------------------//++++++++++++++++++++++++++++++++++++++ // 讀 開始 //++++++++++++++++++++++++++++++++++++++ reg [7:0] readdata_r; wire [7:0] coe_data_i;always@(posedge csi_clk)if (avs_chipselect & avs_read)beginif (avs_address == 3)readdata_r <= coe_data_i;else readdata_r <= 8'b0;endelsereaddata_r <= 8'b0;assign avs_readdata = {24'b0, readdata_r}; //-------------------------------------- // 讀 結束 //--------------------------------------//++++++++++++++++++++++++++++++++++++++ // 雙向口 開始 //++++++++++++++++++++++++++++++++++++++ reg coe_data_o_en;always@(posedge csi_clk)if (avs_chipselect & avs_write)coe_data_o_en <= 1'b0;else if (avs_chipselect & avs_read)coe_data_o_en <= 1'b1;assign coe_data_i = coe_data_io; assign coe_data_io = coe_data_o_en ? 8'bz : coe_data_o; //-------------------------------------- // 雙向口 結束 //--------------------------------------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之后就不是必須的信號,此處加上,只為和以前的版本兼容。

?

2 軟件部分

表2.1 Amy_S_lcd12864 IP的C源代碼模塊介紹

文件名稱功能描述
Amy_S_lcd12864.hAmy_S_lcd12864 的C頭文件
Amy_S_lcd12864.cAmy_S_lcd12864 的C源文件

2.1 C頭文件

2.1.1 Amy_S_lcd12864.h
/*-----版權聲明-----* 艾米電子工作室——讓開發變得更簡單 * 網站:http://www.amy-studio.com* 淘寶:http://amy-studio.taobao.com* QQ(郵箱):amy-studio@qq.com*-----文件信息-----* 文件名稱:Amy_S_lcd12864.h* 最后修改日期:3.20, 2009* 描述:Lcd12864驅動宏文件*------------------* 創建者:張亞峰* 創建日期:3.20, 2009* 版本:1.0* 描述:原始版本*------------------* 修改者:* 修改日期:* 版本:* 描述:*-------------------*/#ifndef __Amy_S_LCD12864_H__ #define __Amy_S_LCD12864_H__//++++++++++++++++++++++++++++++++++++++ // 基地址 開始 // 根據SOPC Builder設置編寫 //++++++++++++++++++++++++++++++++++++++ #include "system.h"#define lcd12864_addr LCD12864_BASE //-------------------------------------- // 基地址 開始 //--------------------------------------//++++++++++++++++++++++++++++++++++++++ // 寄存器映射 開始 // 根據HDL編寫 //++++++++++++++++++++++++++++++++++++++ #include #define IOWR_LCD12864_E(base, data) IOWR(base, 0, data) #define IOWR_LCD12864_RW(base, data) IOWR(base, 1, data) #define IOWR_LCD12864_RS(base, data) IOWR(base, 2, data) #define IOWR_LCD12864_DATA(base, data) IOWR(base, 3, data) #define IORD_LCD12864_DATA(base) IORD(base, 3) //-------------------------------------- // 寄存器映射 結束 //--------------------------------------//++++++++++++++++++++++++++++++++++++++ // 管腳操作 開始 //++++++++++++++++++++++++++++++++++++++ #define SET_E IOWR_LCD12864_E(lcd12864_addr, 1) #define CLR_E IOWR_LCD12864_E(lcd12864_addr, 0) #define SET_RW IOWR_LCD12864_RW(lcd12864_addr, 1) #define CLR_RW IOWR_LCD12864_RW(lcd12864_addr, 0) #define SET_RS IOWR_LCD12864_RS(lcd12864_addr, 1) #define CLR_RS IOWR_LCD12864_RS(lcd12864_addr, 0) #define WR_DATA(data) IOWR_LCD12864_DATA(lcd12864_addr, data) #define RD_DATA IORD_LCD12864_DATA(lcd12864_addr) //-------------------------------------- // 管腳操作 結束 //--------------------------------------//++++++++++++++++++++++++++++++++++++++ // 函數聲明 開始 //++++++++++++++++++++++++++++++++++++++ extern void LCD12864_CheckBusy(void); extern void Lcd12864_WrCmd(alt_u8 cmd); extern void Lcd12864_WrData(alt_u8 data); extern void Lcd12864_Init(void); extern void Lcd12864_WrChar(alt_u8 row, alt_u8 col, alt_u8 *pCN, alt_u8 n); //-------------------------------------- // 函數聲明 結束 //--------------------------------------#endif /* __Amy_S_LCD12864_H__ */
2.1.2 一些說明

最后面的那個</io.h>是發布博客的時候帶出來的,不屬于頭文件。

從28行到37行,是根據SOPC Builder設置編寫的lcd12864的基地址,需要system.h的支持。注:system.h就是和SOPC Builder設置一一對應的;當在NII中建立工程時,system.h就根據sopcinfo(Nios II? 9.1 Software Build Tools for Eclipse使用,不是Nios II 9.1 IDE)文件自動生產。

第40行到第53行,是自己編寫的一些宏,這個叫Register Map(寄存器映射),以前都是單獨放在一個頭文件里(如xxx_regs.h)。由于NII 9.1貌似不支持HAL的自動初始化(我研究的結果是不行,不知道Altera公司有沒有相關的變動聲明),因此就沒有向8.1那樣書寫HAL。注意,0、1~3是OFFSET(偏移地址),請參考HDL代碼編寫。

從56行到69行,是一些管腳操作的宏,這樣寫,主要是方便移植。大家也可以不寫寄存器映射,直接寫管腳操作的宏也行,注意替換喲。

實際上大家也可以使用ARM方式的寄存器訪問方式,譬如

#define CS *(volatile unsigned *) CS_BASE // 片選信號 --低有效

這種貌似更好操作。由于我沒有深入研究這種寄存器訪問方式,這里就不多說了。

下面的幾行和各種MCU大同小異。

2.2 C源文件

2.2.1 Amy_S_lcd12864.c
/*-----版權聲明-----* 艾米電子工作室——讓開發變得更簡單 * 網站:http://www.amy-studio.com* 淘寶:http://amy-studio.taobao.com* QQ(郵箱):amy-studio@qq.com*-----文件信息-----* 文件名稱:Amy_S_lcd12864.c* 最后修改日期:3.20, 2009* 描述:Lcd12864驅動源文件*------------------* 創建者:張亞峰* 創建日期:3.20, 2009* 版本:1.0* 描述:原始版本*------------------* 修改者:* 修改日期:* 版本:* 描述:*-------------------*/#include "Amy_S_lcd12864.h" #include "alt_types.h" #include "unistd.h"void LCD12864_CheckBusy(void) {CLR_RS; // 指令SET_RW; // 讀SET_E;while((RD_DATA&0x80) == 0x80); // 檢測busy flagCLR_E;usleep(72); // 72us }void Lcd12864_WrCmd(alt_u8 cmd) {LCD12864_CheckBusy();CLR_RS; // 指令CLR_RW; // 寫SET_E;WR_DATA(cmd);CLR_E;usleep(72); // 72us }void Lcd12864_WrData(alt_u8 data) {LCD12864_CheckBusy();SET_RS; // 數據CLR_RW; // 寫SET_E;WR_DATA(data);CLR_E;usleep(72); // 72us }void Lcd12864_Init(void) {usleep(40*1000);Lcd12864_WrCmd(0x30); // 8bitusleep(100);Lcd12864_WrCmd(0x30); // basic functionusleep(37);Lcd12864_WrCmd(0x0F); // 整體顯示開 游標開 反白usleep(100);Lcd12864_WrCmd(0x10); // 游標左移usleep(100);Lcd12864_WrCmd(0x01);usleep(10*1000);Lcd12864_WrCmd(0x06); // 畫面整體右移 }void Lcd12864_WrChar(alt_u8 row, alt_u8 col, alt_u8 *pCN, alt_u8 n) {alt_u8 i, addr;row &= 0x03; // row < 4col &= 0x07; // col < 8switch(row){case 0: addr = 0x80; break;case 1: addr = 0x90; break;case 2: addr = 0x88; break;case 3: addr = 0x98; break;}addr += col;Lcd12864_WrCmd(addr);for(i=0; i<2*n; i++){Lcd12864_WrData(pCN[i]); // 寫字符數據} }
2.2.2 一些說明

呵呵,這個就不說明了,大家自己看。

?

3 使用舉例

注意:9.1環境。

3.1 在SOPC Builder中添加組件

從File-New Component..打開Component Editor,單擊HDL Files標簽,添加所編寫的HDL文件。如圖3.1所示。

圖3.1 添加HDL文件

由于所編寫的HDL完全是按照規范的,因此直接單擊Component Wizard即可,編寫IP信息,如圖3.2所示。

圖3.2 編寫IP信息

單擊Finish,IP添加成功,如圖3.3所示。

圖3.4 添加成功后的IP

3.2 在SOPC Builder中例化

這個就不多說了,直接上圖,請看圖3.5。

圖3.5 例化后的IP 1

注意lcd12864是隨便起的名字喲,只要不叫IP的名字(Ams_S_lcd12864)就行。

圖3.6? 例化后的IP 2

3.3 在Nios II中的使用范例

先將Amy_S_lcd12864.h和Amy_S_lcd12864.c拷貝到軟件工程內。

3.3.1 使用范例main.c
/*-----版權聲明-----* 艾米電子工作室——讓開發變得更簡單 * 網站:http://www.amy-studio.com* 淘寶:http://amy-studio.taobao.com* QQ(郵箱):amy-studio@qq.com*-----文件信息-----* 文件名稱:main.c* 最后修改日期:3.20, 2009* 描述:Lcd12864測試文件*------------------* 創建者:張亞峰* 創建日期:3.20, 2009* 版本:1.0* 描述:原始版本*------------------* 修改者:* 修改日期:* 版本:* 描述:*-------------------*/ #include // strlen() #include "Amy_S_lcd12864.h" // 根據SOPC Builder的設置,修改該頭文件中的Lcd12864基地址int main() {Lcd12864_Init(); // 初始化Lcd12864Lcd12864_WrChar(0, 0, "這不是單片機嗎?", strlen("這不是單片機嗎?")>>1);Lcd12864_WrChar(1, 0, "這就是單片機呀。", strlen("這就是單片機呀。")>>1);Lcd12864_WrChar(2, 0, "艾米電子出品。", strlen("艾米電子出品。")>>1);Lcd12864_WrChar(2, 0, "艾米電子出品。", strlen("艾米電子出品。")>>1);Lcd12864_WrChar(3, 0, "Amy-studio Pub.", strlen("Amy-studio Pub.")>>1);return 0; }
3.3.2 一些說明

最后面的那個</string.h>是發布博客的時候帶出來的,不屬于頭文件。

3.4 使用效果

圖3.7 Amy_S_lcd12864 IP使用效果

4 參考資料

1.李蘭英等.Nios II嵌入式軟核SOPC設計原理及應用.北京航空航天大學出版社.2006

2.周立功等.SOPC嵌入式系統實驗教程(一).北京航空航天大學出版社.2006

3.蔡偉剛.Nios II軟件架構解析.西安電子科技大學出版社.2007

4.Altera Handbook.Quartus II Handbook Volume4: SOPC Builder.2009

5.Altera Handbook.Avalon Interface Specifications.2009

6.Altera Handbook.HAL API Reference.2009

7.Altera Website.Avalon Component Interfaces Supported in the Component Editor Version 7.2 and Later

8.Altera Website..Examples of Changes to Typical Avalon Interfaces for the Component Editor Version 7.2 and Later

9. 小時不識月.七段數碼管動態顯示IP的研究及設計.(Nios II)(SOPC Builder).2009

轉載于:https://www.cnblogs.com/yuphone/archive/2010/03/25/1694547.html

總結

以上是生活随笔為你收集整理的[原创].怎样制作一个简单ip,以方便在Quartus II和Nios II中使用?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人区人妻精品一区 | 亚洲激情图 | 在线免费观看亚洲视频 | 国产精品高潮呻吟久久久 | 无码国产精品高潮久久99 | 蜜桃精品在线观看 | 国语对白做受69 | 成人黄色动漫在线观看 | 寡妇高潮一级视频免费看 | 婷婷资源网 | 成人h动漫精品一区二区下载 | 91av影院 | 日本免费在线观看视频 | 在线视频观看一区 | 特黄特色大片免费播放器使用方法 | 国产一区视频在线免费观看 | 久久久久国产精品人妻 | 色婷婷视频在线 | 欧美色综合网站 | 国产在线一级片 | 欧美亚洲国产精品 | 成人精品视频在线观看 | 大地资源高清播放在线观看 | 致命弯道8在线观看免费高清完整 | 精品亚洲精品 | 欧美视频在线一区二区三区 | 叶山小百合av一区二区 | 国产一区二区三区免费视频 | 综合久久一区 | 久久久久久久999 | 少妇被躁爽到高潮无码人狍大战 | 2019国产精品 | 亚洲综合日韩 | 亚洲天天综合网 | 亚洲产国偷v产偷v自拍涩爱 | 色多多在线看 | 久久黄网 | 偷拍亚洲欧美 | 欧美精品韩国精品 | 久久久精品人妻一区二区三区四 | 亚洲伊人天堂 | 国产专区一 | 国产jjizz一区二区三区视频 | 亚洲 欧美 激情 小说 另类 | 精品国产一区二区三区性色 | 少妇按摩一区二区三区 | 天天激情 | 黄色成年网站 | 色先锋av| 色臀av| 女人扒开腿让男人桶爽 | 欧美人与性动交α欧美精品 | 台湾swag在线播放 | 国产tv在线观看 | 久青草视频在线 | 精品国产成人av在线免 | 丁香六月色 | 亚洲校园激情 | 日本高清网站 | 91黄色小视频 | 窝窝午夜影院 | 琪琪av在线 | 亚洲熟妇无码一区二区三区 | 日本成人在线视频网站 | 国产成人久久精品麻豆二区 | 国产一区二区激情视频 | 久久精品99久久久久久 | 夜夜骑日日操 | 新红楼梦2005锦江版高清在线观看 | 午夜精品极品粉嫩国产尤物 | 91麻豆成人精品国产免费网站 | 人人人人干| 91网在线| 久久蜜桃av | 色综合久久五月 | 中国大陆一级片 | 精品人妻伦一二三区久 | 中文字幕无码精品亚洲资源网久久 | 国产三级精品在线 | 欧洲黄色片| 中文字幕av免费 | 4438五月天 | 色中文字幕| 六月综合激情 | 日韩精品人妻一区二区中文字幕 | 欧美一级片免费看 | 丁香婷婷一区二区三区 | 久久久噜噜噜久久中文字幕色伊伊 | 色综合久久久久无码专区 | 免费av福利 | 午夜激情福利在线 | 欧美色涩在线第一页 | 午夜一级在线 | 2022天天操 | 欧美性视频在线 | 精品久久久久国产 | 4虎tv| 91涩漫成人官网入口 | 另类欧美亚洲 |