avalon總線與接口.doc_第1頁(yè)
avalon總線與接口.doc_第2頁(yè)
avalon總線與接口.doc_第3頁(yè)
avalon總線與接口.doc_第4頁(yè)
avalon總線與接口.doc_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余13頁(yè)可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Avalon總線IP核的定制-(深入了解軟件編程的奧秘)NIOS II是一個(gè)建立在FPGA上的嵌入式軟核處理器,除了可以根據(jù)需要任意添加已經(jīng)提供的外設(shè)外,用戶還可以通過定制用戶邏輯外設(shè)和定制用戶指令來實(shí)現(xiàn)各種應(yīng)用要求。這節(jié)我們就來研究如何定制基于Avalon總線的用戶外設(shè)。 SOPC Builder提供了一個(gè)元件編輯器,通過這個(gè)元件編輯器我們就可以將我們自己寫的邏輯封裝成一個(gè)SOPC Builder元件了。下面,我們就以PWM實(shí)驗(yàn)為例,詳細(xì)介紹一下定制基于Avalon總線的用戶外設(shè)的過程。 我們要將的PWM是基于Avalon總線中的Avalon Memory Mapped Interface (Avalon-MM),而Avalon總線還有其他類型的設(shè)備,比如Avalon Streaming Interface (Avalon-ST)、Avalon Memory Mapped Tristate Interface等等,在這里我就不詳細(xì)敘述了,需要進(jìn)一步了解的請(qǐng)參考ALTERA公司的Avalon Interface Specifications(mnl_avalon_spec.pdf)。 Avalon-MM接口是內(nèi)存映射系統(tǒng)下的用于主從設(shè)備之間的讀寫的接口,下圖就是一個(gè)基于Avalon-MM的主從設(shè)備系統(tǒng)。而我們這節(jié)需要做的就是下圖高亮部分。他的地位與UART,RAM Controller等模塊并駕齊驅(qū)的。 Avalon-MM接口有很多特點(diǎn),其中最大的特點(diǎn)就是根據(jù)自己的需求自由選擇信號(hào)線,不過里面還是有一些要求的。建議大家在看本文之前,先看一遍Avalon Interface Specifications,這樣就能對(duì)Avalon-MM接口有一個(gè)整體的了解。 下圖為Avalon-MM外設(shè)的一個(gè)結(jié)構(gòu)圖, 理論的就說這些,下面我們舉例來具體說明,讓大家可以更好的理解。構(gòu)建HDL 我們這一節(jié)是PWM為例,所以首先,我們要構(gòu)建一個(gè)符合Avalon-MM Slave接口規(guī)范的可以實(shí)現(xiàn)PWM功能的時(shí)序邏輯,在這里,我們利用Verilog語(yǔ)言來編寫。在程序中會(huì)涉及到Avalon信號(hào),在這里,我們說明一下這些信號(hào)(其中,方向以從設(shè)備為基準(zhǔn))HDL中的信號(hào) Avalon信號(hào)類型 寬度 方向 描述 clkclk1input同步時(shí)鐘信號(hào)reset_nreset_n1input復(fù)位信號(hào),低電平有效chipselectchipselect1input片選信號(hào)addressaddress2input2位地址,譯碼后確定寄存器offsetwritewrite1input寫使能信號(hào)writedatawritedata32input32位寫數(shù)據(jù)值readread1input讀時(shí)能信號(hào)byteenablebyteenable1input字節(jié)使能信號(hào)readdatareaddata32output32位讀數(shù)據(jù)值此外,程序中還包括一個(gè)PWM_out信號(hào),這個(gè)信號(hào)是PWM輸出,不屬于Avalon接口信號(hào)。 PWM內(nèi)部還包括使能控制寄存器、周期設(shè)定寄存器以及占空比設(shè)置寄存器。設(shè)計(jì)中將各寄存器映射成Avalon Slave端口地址空間內(nèi)一個(gè)單獨(dú)的偏移地址。沒個(gè)寄存器都可以進(jìn)行讀寫訪問,軟件可以讀回寄存器中的當(dāng)前值。寄存器及偏移地址如下:寄存器名 偏移量 訪問屬性 描述 clock_divide_reg00讀/寫設(shè)定PWM輸出周期的時(shí)鐘數(shù)duty_cycle_reg01讀/寫設(shè)定一個(gè)周期內(nèi)PWM輸出低電平的始終個(gè)數(shù)control_reg10讀/寫使能和關(guān)閉PWM輸出,為1時(shí)使能PWM輸出程序如下:view sourceprint?001module PWM(002 clk,003 reset_n,004 chipselect,005 address,006 write,007 writedata,008 read,009 byteenable,010 readdata,011 PWM_out);012 013input clk;014input reset_n;015input chipselect;016input 1:0address;017input write;018input 31:0 writedata;019input read;020input 3:0 byteenable;021output 31:0 readdata;022output PWM_out;023 024reg 31:0 clock_divide_reg; 025reg 31:0 duty_cycle_reg; 026reg control_reg;027reg clock_divide_reg_selected;028reg duty_cycle_reg_selected;029reg control_reg_selected;030reg 31:0 PWM_counter;031reg 31:0 readdata;032reg PWM_out;033wire pwm_enable;034 035/地址譯碼 036always (address)037begin038 clock_divide_reg_selected=0;039 duty_cycle_reg_selected=0;040 control_reg_selected=0;041 case(address)042 2b00:clock_divide_reg_selected=1;043 2b01:duty_cycle_reg_selected=1;044 2b10:control_reg_selected=1;045 default:046 begin047 clock_divide_reg_selected=0;048 duty_cycle_reg_selected=0;049 control_reg_selected=0;050 end051 endcase052end 053 054/寫PWM輸出周期的時(shí)鐘數(shù)寄存器 055always (posedge clk or negedge reset_n)056begin057 if(reset_n=1b0)058 clock_divide_reg=0;059 else060 begin061 if(write & chipselect & clock_divide_reg_selected)062 begin063 if(byteenable0)064 clock_divide_reg7:0=writedata7:0;065 if(byteenable1)066 clock_divide_reg15:8=writedata15:8;067 if(byteenable2)068 clock_divide_reg23:16=writedata23:16;069 if(byteenable3)070 clock_divide_reg31:24=writedata31:24;071 end072 end073end074 075/寫PWM周期占空比寄存器 076always (posedge clk or negedge reset_n)077begin078 if(reset_n=1b0)079 duty_cycle_reg=0;080 else081 begin082 if(write & chipselect & duty_cycle_reg_selected)083 begin084 if(byteenable0)085 duty_cycle_reg7:0=writedata7:0;086 if(byteenable1)087 duty_cycle_reg15:8=writedata15:8;088 if(byteenable2)089 duty_cycle_reg23:16=writedata23:16;090 if(byteenable3)091 duty_cycle_reg31:24=writedata31:24;092 end093 end094end095 096/寫控制寄存器 097always (posedge clk or negedge reset_n)098begin099 if(reset_n=1b0)100 control_reg=0;101 else102 begin103 if(write & chipselect & control_reg_selected)104 begin105 if(byteenable0)106 control_reg=writedata0;107 end108 end109end110 111/讀寄存器 112always (address or read or clock_divide_reg or duty_cycle_reg or control_reg or chipselect)113begin114 if(read & chipselect)115 case(address)116 2b00:readdata=clock_divide_reg;117 2b01:readdata=duty_cycle_reg;118 2b10:readdata=clock_divide_reg)136 PWM_counter=0;137 else138 PWM_counter=PWM_counter+1;139 end140 else141 PWM_counter=0;142 end143end 144 145always (posedge clk or negedge reset_n)146begin147 if(reset_n=1b0)148 PWM_out=1b0;149 else150 begin151 if(pwm_enable)152 begin153 if(PWM_counter=duty_cycle_reg)154 PWM_out=1b1;155 else156 PWM_out=1b0;157 end158 else159 PWM_out=1b0;160 end161end162 163endmodule上面的程序保存好以后,命名為PWM.v,并將其存放到工程目錄下。硬件設(shè)置 接下來,我們就通過SOPC Builder,來建立PWM模塊了。首先,打開Quartus軟件,進(jìn)入SOPC Builder。進(jìn)入后,點(diǎn)擊下圖紅圈處點(diǎn)擊后,如下圖所示,點(diǎn)擊Next,點(diǎn)擊后,如下圖所示,點(diǎn)擊下圖紅圈處,將我們剛才建立的PWM.v加進(jìn)來。(我將PWM。v放到了工程目錄下的pwm文件夾下)加入后,系統(tǒng)會(huì)對(duì)PWM.v文件進(jìn)行分析,如下圖所示,出現(xiàn)紅圈處的文字,說明分析成功,點(diǎn)擊close,關(guān)閉對(duì)話框。然后點(diǎn)擊Next,如下圖所示,通過下圖,我們可以看到,PWM.v中的信號(hào)都出現(xiàn)在這里面了。我們可以根據(jù)我們的功能要求來配置這些信號(hào),其中,Interface是Avalon接口類型 ,它包括Avalon-MM、Avalon-ST、Avalon Memory Mapped Tristate Interface等等。Signal Type指的是各個(gè)Avalon接口類型下的信號(hào)類型。PWM.v中的信號(hào)我們已經(jīng)在前面都介紹過了,大家按照上面的要求設(shè)置就可以了。默認(rèn)情況只有PWM_out需要改動(dòng),如下圖示紅圈處設(shè)置,其中,Interface在下拉菜單中選擇下圖紅圈處所示的選項(xiàng)。上面的選項(xiàng)都設(shè)置好以后,點(diǎn)擊Next,如下圖所示,我們通過下圖紅圈處的下拉條向下拉拉到下圖所示位置停止,我們將紅圈處的改選為NATIVE,這個(gè)地方就是地址對(duì)齊的選項(xiàng),我們選擇為靜態(tài)地址對(duì)齊。其他的地方都默認(rèn),不需要改動(dòng)。 這里面還有很多選項(xiàng),其中Timing部分需要說明一下,PWM的Avalon Slave端口與Avalon Slave端口時(shí)鐘信號(hào)同步,讀/寫時(shí)的建立很保持時(shí)間為0,因?yàn)樽x、寫寄存器僅需要一個(gè)時(shí)鐘周期,所以讀/寫時(shí)為0等待切不需要讀延時(shí)。接著點(diǎn)擊Next,如下圖所示,其中紅圈處需要注意,這個(gè)地方需要可以建立新組,然后在SOPC Builder中體現(xiàn)出來。點(diǎn)擊Finish后,會(huì)出現(xiàn)下面的對(duì)話框,點(diǎn)擊Yes,就會(huì)生成一個(gè)PWM_hw.tcl腳本文件,大家可以打開看一下,里面放置的是剛才我們配置PWM時(shí)候的配置信息。上面都完成以后,我們回到了SOPC Builder界面,我們?cè)谧髠?cè)邊欄中可以找到下圖所示的紅圈處大家看到了吧,MyIP就是我們剛才建立的group。雙擊PWM,我們建立PWM模塊,如下圖點(diǎn)擊Finish,完成建立。這里還需要設(shè)置一步,點(diǎn)擊下圖紅圈處點(diǎn)擊后,如下圖所示,點(diǎn)擊IP Serarch Path,然后點(diǎn)擊Add,添加PWM.v所在位置的路徑添加后,如下圖所示 點(diǎn)擊Finish完成。設(shè)置這個(gè)選項(xiàng)是為了讓SOPC Builder可以找到PWM.v的位置。不然就會(huì)出現(xiàn)下次你進(jìn)入SOPC Builder的時(shí)候PWM模塊無效的問題。接下來的工作就是自動(dòng)分配地址,分配中斷,編譯,等待. 編譯好以后,我們回到Quartus軟件界面,我們可以看到,PWM出現(xiàn)了,我將它接到了一個(gè)LED上了,我們可以通過PWM改變LED的亮度,實(shí)現(xiàn)LED漸亮漸滅的過程。接下來又是編譯,等待. 做好硬件部分工作以后,我們打開NIOS IDE,開始軟件編程部分。軟件開發(fā) 首先對(duì)工程重新編譯一次,Ctril+B,等待. 編譯好以后,我們來看一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論