想用NIOS控制片内RAM中的数据库并发控制读出到LCD显示,网上说用PIO,可是具体怎么实现呢是不?请指教

  最近想使用Nios II里的并口PIO口进行双向操作,即需要输出的时候设置为输出方向,需要输入的时候设置为输入方向。在这期间,因为没认真仔细阅读参考文档,走了一点点的弯路。下面就简单的介绍下并行输入/输出PIO。
  具有Avalon接口的并行输入/输出(parallel input/output - PIO)核,在Avalon存储器映射(Avalon Memory-Mapped Avalon-MM)从端口和通用I/O端口之间提供了一个存储器映射接口。I/O端口既可以连接片上用户逻辑,也可以连接到FPGA与外设连接的I/O引脚。
&  PIO核提供容易的I/O访问用户逻辑或外部设备,在这种情况下&位控制&的方法是有效的。下面列举了几种应用的例子:
①控制LED、②获取开关数据、③控制显示设备、④片外设备的配置与通信,例如特定应用的标准产品(ASSP)。
  每个PIO核可以提供最多32个I/O端口。像微处理器这样的智能主机通过读/写寄存器映射的Avalon-MM接口控制PIO端口。在主机控制下,PIO核捕获输入端口的数据,并驱动数据到输出端口。当PIO端口直接与I/O引脚相连时,主机通过写PIO核中的控制寄存器对I/O引脚进行三态控制。图9-1是一个基于处理器系统使用多个PIO核的例子,其中,一个用于控制LED;一个用于捕获来自片上复位请求控制逻辑的边缘;另一个控制片外LCD显示。
在集成到SOPC Builder创建的系统时,PIO核有2种用户可见功能部件。
  ①一个存储器映射的寄存器空间有4个寄存器:data、direction、interruptmask和edgecapture。
  ②1~32个I/O端口。
  I/O端口既可与FPGA内部逻辑相连接,也可驱动连接到片外设备的I/O引脚。寄存器通过Avalon-MM接口提供到I/O端口的接口。表9-2是这些寄存器的描述。在某些硬件配置中,某些不需要的寄存器不存在,读一个不存在的寄存器返回一个未定义值,而写一个不存在的寄存器无影响。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
图 &使用多个PIO核的系统实例
数据输入/输出
  PIO核的I/O端口既可以连接片上逻辑也可以连接片外逻辑,PIO核可以配置为输入、输出或双向。若用来控制双向I/O引脚,则PIO核提供具有三态控制的双向模式。
  读和写数据寄存器的硬件逻辑是独立的。读数据寄存器返回当前输入端口的值;写数据寄存器影响驱动输出端口的值。由于这些端口是独立的,因此读数据寄存器并不返回上次写入的数据。
  PIO核可配置为对输入端口进行边沿捕获(Edge Capture),它可以捕获低到高的跳变、高到低的跳变或者2种跳变均捕获。只要在输入端检测到边沿,该条件就会在edgecapture寄存器中指示。边沿的检测类型在系统创建时指明,且不能通过寄存器进行更改。
  PIO核可以配置为在不同的输入条件下产生IRQ。IRQ产生的条件可以是下面两种:
  ① Level-sensitive(电平检测) & PIO核硬件能检测一个高电平,可在核的外部插入一个&非&门来检测低电平。
  ② Edge-sensitive(边沿检测) & PIO核的边沿捕获配置决定何种边沿类型能触发IRQ。
  每个输入端口的中断可以分别屏蔽,中断屏蔽决定哪一个输入端口能产生中断。
在SOPC Builder中实例化PIO核
  设计者在SOPC Builder中使用MegaWizard向导来配置硬件特性设置。下面描述可用的选项。
  MegaWizard向导有基本设置(Basic Settings)和输入选项(Input Options)两个标签。
Basic Settings(基本设置)
&&&&&&&&&&&&&&&&&& &
  Basic Settings(基本设置)标签页允许设计者指定PIO端口的宽度和方向。
  ① Width(宽度)设置可以是1~32之间的任何整数值。如果设定值为n,则I/O端口宽为n位。
  ② Direction(方向)设置有4个选项,如下表所示。
                表 方向设置
Bidirectional (tristate) ports双向(三态)端口
在这种模式下,每个PIO位共享一个设备引脚用于驱动或捕获数据。每个引脚的方向可以分别选择。如果设置FPGA I/O引脚的方向为输入,引脚的状态为高阻三态。
Input ports only输入端口
在这种模式下,PIO端口只能捕获输入。
Both input and output ports输入/输出端口
在这种模式下,输入和输出端口总线是分开的,n位宽的单向总线。
Output ports only输出端口
在这种模式下,PIO端口只能捕获输出。
注意:第一种和第三种的区别,我们通过上图来说明。(感谢缺氧同学的提醒)
  为了将输入和输出都使用同一个引脚,我错误的先使用了第三种方式。编译完Nios II软核之后,在Quartus II中图中显示的是下图。
&&&&&&&& &(这只是顶层文件图中的一小部分)、
  从图中可以看出,正如上表里介绍的那样,在这种模式下,输入和输出端口总线是分开的。需要单独的引脚配置。
  而如果采用第一种,将PIO口设置为双向(三态),在这种模式下,每个PIO位共享一个设备引脚用于驱动或捕获数据。在Nios II 中选择好双向(三态)编译完之后,在Quartus II中图中显示的是下图。
&  从图中可以看出,输入输出可以共享于同一个引脚,具有双向性质的PIO口,还有一个小特征,画圆处的颜色是蓝色,而一般是紫色。在软件中,可以通过控制方向寄存器来选择PIO并口的控制方向。
Input Options(输入选项)
 &&&&&&&&&  
  Input Options(输入选项)页允许设计者指定边沿捕获和IRQ产生设置。如果在基本设置页中选择了Output ports only(输出端口),Input Options(输入选项)页是不可用的。
边沿捕获寄存器
Synchronously Capture(同步捕获)
  当Synchronously capture(同步捕获)打开时,PIO核包含边沿捕获寄存器, edgecapture。用户必须进一步指定边沿探测的类型:
  ①& Rising Edge(上升沿)
  ②& Falling Edge(下降沿)
  ③& Either Edge(上升下降沿)
  在输入端口,当一个指定类型的边沿出现时,边沿捕获寄存器允许核探测并且(可选)产生一个中断。
  当Synchronously capture(同步捕获)关闭时,edgecapture寄存器不存在。
Enable Bit Clearing for Edge Capture Register(边沿捕获寄存器的使能位清除)
  打开Enable bit-clearing for edge capture register(边沿捕获寄存器的使能位清除),允许你单独清除一个或多个边沿捕获寄存器中的位。为了清除给定的位,写1到边沿捕获寄存器的位。例如,为了清除边沿捕获寄存器的位6,可以写到寄存器。
  当Generate IRQ(产生IRQ)被打开,且一个指定的事件在输入端口发生时,PIO核可以断言一个IRQ输出,用户必须进一步指定IRQ事件的原因:
  ①& Level(电平)& 当一个指定的输入为高,并且在 interruptmask(中断掩码)寄存器中该输入的中断是使能的,核产生一个IRQ。
  ②& Edge(边沿)& 当在边沿捕获寄存器中一个指定的位为高,并且在interruptmask(中断掩码)寄存器中该位的中断是使能的,核产生一个IRQ。
  当Generate IRQ(产生IRQ)关闭时,interruptmask寄存器不存在。
