[原创][连载].基于SOPC的简易数码相框 – Quartus II部分(硬件部分)

开发环境

硬件:艾米电子EP2C8 FPGA/Nios II核心板;Altera USB-Blaster;2.4寸TFT-LCD模块;SD卡模块
软件:Windows XP;Quartus II 10.0;Nios II 10.0 Software Build Tools for Eclipse

基本步骤

自底向上模式。

步骤1 在Quatus II新建一个工程

如何新建Quartus II工程,请参阅http://www.cnblogs.com/yuphone/archive/2010/08/21/1805388.html

image

步骤2 设置未用引脚为三态输入

(良好的习惯,必须养成)Assignments>Device>Device and Pin Options…>Unused pins

image 

步骤3 例化一个锁相环

由于SDRAM的时钟需要滞后Nios II软核的时钟,所以需要使用锁相环。具体的相移原理,请参阅http://www.altera.com/literature/ug/ug_embedded_ip.pdf的章节。

image
如何在Quartus II中使用PLL,请参阅http://www.altera.com/literature/ug/ug_altpll.pdf

image 指定锁相环输入时钟的特性。

image

image 打开异步复位选项及稳定后锁定选项。选项有什么用?请参阅http://www.altera.com/literature/ug/ug_altpll.pdf

image

image 配置输出时钟c0(Nios II系统时钟)和c1(SDRAM时钟)。

image

image

注意上面那个-3.5ns的相移,具体的相移原理,请参阅http://www.altera.com/literature/ug/ug_embedded_ip.pdf的章节。

image打开生成HDL例化模板选项(非常重要,且好用)。

image

配置完的PLL框图如下所示。

image

步骤4 创建及配置一个Nios II软核系统

1 打开SOPC Builder。

从哪打开,怎么用?请参阅http://www.altera.com/literature/ug/ug_sopcbuilder.pdf

配置软核系统的目标硬件家族及输入时钟。

image

板载时钟为50MHz,经过PLL倍频到100MHz,下面软核系统的组件基本上都是运行在这个时钟下。输入时钟一定要认真配置,否则Nios II软件部分的延时不准,且一些组件无法正常工作。当然也可以配置n个输入时钟,不同的组件可以使用不同的时钟。

2 配置最小系统

包含cpu(Nios II软核)、ram(SDRAM或SSRAM或SRAM)、flash(EPCS FLASH或者CFI Flash)、jtag_uart(JTAG调试)以及sysid(软核标识)。以上五个部分,最好一个不落的例化到系统中;否则不良结果后果自负。重点组件的配置我会稍微说明的,其他组件自行研究(一般缺省设置)。

image

4 配置SDRAM选项。

此处使用的HY57V641620FTP-6,容量为8MB,资料请自行查找阅读。按器件手册说明正确选择数据总线宽度、片选数、块数、行数和列数。

image

选择CAS的消隐周期为3,其他参数缺省不动(或仔细阅读器件手册,酌情修改)。

image

5 配置Nios II软核

选择Nios II/f。三个版本的区别,请参阅http://www.altera.com/literature/hb/nios2/n2cpu_nii5v1.pdf

image

配置硬件乘法及硬件除法。缺省情况下,乘法和除法都是Nios II软件实现的。

缺省情况image

既然Cyclone II有硬件乘法器,不用白不用,按如下配置。关于硬件乘法和软件乘法的效率请参阅http://www.altera.com/literature/hb/nios2/n2cpu_nii5v1.pdf。一般情况下,乘法映射到软件中的速度最慢,LE次之,硬件乘法器就快一点,DSP Block最快,可惜Cyclone II没有DSP Block,只有硬件乘法器。硬件除法嘛,因为Cyclone II没有硬件除法器,那么选择硬件除法后,只能用LE来实现;速度较软件实现改善了许多。

image

配置复位向量及异常向量。有一个原则,复位向量最好映射到Flash里面(不隐射到Flash,就无法实现上电复位),异常向量必须映射到RAM里面(必须哟,千万不要映射到Flash里面)。这是为什么呢?请参阅http://www.altera.com/literature/hb/nios2/n2cpu_nii5v1.pdf

image

配置缓存及存储器接口。此处缺省即可。数据缓存和地址缓存的功用请参阅http://www.altera.com/literature/hb/nios2/n2cpu_nii5v1.pdf。感兴趣的朋友可以研究下紧耦合存储器,性能相当强悍,呵呵。

image

