• [原创][连载].基于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触摸屏驱动测试

     安德鲁® / CC BY 2.5     FPGA Run!
  • 相关阅读:
    生成15位或者4位随机数 (主要用于微信支付订单号)
    支付签名 MD5Util 排序工具类
    JVM垃圾回收(GC)
    JVM内存区域
    Java实现经典七大经典排序算法
    Java设计模式之装饰者模式
    Java设计模式之单例模式
    提前批笔试一道算法题的Java实现
    Java设计模式之工厂模式
    文件上传和下载
  • 原文地址:https://www.cnblogs.com/yuphone/p/1908073.html
Copyright © 2020-2023  润新知