今天的学习就到这里了。
阅读(...) 评论().sdram_clk(),
// SDRAM Clock // To do!! SDRAM Clock output
.sdram_clk(sdram_clk), // SDRAM Clock
// To do!! assign sdram clk to oDRAM0_CLK
assign oDRAM0_CLK
// SDRAM0 Clock
// To do!! assign sdram clk to oDRAM1_CLK
assign oDRAM1_CLK
// SDRAM1 Clock&
因為DE2-70有2顆SDRAM,所以要assign兩次clk。
.zs_dq_to_and_from_the_sdram(),
// SDRAM Data bus 32 Bits // To do!! SDRAM Data bus output
.zs_dq_to_and_from_the_sdram(DRAM_DQ), // SDRAM Data bus 32 Bits
因為DRAM_DQ是inout型態,不能使用wire連接,要直接連到inout port。
要如何知道SOPC System有哪些port呢?
開啟nios_ii.v,這是由SOPC Builder所產生的Verilog code,搜尋『module nios_ii (』,可以找到SOPC System的module定義,top module就是根據這裡的定義,連到DE2-70的I/O port。
Step 31:設定Reserved all unused pins As input tri-stated
Assignment -& Device
Device and Pin Options...
Unused Pins : Reserve all unused pins: As input tri-stated
這個步驟一定要做,否則Nios II無法執行,會出現以下錯誤訊息,初學者常常忽略這個步驟!!
Step 32:Import Pin Assignment
下載,其中的DE2_70_pin_assignments.csv記錄了DE2-70所有 I/O的連接腳位。
Assignments -& Import Assignments...
載入DE2_70_pin_assignments.csv,按OK繼續。
查看Pin Assignment結果
Assignments -& Assignment Editor
如下圖,表示Pin Assignment設定成功。
這個步驟也一定要做,否則Nios II無法執行,也會出現以下錯誤訊息,初學者常常忽略這個步驟!!
Step 33:設定nCEO為Use as regular I/O
Assignments –& Device
Device and Pin Options...
Dual-Purpose Pins
將nCEO改成Use as regular I/O
這是DE2-70設計上的問題,在DE2或其他的Altera的開發版並不需要如此設定。若不這樣設定,Quartus II在編譯時會出現以下錯誤訊息而編譯失敗。
Step 34:Quartus II編譯
需要2到10分鐘的時間,視CPU速度而定。
Programmer部分使用Programmer將編譯的的*.sof燒進FPGA
Step 35:啟動Programmer
按Hardware Setup,設定USB-Blaster。
選擇可用的USB-Blaster
按Start開始將*.sof燒進FPGA,當100%出現時,表示燒錄成功。
至目前為止,硬體部分結束,接下來是軟體部分。
Nios II EDS部分使用Nios II EDS開發Nios II軟體
Step 36:使用Hello Wrold測試硬體是否設計成功
Quartus II能正常編譯,不代表硬體設計成功,SOPC Builder各controller的參數設定錯誤、clk設定錯誤、top module連線錯誤、Quartus II設定錯誤...等,都可能造成Nios II無法執行,所以先用最簡單的Hello World測試硬體,若連Hello World都不能執行,軟體部分就不用繼續了,先回頭找硬體部分的bug。
右側選擇Hello World template,並指定SOPC Builder System PFT File:c:\DE2-70\hello_ucosii\nios_ii.ptf,這是先前SOPC Builder所generate的ptf檔。最後直接按Finish完成。
Nios II EDS會根據你選的project template與SOPC Builder System File產生2個project:1.hello_world_0:Nios II Software project。2.hello_world_0_syslib:Nios II System Library project。(System Library = HAL(Hardware Abstraction Layer) = BSP(Board Support Package) = Driver)
選hello_world_0,按滑鼠右鍵,選System Library Properties
將System clock timer選sys_clk_timer,另外將軟體全部跑在SDRAM,當然也可以跑在其他記憶體,只是因為SDRAM容量最大,而且SDRAM的clk需要phase shift,所以最常出現問題都是在SDRAM,所以在此特別使用SDRAM,至於其他記憶體可自行測試。
Rus As Nios II Hardware,此實Nios II軟體會透過JTAG UART傳到SDRAM開始執行。
若第一次執行,Nios II EDS會編譯整個System Library,需要一點時間,約2到3分鐘。
最後執行結果,Nios II由JTAG UART傳回Hello from Nios II到PC的Console。
若能正確執行Hello World,表示SOPC硬體正確,可以繼續軟體的開發。
Step 37測試Hello μC/OS-II
目前為止,single thread的軟體程式已經能跑在Nios II上,若要讓Nios II能跑multi thread,就必須靠OS才行,Nios II EDS已經已經巧妙的將μC/OS-II包在System Library裡面。
Step 38:開發一個多執行緒且控制硬體的程式
能成功執行Hello Wrold與Hello μC/OS-II,表示軟硬體都已經設定妥當,可以正式用C寫程式了。
再用Hello μC/OS-II template建立一個project。
將hello_ucosii.c改成如以下的程式
hello_ucosii.c / C&
1 #include &stdio.h& 2 #include "includes.h" 3 #include "system.h"
4 #include &io.h&
6 &/* Definition of Task Stacks */ 7 &#define
TASK_STACKSIZE
2048 8 OS_STK
task1_stk[TASK_STACKSIZE]; 9 OS_STK
task2_stk[TASK_STACKSIZE]; <span style="color: # <span style="color: # &/* Definition of Task Priorities */ <span style="color: # <span style="color: # &#define TASK1_PRIORITY
1<span style="color: # &#define TASK2_PRIORITY
2 <span style="color: # <span style="color: # &/* Prints "Hello World" and sleeps for three seconds */<span style="color: # void task1(void* pdata)<span style="color: # {<span style="color: #
while (<span style="color: #)<span style="color: #
{ <span style="color: #
printf("Hello uCOS-II\n");<span style="color: #
OSTimeDlyHMSM(<span style="color: #, <span style="color: #, <span style="color: #, <span style="color: #);<span style="color: #
}<span style="color: # }<span style="color: # &/* Prints "Hello World" and sleeps for three seconds */<span style="color: # void task2(void* pdata)<span style="color: # {<span style="color: #
unsigned int<span style="color: #
while (<span style="color: #)<span style="color: #
{ <span style="color: #
// read switch<span style="color: # &
i = IORD(PIO_SW_BASE, <span style="color: #);
<span style="color: #
// write ledr<span style="color: # &
IOWR(PIO_LEDR_BASE, <span style="color: #, i);<span style="color: #
}<span style="color: # }<span style="color: # &/* The main function creates two task and starts multi-tasking */<span style="color: # &int main(void)<span style="color: # {<span style="color: #
OSTaskCreateExt(task1,<span style="color: #
NULL,<span style="color: #
(void *)&task1_stk[TASK_STACKSIZE-<span style="color: #],<span style="color: #
TASK1_PRIORITY,<span style="color: #
TASK1_PRIORITY,<span style="color: #
task1_stk,<span style="color: #
TASK_STACKSIZE,<span style="color: #
NULL,<span style="color: #
<span style="color: #);<span style="color: #
OSTaskCreateExt(task2,<span style="color: #
NULL,<span style="color: #
(void *)&task2_stk[TASK_STACKSIZE-<span style="color: #],<span style="color: #
TASK2_PRIORITY,<span style="color: #
TASK2_PRIORITY,<span style="color: #
task2_stk,<span style="color: #
TASK_STACKSIZE,<span style="color: #
NULL,<span style="color: #
<span style="color: #);<span style="color: #
OSStart();<span style="color: #
return <span style="color: #;<span style="color: # }<span style="color: # <span style="color: # &
#include "system.h" #include &io.h&
system.h記載著SOPC Builder裡各controller的資訊,稍後會討論。io.h定義了IORD()與IOWR()兩個巨集,可以利用此巨集存取各controller的register。
void task1(void* pdata){
while (<span style="color: #)
printf("Hello uCOS-II\n");
OSTimeDlyHMSM(<span style="color: #, <span style="color: #, <span style="color: #, <span style="color: #);
}} void task2(void* pdata){
unsigned int
while (<span style="color: #)
// read switch
i = IORD(PIO_SW_BASE, <span style="color: #);
// write ledr
IOWR(PIO_LEDR_BASE, <span style="color: #, i);
i = IORD(PIO_SW_BASE, 0); // 讀取SW目前的值。IOWR(PIO_LEDR_BASE, 0, i);& // 將SW的值馬上給LEDR顯示。
也就是說,若SW為ON時,LEDR會亮,若SW為OFF時,LEDR就不亮。
我們是怎麼做到的呢?
我們透過IORD()巨集,去讀取pio_sw controller目前register的值,然後透過IOWR()巨集,將值寫入pio_ledr controller的register,讓LEDR顯示。
問題來了!!我們怎麼知道pio_sw與pio_ledr在哪裡?
之前#include &system.h&,我們來看看system.h的內容
開啟C:\DE2-70\hello_ucosii\software\hello_ucosii_1_syslib\Debug\system_description\system.h
#define PIO_SW_NAME "/dev/pio_sw"#define PIO_SW_TYPE "altera_avalon_pio"#define PIO_SW_BASE 0x#define PIO_SW_SPAN 16#define PIO_SW_DO_TEST_BENCH_WIRING 0#define PIO_SW_DRIVEN_SIM_VALUE 0#define PIO_SW_HAS_TRI 0#define PIO_SW_HAS_OUT 0#define PIO_SW_HAS_IN 1#define PIO_SW_CAPTURE 0#define PIO_SW_DATA_WIDTH 18#define PIO_SW_RESET_VALUE 0#define PIO_SW_EDGE_TYPE "NONE"#define PIO_SW_IRQ_TYPE "NONE"#define PIO_SW_BIT_CLEARING_EDGE_REGISTER 0#define PIO_SW_FREQ #define ALT_MODULE_CLASS_pio_sw altera_avalon_pio
#define PIO_SW_BASE 0x 定義了SOPC Builder為pio_sw所規劃的位址,而system.h也是Nios II EDS根據nios_ii.ptf所產生的。
#define PIO_LEDR_NAME "/dev/pio_ledr"#define PIO_LEDR_TYPE "altera_avalon_pio"#define PIO_LEDR_BASE 0x#define PIO_LEDR_SPAN 16#define PIO_LEDR_DO_TEST_BENCH_WIRING 0#define PIO_LEDR_DRIVEN_SIM_VALUE 0#define PIO_LEDR_HAS_TRI 0#define PIO_LEDR_HAS_OUT 1#define PIO_LEDR_HAS_IN 0#define PIO_LEDR_CAPTURE 0#define PIO_LEDR_DATA_WIDTH 18#define PIO_LEDR_RESET_VALUE 0#define PIO_LEDR_EDGE_TYPE "NONE"#define PIO_LEDR_IRQ_TYPE "NONE"#define PIO_LEDR_BIT_CLEARING_EDGE_REGISTER 0#define PIO_LEDR_FREQ #define ALT_MODULE_CLASS_pio_ledr altera_avalon_pio
#define PIO_LEDR_BASE 0x 定義了SOPC Builder為pio_ledr所規劃的位址。
設定標準輸出為LCD
透過μC/OS-II,一個thread在LCD顯示,另一個thread控制SW與LEDR。
完整程式碼下載 (一個未完成的半成品,可以根著本文一步一步完成) (最後完整的結果)
Question(這是我當時給學生的homework,各位有興趣可以自己自做做看)
1.為什麼只有SDRAM的clock需要phase shift -65度?為什其他的硬體的clk都不需要phase shift?
2.可以使用pointer,而不使用IORD()與IOWR()嗎?解釋你的理由?
#define SW (unsigned int *)SW_BASE#define LEDR (unsigned int *)LEDR_BASEvoid task2(void* pdata) {
while (<span style="color: #)
*LEDR = *SW;
3. 試著將Hello World執行在On-Chip Memory,並解釋你所使用的方法。
Conclusion對一個初學者來說,要讓Nios II能順利的在DE2-70跑起來,需要面臨很陡峭的學習曲線,因為其中有不少小trick很容易忽略而失敗。Nios II就只是這樣嗎?這只是Nios II的起手式,本系列共用4個Lab,此為第1個,第2個Lab以七段顯示器為範例,示範如何寫Slave IP,第3個Lab為Terasic的DE2_70_SD_Card_Audio_Player範例,除了實際體會HW/SW Co-Design外,將學習如何讀取SD卡,第4個Lab將實作一個數位像框,示範如何寫一個Master IP,並可直接從Flash啟動。(原創) 如何在DE2用軟體存取SDRAM? (IC Design) (DE2) (Nios II) - 真 OO无双 - 博客园
寫程式是很快樂的一件事 Since Sep.15,2006
DE2可用的記憶體有Onchip Memory、SRAM、SDRAM和Flash,之前在Nios II討論過Onchip Memory和SRAM了,這次我們來看看SDRAM。
Introduction
使用環境:Quartus II 7.2 SP1 + Nios II EDS 7.2 SP1 + MegaCore IP 7.2 SP1 + DE2(Cyclone II EP2C35F627C6)
在Altera原廠提供的,已經很清楚的介紹如何在Nios II中使用SDRAM,但有幾個遺憾:1.他是英文,2.他最後使用Nios II組合語言測試SDRAM,這和一般人使用C語言開發Nios II系統的習慣有所不同。本文將使用C語言討論。
Block Diagram
整個系統架構如上所示,除了基本的Nios II processor,以及與host computer溝通的JTAG外,剩下的周邊都必須透過Avalon bus做溝通,on-chip memory負責放C的程式碼,由於我們希望以switch作輸入,LED做輸出,須再加上PIO interface。本範例的重點在於使用SDRAM,所以必須另外加上SDRAM controller與SDRAM做溝通。
由上圖可知,除了SDRAM所需要的clock,SDRAM controller可提供所有的訊號,而SOPC Builder已經提供了SDRAM controller,所以我們唯一要操心的只剩下clock問題。
使用SOPC Builder
加入Nios II processor (Nios II/e),on-chip memory (45K),JTAG UART,System ID Peripheral,PIO for SW(width:18 bit、input ports only),PIO for LED(width:18 bit、output ports only),這些都只是基本動作,我就不再贅述,若有問題請參考:
加入SDRAM controller
加入在左側的/Altera SOPC Builder/Memories and Memory Controllers/SDRAM/SDRAM Controller
由於DE2上使用的SDRAM是1M * 16 bits * 4 banks = 8Mbytes,所以上方的Presets要選擇Custom,Data width要改成16 bits,最後可以發現下方Memory size顯示為8MBytes,表是設定正確。
可以不勾選include a functional memory model in the system testbench,這樣產生system時速度會快一點。
最後SOPC Builder設定如下
Quartus II Top Module
若要說Quartus II這個EDA工具對於Nios II開發還需要哪增加哪些支援,相信很多人抱怨的是top module,由於很多人著重於的是Nios II嵌入式系統的軟體開發,熟悉的是C語言,但top module卻要用Verilog或VHDL這種硬體描述語言,目前Quartus II並無法為我們代勞,必須自己去寫Verilog,或許Quartus II未來的版本會有所改善,但最少目前Quartus II 7.2 SP1無法逃避Verilog。
SDRAM_SW_RW.v
<span style="color: #&/*&
<span style="color: #&(C) OOMusou 2008 http://oomusou.cnblogs.com
<span style="color: #&
<span style="color: #&Filename&&& : SDRAM_SW_RW.v
<span style="color: #&Compiler&&& : Quartus II 7.2 SP1
<span style="color: #&Description : SDRAM_SW_RW top module
<span style="color: #&Release&&&& : 04/06/
<span style="color: #&*/
<span style="color: #&module SDRAM_SW_RW (
<span style="color: #&& CLOCK_50,&&&&&&&& // On Board 50 MHz
<span style="color: #&& KEY,&&&&&&&&&&&&& // Pushbutton[3:0]
<span style="color: #&& SW,&&&&&&&&&&&&&& // Toggle Switch[17:0]
<span style="color: #&& LEDR,&&&&&&&&&&&& // LED Red[17:0]
<span style="color: #&& DRAM_DQ,&&&&&&&&& // SDRAM Data bus 16 Bits
<span style="color: #&& DRAM_ADDR,&&&&&&& // SDRAM Address bus 12 Bits
<span style="color: #&& DRAM_LDQM,&&&&&&& // SDRAM Low-byte Data Mask
<span style="color: #&& DRAM_UDQM,&&&&&&& // SDRAM High-byte Data Mask
<span style="color: #&& DRAM_WE_N,&&&&&&& // SDRAM Write Enable
<span style="color: #&& DRAM_CAS_N,&&&&&& // SDRAM Column Address Strobe
<span style="color: #&& DRAM_RAS_N,&&&&&& // SDRAM Row Address Strobe
<span style="color: #&& DRAM_CS_N,&&&&&&& // SDRAM Chip Select
<span style="color: #&& DRAM_BA_0,&&&&&&& // SDRAM Bank Address 0
<span style="color: #&& DRAM_BA_1,&&&&&&& // SDRAM Bank Address 1
<span style="color: #&& DRAM_CLK,&&&&&&&& // SDRAM Clock
<span style="color: #&& DRAM_CKE&&&&&&&&& // SDRAM Clock Enable
<span style="color: #&);
<span style="color: #&
<span style="color: #&input&&&&&&&& CLOCK_50;&& // On Board 50 MHz
<span style="color: #&input& [<span style="color: #:<span style="color: #]& KEY;&&&&&&& // Pushbutton[3:0]
<span style="color: #&input& [<span style="color: #:<span style="color: #] SW;&&&&&&&& // Toggle Switch[17:0]
<span style="color: #&output [<span style="color: #:<span style="color: #] LEDR;&&&&&& // LED Red[17:0]
<span style="color: #&inout& [<span style="color: #:<span style="color: #] DRAM_DQ;&&& // SDRAM Data bus 16 Bits
<span style="color: #&output [<span style="color: #:<span style="color: #] DRAM_ADDR;& // SDRAM Address bus 12 Bits
<span style="color: #&output&&&&&&& DRAM_LDQM;& // SDRAM Low-byte Data Mask
<span style="color: #&output&&&&&&& DRAM_UDQM;& // SDRAM High-byte Data Mask
<span style="color: #&output&&&&&&& DRAM_WE_N;& // SDRAM Write Enable
<span style="color: #&output&&&&&&& DRAM_CAS_N; // SDRAM Column Address Strobe
<span style="color: #&output&&&&&&& DRAM_RAS_N; // SDRAM Row Address Strobe
<span style="color: #&output&&&&&&& DRAM_CS_N;& // SDRAM Chip Select
<span style="color: #&output&&&&&&& DRAM_BA_0;& // SDRAM Bank Address 0
<span style="color: #&output&&&&&&& DRAM_BA_1;& // SDRAM Bank Address 0
<span style="color: #&output&&&&&&& DRAM_CLK;&& // SDRAM Clock
<span style="color: #&output&&&&&&& DRAM_CKE;&& // SDRAM Clock Enable
<span style="color: #&
<span style="color: #&nios_ii_system u0 (
<span style="color: #&& // 1) global signals:
<span style="color: #&& .clk(CLOCK_50),
<span style="color: #&& .reset_n(KEY[<span style="color: #]),
<span style="color: #&& // the_ledr
<span style="color: #&& .out_port_from_the_ledr(LEDR),
<span style="color: #&& // the_sw
<span style="color: #&& .in_port_to_the_sw(SW),
<span style="color: #&& // the_sdram
<span style="color: #&& .zs_addr_from_the_sdram(DRAM_ADDR),
<span style="color: #&& .zs_ba_from_the_sdram({DRAM_BA_1, DRAM_BA_0}),
<span style="color: #&& .zs_cas_n_from_the_sdram(DRAM_CAS_N),
<span style="color: #&& .zs_cke_from_the_sdram(DRAM_CKE),
<span style="color: #&& .zs_cs_n_from_the_sdram(DRAM_CS_N),
<span style="color: #&& .zs_dq_to_and_from_the_sdram(DRAM_DQ),
<span style="color: #&& .zs_dqm_from_the_sdram(DRAM_LDQM),
<span style="color: #&& .zs_ras_n_from_the_sdram(DRAM_RAS_N),
<span style="color: #&& .zs_we_n_from_the_sdram(DRAM_WE_N)
<span style="color: #&);
<span style="color: #&
<span style="color: #&SDRAM_PLL u1 (
<span style="color: #&& .inclk0(CLOCK_50),
<span style="color: #&& .c0(DRAM_CLK)
<span style="color: #&);
<span style="color: #&
<span style="color: #&endmodule
module SDRAM_SW_RW (
& CLOCK_50,&&&&&&&& // On Board 50 MHz
& KEY,&&&&&&&&&&&&& // Pushbutton[3:0]
& SW,&&&&&&&&&&&&&& // Toggle Switch[17:0]
& LEDR,&&&&&&&&&&&& // LED Red[17:0]
& DRAM_DQ,&&&&&&&&& // SDRAM Data bus 16 Bits
& DRAM_ADDR,&&&&&&& // SDRAM Address bus 12 Bits
& DRAM_LDQM,&&&&&&& // SDRAM Low-byte Data Mask
& DRAM_UDQM,&&&&&&& // SDRAM High-byte Data Mask
& DRAM_WE_N,&&&&&&& // SDRAM Write Enable
& DRAM_CAS_N,&&&&&& // SDRAM Column Address Strobe
& DRAM_RAS_N,&&&&&& // SDRAM Row Address Strobe
& DRAM_CS_N,&&&&&&& // SDRAM Chip Select
& DRAM_BA_0,&&&&&&& // SDRAM Bank Address 0
& DRAM_BA_1,&&&&&&& // SDRAM Bank Address 1
& DRAM_CLK,&&&&&&&& // SDRAM Clock
& DRAM_CKE&&&&&&&&& // SDRAM Clock Enable
宣告top module所有的port,所有的名稱均使用DE2_pin_assignments.csv所定義的標準名稱,這樣日後只需import DE2_pin_assignments.csv即可,無須再自行撰寫tcl。
nios_ii_system u0 (
& // 1) global signals:
& .clk(CLOCK_50),
& .reset_n(KEY[<span style="color: #]),
& // the_ledr
& .out_port_from_the_ledr(LEDR),
& // the_sw
& .in_port_to_the_sw(SW),
& // the_sdram
& .zs_addr_from_the_sdram(DRAM_ADDR),
& .zs_ba_from_the_sdram({DRAM_BA_1, DRAM_BA_0}),
& .zs_cas_n_from_the_sdram(DRAM_CAS_N),
& .zs_cke_from_the_sdram(DRAM_CKE),
& .zs_cs_n_from_the_sdram(DRAM_CS_N),
& .zs_dq_to_and_from_the_sdram(DRAM_DQ),
& .zs_dqm_from_the_sdram(DRAM_LDQM),
& .zs_ras_n_from_the_sdram(DRAM_RAS_N),
& .zs_we_n_from_the_sdram(DRAM_WE_N)
建立nios_ii_system instance,並連上需要的連線,前面有提到SDRAM controller可負責SDRAM所需要的所有signal,但唯一要特別考量的是SDRAM所需要的clock,根據IS42S16400 datasheet,SDRAM所需要的clock是50MHz但須延遲3 ns,而不是DE2所提供的50MHz,這裡我們使用MegaFunction為我們產生一個SDRAM所需要的clock,你可以自己使用MegaWizard產生,或者在\DE2_CD\DE2_demonstrations\SOPC_Builder\Reference_Design\DE2_NIOS\ 將SDRAM_PLL.v複製你的project下即可。
SDRAM_PLL u1 (
& .inclk0(CLOCK_50),
& .c0(DRAM_CLK)
輸入50MHz的clock,並產生SDRAM所需要的clock。
最後也附上SDRAM_PLL.v供參考
& 1&// megafunction wizard: %ALTPLL%
& 2&// GENERATION: STANDARD
& 3&// VERSION: WM1.0
& 4&// MODULE: altpll
& 6&// ============================================================
& 7&// File Name: SDRAM_PLL.v
& 8&// Megafunction Name(s):
& 9&//&&&&&&&&&&&& altpll
<span style="color: #&// ============================================================
<span style="color: #&// ************************************************************
<span style="color: #&// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
<span style="color: #&//
<span style="color: #&// 6.0 Build 202 06/20/2006 SP 1 SJ Full Version
<span style="color: #&// ************************************************************
<span style="color: #&
<span style="color: #&
<span style="color: #&//Copyright (C)
Altera Corporation
<span style="color: #&//Your use of Altera Corporation's design tools, logic functions
<span style="color: #&//and other software and tools, and its AMPP partner logic
<span style="color: #&//functions, and any output files any of the foregoing
<span style="color: #&//(including device programming or simulation files), and any
<span style="color: #&//associated documentation or information are expressly subject
<span style="color: #&//to the terms and conditions of the Altera Program License
<span style="color: #&//Subscription Agreement, Altera MegaCore Function License
<span style="color: #&//Agreement, or other applicable license agreement, including,
<span style="color: #&//without limitation, that your use is for the sole purpose of
<span style="color: #&//programming logic devices manufactured by Altera and sold by
<span style="color: #&//Altera or its authorized distributors.& Please refer to the
<span style="color: #&//applicable agreement for further details.
<span style="color: #&
<span style="color: #&
<span style="color: #&// synopsys translate_off
<span style="color: #&`timescale <span style="color: # ps /&<span style="color: # ps
<span style="color: #&// synopsys translate_on
<span style="color: #&module SDRAM_PLL (
<span style="color: #&&&& inclk0,
<span style="color: #&&&& c0,
<span style="color: #&&&& c1,
<span style="color: #&&&& c2);
<span style="color: #&
<span style="color: #&&&& input&&&&& inclk0;
<span style="color: #&&&& output&&&&& c0;
<span style="color: #&&&& output&&&&& c1;
<span style="color: #&&&& output&&&&& c2;
<span style="color: #&
<span style="color: #&&&& wire [<span style="color: #:<span style="color: #] sub_wire0;
<span style="color: #&&&& wire [<span style="color: #:<span style="color: #] sub_wire6 =&<span style="color: #'h0;
<span style="color: #&&&& wire [<span style="color: #:<span style="color: #] sub_wire3 = sub_wire0[<span style="color: #:<span style="color: #];
<span style="color: #&&&& wire [<span style="color: #:<span style="color: #] sub_wire2 = sub_wire0[<span style="color: #:<span style="color: #];
<span style="color: #&&&& wire [<span style="color: #:<span style="color: #] sub_wire1 = sub_wire0[<span style="color: #:<span style="color: #];
<span style="color: #&&&& wire& c0 = sub_wire1;
<span style="color: #&&&& wire& c1 = sub_wire2;
<span style="color: #&&&& wire& c2 = sub_wire3;
<span style="color: #&&&& wire& sub_wire4 = inclk0;
<span style="color: #&&&& wire [<span style="color: #:<span style="color: #] sub_wire5 = {sub_wire6, sub_wire4};
<span style="color: #&
<span style="color: #&&&& altpll&&& altpll_component (
<span style="color: #&&&&&&&&&&&&&&&& .inclk (sub_wire5),
<span style="color: #&&&&&&&&&&&&&&&& .clk (sub_wire0),
<span style="color: #&&&&&&&&&&&&&&&& .activeclock (),
<span style="color: #&&&&&&&&&&&&&&&& .areset (<span style="color: #'b0),
<span style="color: #&&&&&&&&&&&&&&&& .clkbad (),
<span style="color: #&&&&&&&&&&&&&&&& .clkena ({<span style="color: #{<span style="color: #'b1}}),
<span style="color: #&&&&&&&&&&&&&&&& .clkloss (),
<span style="color: #&&&&&&&&&&&&&&&& .clkswitch (<span style="color: #'b0),
<span style="color: #&&&&&&&&&&&&&&&& .enable0 (),
<span style="color: #&&&&&&&&&&&&&&&& .enable1 (),
<span style="color: #&&&&&&&&&&&&&&&& .extclk (),
<span style="color: #&&&&&&&&&&&&&&&& .extclkena ({<span style="color: #{<span style="color: #'b1}}),
<span style="color: #&&&&&&&&&&&&&&&& .fbin (<span style="color: #'b1),
<span style="color: #&&&&&&&&&&&&&&&& .locked (),
<span style="color: #&&&&&&&&&&&&&&&& .pfdena (<span style="color: #'b1),
<span style="color: #&&&&&&&&&&&&&&&& .pllena (<span style="color: #'b1),
<span style="color: #&&&&&&&&&&&&&&&& .scanaclr (<span style="color: #'b0),
<span style="color: #&&&&&&&&&&&&&&&& .scanclk (<span style="color: #'b0),
<span style="color: #&&&&&&&&&&&&&&&& .scandata (<span style="color: #'b0),
<span style="color: #&&&&&&&&&&&&&&&& .scandataout (),
<span style="color: #&&&&&&&&&&&&&&&& .scandone (),
<span style="color: #&&&&&&&&&&&&&&&& .scanread (<span style="color: #'b0),
<span style="color: #&&&&&&&&&&&&&&&& .scanwrite (<span style="color: #'b0),
<span style="color: #&&&&&&&&&&&&&&&& .sclkout0 (),
<span style="color: #&&&&&&&&&&&&&&&& .sclkout1 ());
<span style="color: #&&&& defparam
<span style="color: #&&&&&&&& altpll_component.clk0_divide_by =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk0_duty_cycle =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk0_multiply_by =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk0_phase_shift =&"-3000",
<span style="color: #&&&&&&&& altpll_component.clk1_divide_by =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk1_duty_cycle =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk1_multiply_by =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk1_phase_shift =&"<span style="color: #",
<span style="color: #&&&&&&&& altpll_component.clk2_divide_by =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk2_duty_cycle =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk2_multiply_by =&<span style="color: #,
<span style="color: #&&&&&&&& altpll_component.clk2_phase_shift =&"<span style="color: #",
<span style="color: #&&&&&&&& altpll_component.compensate_clock =&"CLK0",
<span style="color: #&&&&&&&& altpll_component.inclk0_input_frequency =&<span style="color: #000,
<span style="color: #&&&&&&&& altpll_component.intended_device_family =&"Cyclone II",
<span style="color: #0&&&&&&&& altpll_component.lpm_type =&"altpll",
<span style="color: #1&&&&&&&& altpll_component.operation_mode =&"NORMAL",
<span style="color: #2&&&&&&&& altpll_component.pll_type =&"FAST",
<span style="color: #3&&&&&&&& altpll_component.port_activeclock =&"PORT_UNUSED",
<span style="color: #4&&&&&&&& altpll_component.port_areset =&"PORT_UNUSED",
<span style="color: #5&&&&&&&& altpll_component.port_clkbad0 =&"PORT_UNUSED",
<span style="color: #6&&&&&&&& altpll_component.port_clkbad1 =&"PORT_UNUSED",
<span style="color: #7&&&&&&&& altpll_component.port_clkloss =&"PORT_UNUSED",
<span style="color: #8&&&&&&&& altpll_component.port_clkswitch =&"PORT_UNUSED",
<span style="color: #9&&&&&&&& altpll_component.port_fbin =&"PORT_UNUSED",
<span style="color: #0&&&&&&&& altpll_component.port_inclk0 =&"PORT_USED",
<span style="color: #1&&&&&&&& altpll_component.port_inclk1 =&"PORT_UNUSED",
<span style="color: #2&&&&&&&& altpll_component.port_locked =&"PORT_UNUSED",
<span style="color: #3&&&&&&&& altpll_component.port_pfdena =&"PORT_UNUSED",
<span style="color: #4&&&&&&&& altpll_component.port_pllena =&"PORT_UNUSED",
<span style="color: #5&&&&&&&& altpll_component.port_scanaclr =&"PORT_UNUSED",
<span style="color: #6&&&&&&&& altpll_component.port_scanclk =&"PORT_UNUSED",
<span style="color: #7&&&&&&&& altpll_component.port_scandata =&"PORT_UNUSED",
<span style="color: #8&&&&&&&& altpll_component.port_scandataout =&"PORT_UNUSED",
<span style="color: #9&&&&&&&& altpll_component.port_scandone =&"PORT_UNUSED",
<span style="color: #0&&&&&&&& altpll_component.port_scanread =&"PORT_UNUSED",
<span style="color: #1&&&&&&&& altpll_component.port_scanwrite =&"PORT_UNUSED",
<span style="color: #2&&&&&&&& altpll_component.port_clk0 =&"PORT_USED",
<span style="color: #3&&&&&&&& altpll_component.port_clk1 =&"PORT_USED",
<span style="color: #4&&&&&&&& altpll_component.port_clk2 =&"PORT_USED",
<span style="color: #5&&&&&&&& altpll_component.port_clk3 =&"PORT_UNUSED",
<span style="color: #6&&&&&&&& altpll_component.port_clk4 =&"PORT_UNUSED",
<span style="color: #7&&&&&&&& altpll_component.port_clk5 =&"PORT_UNUSED",
<span style="color: #8&&&&&&&& altpll_component.port_clkena0 =&"PORT_UNUSED",
<span style="color: #9&&&&&&&& altpll_component.port_clkena1 =&"PORT_UNUSED",
<span style="color: #0&&&&&&&& altpll_component.port_clkena2 =&"PORT_UNUSED",
<span style="color: #1&&&&&&&& altpll_component.port_clkena3 =&"PORT_UNUSED",
<span style="color: #2&&&&&&&& altpll_component.port_clkena4 =&"PORT_UNUSED",
<span style="color: #3&&&&&&&& altpll_component.port_clkena5 =&"PORT_UNUSED",
<span style="color: #4&&&&&&&& altpll_component.port_enable0 =&"PORT_UNUSED",
<span style="color: #5&&&&&&&& altpll_component.port_enable1 =&"PORT_UNUSED",
<span style="color: #6&&&&&&&& altpll_component.port_extclk0 =&"PORT_UNUSED",
<span style="color: #7&&&&&&&& altpll_component.port_extclk1 =&"PORT_UNUSED",
<span style="color: #8&&&&&&&& altpll_component.port_extclk2 =&"PORT_UNUSED",
<span style="color: #9&&&&&&&& altpll_component.port_extclk3 =&"PORT_UNUSED",
<span style="color: #0&&&&&&&& altpll_component.port_extclkena0 =&"PORT_UNUSED",
<span style="color: #1&&&&&&&& altpll_component.port_extclkena1 =&"PORT_UNUSED",
<span style="color: #2&&&&&&&& altpll_component.port_extclkena2 =&"PORT_UNUSED",
<span style="color: #3&&&&&&&& altpll_component.port_extclkena3 =&"PORT_UNUSED",
<span style="color: #4&&&&&&&& altpll_component.port_sclkout0 =&"PORT_UNUSED",
<span style="color: #5&&&&&&&& altpll_component.port_sclkout1 =&"PORT_UNUSED";
<span style="color: #6&
<span style="color: #7&
<span style="color: #8&endmodule
<span style="color: #9&
<span style="color: #0&// ============================================================
<span style="color: #1&// CNX file retrieval info
<span style="color: #2&// ============================================================
<span style="color: #3&// Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0"
<span style="color: #4&// Retrieval info: PRIVATE: BANDWIDTH STRING "1.000"
<span style="color: #5&// Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "0"
<span style="color: #6&// Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz"
<span style="color: #7&// Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low"
<span style="color: #8&// Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1"
<span style="color: #9&// Retrieval info: PRIVATE: BANDWIDTH_USE_CUSTOM STRING "0"
<span style="color: #0&// Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0"
<span style="color: #1&// Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0"
<span style="color: #2&// Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0"
<span style="color: #3&// Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "1"
<span style="color: #4&// Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0"
<span style="color: #5&// Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0"
<span style="color: #6&// Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0"
<span style="color: #7&// Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0"
<span style="color: #8&// Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "e0"
<span style="color: #9&// Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "Any"
<span style="color: #0&// Retrieval info: PRIVATE: DEV_FAMILY STRING "Cyclone II"
<span style="color: #1&// Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1"
<span style="color: #2&// Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "2"
<span style="color: #3&// Retrieval info: PRIVATE: DIV_FACTOR2 NUMERIC "1"
<span style="color: #4&// Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50."
<span style="color: #5&// Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50."
<span style="color: #6&// Retrieval info: PRIVATE: DUTY_CYCLE2 STRING "50."
<span style="color: #7&// Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0"
<span style="color: #8&// Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1"
<span style="color: #9&// Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "1"
<span style="color: #0&// Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0"
<span style="color: #1&// Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575"
<span style="color: #2&// Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1"
<span style="color: #3&// Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "50.000"
<span style="color: #4&// Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz"
<span style="color: #5&// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "50.000"
<span style="color: #6&// Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1"
<span style="color: #7&// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1"
<span style="color: #8&// Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz"
<span style="color: #9&// Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1"
<span style="color: #0&// Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "0"
<span style="color: #1&// Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1"
<span style="color: #2&// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available"
<span style="color: #3&// Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0"
<span style="color: #4&// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg"
<span style="color: #5&// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "ps"
<span style="color: #6&// Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT2 STRING "ps"
<span style="color: #7&// Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0"
<span style="color: #8&// Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0"
<span style="color: #9&// Retrieval info: PRIVATE: MIRROR_CLK2 STRING "0"
<span style="color: #0&// Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "1"
<span style="color: #1&// Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "1"
<span style="color: #2&// Retrieval info: PRIVATE: MULT_FACTOR2 NUMERIC "1"
<span style="color: #3&// Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
<span style="color: #4&// Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "50."
<span style="color: #5&// Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "100."
<span style="color: #6&// Retrieval info: PRIVATE: OUTPUT_FREQ2 STRING "25."
<span style="color: #7&// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1"
<span style="color: #8&// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "1"
<span style="color: #9&// Retrieval info: PRIVATE: OUTPUT_FREQ_MODE2 STRING "1"
<span style="color: #0&// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
<span style="color: #1&// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz"
<span style="color: #2&// Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT2 STRING "MHz"
<span style="color: #3&// Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "-3."
<span style="color: #4&// Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0."
<span style="color: #5&// Retrieval info: PRIVATE: PHASE_SHIFT2 STRING "0."
<span style="color: #6&// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "ns"
<span style="color: #7&// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "ps"
<span style="color: #8&// Retrieval info: PRIVATE: PHASE_SHIFT_UNIT2 STRING "ps"
<span style="color: #9&// Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0"
<span style="color: #0&// Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0"
<span style="color: #1&// Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1"
<span style="color: #2&// Retrieval info: PRIVATE: PLL_ENA_CHECK STRING "0"
<span style="color: #3&// Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0"
<span style="color: #4&// Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0"
<span style="color: #5&// Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0"
<span style="color: #6&// Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0"
<span style="color: #7&// Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0"
<span style="color: #8&// Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0"
<span style="color: #9&// Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0"
<span style="color: #0&// Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "0"
<span style="color: #1&// Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0"
<span style="color: #2&// Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0"
<span style="color: #3&// Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0"
<span style="color: #4&// Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000"
<span style="color: #5&// Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz"
<span style="color: #6&// Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500"
<span style="color: #7&// Retrieval info: PRIVATE: SPREAD_USE STRING "0"
<span style="color: #8&// Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0"
<span style="color: #9&// Retrieval info: PRIVATE: STICKY_CLK0 STRING "1"
<span style="color: #0&// Retrieval info: PRIVATE: STICKY_CLK1 STRING "1"
<span style="color: #1&// Retrieval info: PRIVATE: STICKY_CLK2 STRING "1"
<span style="color: #2&// Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1"
<span style="color: #3&// Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1"
<span style="color: #4&// Retrieval info: PRIVATE: USE_CLK0 STRING "1"
<span style="color: #5&// Retrieval info: PRIVATE: USE_CLK1 STRING "1"
<span style="color: #6&// Retrieval info: PRIVATE: USE_CLK2 STRING "1"
<span style="color: #7&// Retrieval info: PRIVATE: USE_CLKENA0 STRING "0"
<span style="color: #8&// Retrieval info: PRIVATE: USE_CLKENA1 STRING "0"
<span style="color: #9&// Retrieval info: PRIVATE: USE_CLKENA2 STRING "0"
<span style="color: #0&// Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0"
<span style="color: #1&// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
<span style="color: #2&// Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "1"
<span style="color: #3&// Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50"
<span style="color: #4&// Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "1"
<span style="color: #5&// Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "-3000"
<span style="color: #6&// Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "1"
<span style="color: #7&// Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50"
<span style="color: #8&// Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "2"
<span style="color: #9&// Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0"
<span style="color: #0&// Retrieval info: CONSTANT: CLK2_DIVIDE_BY NUMERIC "2"
<span style="color: #1&// Retrieval info: CONSTANT: CLK2_DUTY_CYCLE NUMERIC "50"
<span style="color: #2&// Retrieval info: CONSTANT: CLK2_MULTIPLY_BY NUMERIC "1"
<span style="color: #3&// Retrieval info: CONSTANT: CLK2_PHASE_SHIFT STRING "0"
<span style="color: #4&// Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0"
<span style="color: #5&// Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "20000"
<span style="color: #6&// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone II"
<span style="color: #7&// Retrieval info: CONSTANT: LPM_TYPE STRING "altpll"
<span style="color: #8&// Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL"
<span style="color: #9&// Retrieval info: CONSTANT: PLL_TYPE STRING "FAST"
<span style="color: #0&// Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED"
<span style="color: #1&// Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_UNUSED"
<span style="color: #2&// Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED"
<span style="color: #3&// Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED"
<span style="color: #4&// Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED"
<span style="color: #5&// Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED"
<span style="color: #6&// Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED"
<span style="color: #7&// Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED"
<span style="color: #8&// Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED"
<span style="color: #9&// Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_UNUSED"
<span style="color: #0&// Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED"
<span style="color: #1&// Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED"
<span style="color: #2&// Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED"
<span style="color: #3&// Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED"
<span style="color: #4&// Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED"
<span style="color: #5&// Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED"
<span style="color: #6&// Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED"
<span style="color: #7&// Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED"
<span style="color: #8&// Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED"
<span style="color: #9&// Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED"
<span style="color: #0&// Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED"
<span style="color: #1&// Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_USED"
<span style="color: #2&// Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED"
<span style="color: #3&// Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED"
<span style="color: #4&// Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED"
<span style="color: #5&// Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED"
<span style="color: #6&// Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED"
<span style="color: #7&// Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED"
<span style="color: #8&// Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED"
<span style="color: #9&// Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED"
<span style="color: #0&// Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED"
<span style="color: #1&// Retrieval info: CONSTANT: PORT_enable0 STRING "PORT_UNUSED"
<span style="color: #2&// Retrieval info: CONSTANT: PORT_enable1 STRING "PORT_UNUSED"
<span style="color: #3&// Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED"
<span style="color: #4&// Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED"
<span style="color: #5&// Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED"
<span style="color: #6&// Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED"
<span style="color: #7&// Retrieval info: CONSTANT: PORT_extclkena0 STRING "PORT_UNUSED"
<span style="color: #8&// Retrieval info: CONSTANT: PORT_extclkena1 STRING "PORT_UNUSED"
<span style="color: #9&// Retrieval info: CONSTANT: PORT_extclkena2 STRING "PORT_UNUSED"
<span style="color: #0&// Retrieval info: CONSTANT: PORT_extclkena3 STRING "PORT_UNUSED"
<span style="color: #1&// Retrieval info: CONSTANT: PORT_sclkout0 STRING "PORT_UNUSED"
<span style="color: #2&// Retrieval info: CONSTANT: PORT_sclkout1 STRING "PORT_UNUSED"
<span style="color: #3&// Retrieval info: USED_PORT: @clk 0 0 6 0 OUTPUT_CLK_EXT VCC "@clk[5..0]"
<span style="color: #4&// Retrieval info: USED_PORT: @extclk 0 0 4 0 OUTPUT_CLK_EXT VCC "@extclk[3..0]"
<span style="color: #5&// Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0"
<span style="color: #6&// Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1"
<span style="color: #7&// Retrieval info: USED_PORT: c2 0 0 0 0 OUTPUT_CLK_EXT VCC "c2"
<span style="color: #8&// Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0"
<span style="color: #9&// Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0
<span style="color: #0&// Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0
<span style="color: #1&// Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1
<span style="color: #2&// Retrieval info: CONNECT: c2 0 0 0 0 @clk 0 0 1 2
<span style="color: #3&// Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0
<span style="color: #4&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL.v TRUE FALSE
<span style="color: #5&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL.inc FALSE FALSE
<span style="color: #6&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL.cmp FALSE FALSE
<span style="color: #7&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL.bsf FALSE FALSE
<span style="color: #8&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL_inst.v FALSE FALSE
<span style="color: #9&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL_bb.v FALSE FALSE
<span style="color: #0&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL_waveforms.html FALSE FALSE
<span style="color: #1&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL_wave*.jpg FALSE FALSE
<span style="color: #2&// Retrieval info: GEN_FILE: TYPE_NORMAL SDRAM_PLL.ppf TRUE FALSE
<span style="color: #3&
最後的pin assignment、compiling、programmer部分我就不在多言。
Nios II軟體部分
在Nios II EDS建立一個Hello World project,請參考
hello_world.c
&2&(C)&OOMusou&2008&http://oomusou.cnblogs.com
&4&Filename&&&&:&hello_world.c
&5&Compiler&&&&:&gcc
&6&Description&:&Demo&how&to&read&/&write&SDRAM
&7&Release&&&&&:&04/09/
&9&#include&"system.h"
<span style="color: #&#include&&io.h&
<span style="color: #&
<span style="color: #&int&main()&{
<span style="color: #&&&while(<span style="color: #)&{
<span style="color: #&&&&&//&method&1
<span style="color: #&&&&&//&read&switch&
<span style="color: #&&&&&unsigned&int&i&=&IORD(SW_BASE,&<span style="color: #);&&
<span style="color: #&&&&&unsigned&int&j&=&<span style="color: #;
<span style="color: #&&&&&&
<span style="color: #&&&&&IOWR(SDRAM_BASE,&<span style="color: #,&i);
<span style="color: #&&&&&j&=&IORD(SDRAM_BASE,&<span style="color: #);
<span style="color: #&&&&&
<span style="color: #&&&&&//&write&ledr
<span style="color: #&&&&&IOWR(LEDR_BASE,&<span style="color: #,&j);
<span style="color: #&&&}
<span style="color: #&}
<span style="color: #&
想做的事情很簡單,LEDR會根據switch的撥動而做不同的顯示,但這裡做了小小的改變,我故意將switch讀到的值利用IOWR(SDRAM_BASE, 0, i)存入SDRAM,然後再用IORD(SDRAM_BASE, 0)從SDRAM讀出,最後透過IOWR(LEDR_BASE, 0)顯示LEDR,總之,有了SDRAM controller之後,C語言也能利用IORD()與IOWR()對SDRAM做讀寫。
要在Nios II系統利用C語言讀寫SDRAM並不難,只要透過SDRAM controller即可,但由於SDRAM所需要的clock不同,所以還需要SDRAM_PLL去調整clock,這是SDRAM與on-chip memory、SRAM不同之處。
完整程式碼下載
張志剛, 2007, FPGA與SOPC設計教程--DE2實踐, 西安電子科技大學出版社

我要回帖

更多关于 shiro数据权限控制 的文章

 

随机推荐