配置JTAG调试模块。有一个USB-Blaster就可以使用JTAG调试Nios II软核,多么令人欢喜的消息,更欢喜的是,USB-Blaster才50块钱。调试器有四个等级,此处选择等级1,其他等级请自行研究。

image

配置自定义指令,此处一个没用。Nios II软核最强大的地方就是自定义指令。Altera提供了4个自定义指令。其中硬件浮点最诱人,不过需要消耗大约4000LE,我们艾米电子的2C8资源有限,消受不起。3C10的朋友可以试试这个自定义指令,非常强悍。如何自定义指令,请参阅http://www.altera.com.cn/support/examples/nios2/exm-crc-acceleration.html

image 

6 配置定时器组件

如何使用,请参阅:

http://www.cnblogs.com/yuphone/archive/2010/04/18/1714554.html
http://www.cnblogs.com/yuphone/archive/2010/04/18/1714628.html
http://www.cnblogs.com/yuphone/archive/2010/04/19/1715525.html
http://www.cnblogs.com/yuphone/archive/2010/11/25/1887621.html

sys_clk_timer,image
high_res_timer是image ,可做定时器中断应用或做Timestamp应用;
watchdog_timer是image ,其功用就不用我言说了。

虽然上面的三个定时器在本设计中都未使用,但是为了更好的扩展,加上比较好。

image

7 配置流水桥

流水桥的功用请参阅http://www.altera.com.cn/support/examples/nios2/exm-high-perf-bridge.html

在SOPC Builder中例化pipeline_bridge之后,会出来两个总线,s1(主端)与Nios II CPU相连,m1(从端)与需要“过桥”的组件的相连。

image

配置流水桥相关选项。

image 

8 配置GPIO——ILI9325

本设计中,所有的GPIO的s1(主端),都挂在流水桥上。

配置ILI9325引脚。

image

怎么搭桥呢?我以ili_db为例。当添加了GPIO——ili_db后,在ili_db左边就会出现3个桥供选择。可以清楚的看到,这三座桥依次(从左到右)为Nios II cpu的指令主端、Nios II cpu的指令从端和流水桥的从端。

image image

现在GPIO想要过流水桥,就把与流水桥从端相连的那个点选上即可。这样ili_db就过桥了,其他类似。

image

注意ili9325的各总线及引脚的配置。

ili_db,ili9325的8位数据总线(16位及18位的数据总线与之类似),按下图配置(8位双向口):

image 

ili_nrst,ili9325的硬件复位信号引脚(低电平有效);
ili_ncs,ili9325的片选信号引脚(低电平有效);
ili_rs,ili9325的指令 /数据选择信号引脚;
ili_nwr,ili9325的写控制信号引脚(低电平有效);
ili_nrd,ili9325的读控制信号引脚(低电平有效)。

以上五个引脚全部按下图配置(一位输出口):

image

9 配置GPIO——ADS7843

此处并没有使用Altera提供的三线SPI总线组件,而是使用GPIO模拟SPI总线。配置方法和ILI9325类似。

image

需要注意的是,ads_nirq,ads7843的笔触中断信号引脚,需要设置为下降沿触发中断。

image image

10 配置GPIO——SD卡

选用的SD模块使用的1线SD协议,即SPI协议。

此处并没有使用Altera提供的三线SPI总线组件,而是使用GPIO模拟SPI总线。配置方法和ILI9325类似。

image

完成以上十步后,编译。不会编译?请参阅http://www.cnblogs.com/yuphone/archive/2010/05/07/1729752.html

步骤5 使用HDL描述Quartus II顶层模块

例化PLL和Nios II模块时,请使用HDL例化模板文件,比如pll模块的例化模板pll_inst.v,nios软核模块的例化模块nios_ii_sys_inst.v。要善用模板来快速例化模块。怎么例化?回去看书去!

代码 顶层模块

module lcd_at_nios( 
  input         CLOCK_50,
  input         Q_KEY,
  // ILI9325 Interface
  output        ILI_nRST,
  output        ILI_nCS,
  output        ILI_RS,
  output        ILI_nRD,
  output        ILI_nWR,
  inout  [ 7:0] ILI_DB,
  // ADS7803 Interface
  output        ADS_CLK,
  output        ADS_nCS,
  output        ADS_DIN,
  input         ADS_DOUT,
  input         ADS_BUSY,
  input         ADS_nIRQ,
  // SD Card Interface
  output        SD_CLK,
  output        SD_nCS,
  output        SD_DIN,
  input         SD_DOUT, 
  // SDRAM Interface
  output [11:0] SDRAM_ADDR,
  output [1 :0] SDRAM_BA,
  output        SDRAM_CAS_N,
  output        SDRAM_CLK,
  output        SDRAM_CKE,
  output        SDRAM_CS_N,
  inout  [15:0] SDRAM_DQ,
  output [ 1:0] SDRAM_DQM,
  output        SDRAM_RAS_N,
  output        SDRAM_WE_N
);

wire nii_clk, pll_locked; 
pll  pll_inst (
  .areset (~Q_KEY),
  .inclk0 (CLOCK_50),
  .c0     (nii_clk),
  .c1     (SDRAM_CLK),
  .locked (pll_locked)
);

nios_ii_sys nios_ii_sys_inst
(
  //
  .clk_100                           (nii_clk),
  .reset_n                           (Q_KEY & pll_locked),
  // ADS7803 Interface                           
  .in_port_to_the_ads_busy           (ADS_BUSY),
  .in_port_to_the_ads_dout           (ADS_DOUT),
  .in_port_to_the_ads_nirq           (ADS_nIRQ),
  .out_port_from_the_ads_clk         (ADS_CLK),
  .out_port_from_the_ads_din         (ADS_DIN),
  .out_port_from_the_ads_ncs         (ADS_nCS),
  // ILI9325 Interface
  .bidir_port_to_and_from_the_ili_db (ILI_DB),  
  .out_port_from_the_ili_ncs         (ILI_nCS),
  .out_port_from_the_ili_nrd         (ILI_nRD),
  .out_port_from_the_ili_nrst        (ILI_nRST),
  .out_port_from_the_ili_rs          (ILI_RS),
  .out_port_from_the_ili_nwr         (ILI_nWR),
  // SD Card Interface
  .out_port_from_the_sd_clk          (SD_CLK),
  .out_port_from_the_sd_din          (SD_DIN),
  .out_port_from_the_sd_ncs          (SD_nCS),
  .in_port_to_the_sd_dout            (SD_DOUT),
  // SDRAM Interface                      
  .zs_addr_from_the_sdram            (SDRAM_ADDR),
  .zs_ba_from_the_sdram              (SDRAM_BA),
  .zs_cas_n_from_the_sdram           (SDRAM_CAS_N),
  .zs_cke_from_the_sdram             (SDRAM_CKE),
  .zs_cs_n_from_the_sdram            (SDRAM_CS_N),
  .zs_dq_to_and_from_the_sdram       (SDRAM_DQ),
  .zs_dqm_from_the_sdram             (SDRAM_DQM),
  .zs_ras_n_from_the_sdram           (SDRAM_RAS_N),
  .zs_we_n_from_the_sdram            (SDRAM_WE_N)
);

endmodule

代码 锁相环模块的例化模板

pll    pll_inst (
    .areset ( areset_sig ),
    .inclk0 ( inclk0_sig ),
    .c0 ( c0_sig ),
    .c1 ( c1_sig ),
    .locked ( locked_sig )
    );

代码 nios软核模块的例化模板

  //Example instantiation for system 'nios_ii_sys'
  nios_ii_sys nios_ii_sys_inst
    (
      .bidir_port_to_and_from_the_ili_db (bidir_port_to_and_from_the_ili_db),
      .clk_100                           (clk_100),
      .in_port_to_the_ads_busy           (in_port_to_the_ads_busy),
      .in_port_to_the_ads_dout           (in_port_to_the_ads_dout),
      .in_port_to_the_ads_nirq           (in_port_to_the_ads_nirq),
      .in_port_to_the_sd_dout            (in_port_to_the_sd_dout),
      .out_port_from_the_ads_clk         (out_port_from_the_ads_clk),
      .out_port_from_the_ads_din         (out_port_from_the_ads_din),
      .out_port_from_the_ads_ncs         (out_port_from_the_ads_ncs),
      .out_port_from_the_ili_ncs         (out_port_from_the_ili_ncs),
      .out_port_from_the_ili_nrd         (out_port_from_the_ili_nrd),
      .out_port_from_the_ili_nrst        (out_port_from_the_ili_nrst),
      .out_port_from_the_ili_nwr         (out_port_from_the_ili_nwr),
      .out_port_from_the_ili_rs          (out_port_from_the_ili_rs),
      .out_port_from_the_sd_clk          (out_port_from_the_sd_clk),
      .out_port_from_the_sd_din          (out_port_from_the_sd_din),
      .out_port_from_the_sd_ncs          (out_port_from_the_sd_ncs),
      .reset_n                           (reset_n),
      .zs_addr_from_the_sdram            (zs_addr_from_the_sdram),
      .zs_ba_from_the_sdram              (zs_ba_from_the_sdram),
      .zs_cas_n_from_the_sdram           (zs_cas_n_from_the_sdram),
      .zs_cke_from_the_sdram             (zs_cke_from_the_sdram),
      .zs_cs_n_from_the_sdram            (zs_cs_n_from_the_sdram),
      .zs_dq_to_and_from_the_sdram       (zs_dq_to_and_from_the_sdram),
      .zs_dqm_from_the_sdram             (zs_dqm_from_the_sdram),
      .zs_ras_n_from_the_sdram           (zs_ras_n_from_the_sdram),
      .zs_we_n_from_the_sdram            (zs_we_n_from_the_sdram)
    );

步骤6 分配引脚

怎么分配引脚?请参阅http://www.cnblogs.com/yuphone/archive/2010/01/18/1650612.html

分配引脚模板

To,               Location

// 板载时钟50MHz
CLOCK_50,         PIN_23

// 板载RST_N
Q_KEY,            PIN_
                      
                      
// SDRAM              
SDRAM_ADDR[0],    PIN_
SDRAM_ADDR[1],    PIN_
SDRAM_ADDR[2],    PIN_
SDRAM_ADDR[3],    PIN_
SDRAM_ADDR[4],    PIN_
SDRAM_ADDR[5],    PIN_
SDRAM_ADDR[6],    PIN_
SDRAM_ADDR[7],    PIN_
SDRAM_ADDR[8],    PIN_
SDRAM_ADDR[9],    PIN_
SDRAM_ADDR[10],   PIN_
SDRAM_ADDR[11],   PIN_
SDRAM_BA[0],      PIN_
SDRAM_BA[1],      PIN_
SDRAM_CAS_N,      PIN_
SDRAM_CLK,        PIN_
SDRAM_CKE,        PIN_
SDRAM_CS_N,       PIN_
SDRAM_DQ[0],      PIN_
SDRAM_DQ[1],      PIN_
SDRAM_DQ[2],      PIN_
SDRAM_DQ[3],      PIN_
SDRAM_DQ[4],      PIN_
SDRAM_DQ[5],      PIN_
SDRAM_DQ[6],      PIN_
SDRAM_DQ[7],      PIN_
SDRAM_DQ[8],      PIN_
SDRAM_DQ[9],      PIN_
SDRAM_DQ[10],     PIN_
SDRAM_DQ[11],     PIN_
SDRAM_DQ[12],     PIN_
SDRAM_DQ[13],     PIN_
SDRAM_DQ[14],     PIN_
SDRAM_DQ[15],     PIN_
SDRAM_DQM[0],     PIN_
SDRAM_DQM[1],     PIN_
SDRAM_RAS_N,      PIN_
SDRAM_WE_N,       PIN_
                      
// ILI9325            
ILI_RS,           PIN_
ILI_nWR,          PIN_
ILI_nRD,          PIN_
ILI_DB[0],        PIN_
ILI_DB[1],        PIN_
ILI_DB[2],        PIN_
ILI_DB[3],        PIN_
ILI_DB[4],        PIN_
ILI_DB[5],        PIN_
ILI_DB[6],        PIN_
ILI_DB[7],        PIN_
ILI_nCS,          PIN_
ILI_nRST,         PIN_
                      
// ADS7803            
ADS_CLK,          PIN_
ADS_nCS,          PIN_
ADS_DIN,          PIN_
ADS_DOUT,         PIN_
ADS_BUSY,         PIN_
ADS_nIRQ,         PIN_
                      
// SD Card            
SD_CLK,           PIN_
SD_nCS,           PIN_
SD_DIN,           PIN_
SD_DOUT,          PIN_

步骤7 约束时钟

自行研究。

步骤8 编译

自行研究。

源码下载

lcd_at_nios_qii_part.zip 

目录

[原创][连载].基于SOPC的简易数码相框 -  Quartus II部分(硬件部分)

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  配置工作

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  SD卡(SPI模式)驱动

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  TFT-LCD(控制器为ILI9325)驱动

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  从SD卡内读取图片文件,然后显示在TFT-LCD上

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  优化工作

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  ADS7843触摸屏驱动测试

posted @ 2010-12-16 12:52  _安德鲁  阅读(7170)  评论(9编辑  收藏  举报