sopc builer 自定义元件

 

                           Sopc Builder 的自定义元件操作和注意事项
      时间:2011/5/12
      操作步骤:
1)      首先建立一个新的工程,并建其元件的VHDL元件功能文件,其文件主要实现芯片与目标器件间的功能接口,其中元件的必需端口有
clk,address,chipselcet,writedata,readdata,write,read
Clk    : 用于连接芯片的系统时钟,则其Avalon总线上的时钟,作用在于引入系统时钟与芯片同步
Address: 用于连接芯片上的地址线,则也是Avalon总线上的地址线作用在于对本元件的数据进行定位
Chipselect:用于连接芯片上的片选信号量,作用在于标记是否操作本元件
Read,write : 为芯片对元件的读和写的使能信号,当需要对元件进行读写时会将这信号对应置’1’
Readdata,writedata:读写的数据线,用于输送读写操作的数据
 
          其中read与readdata同时使用,write与writedata同时使用,这两组端口看元件需求添加.
          主要代码如下:主要是实现在写操作时将输入元件的数据输出到Led_out中
ENTITY led_port IS
    PORT(
             inCLK : IN STD_LOGIC;
           address  : IN STD_LOGIC;
           writedata : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
          writesignal : IN STD_LOGIC;
           chipselect : IN STD_LOGIC; 
        
         LED_OUT :OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END led_port;
ARCHITECTURE Behavior OF led_port IS
BEGIN
    PROCESS(inCLK)
    BEGIN
    IF (inCLK = '1' AND inCLK'EVENT ) THEN         //通过时钟脉冲进行控制操作
             IF (chipselect = '1' and writesignal = '1' )THEN     //片选本元件有效,写信号使能
            IF address = '0' THEN                      //选择操作的数据地址定位;一般最
                                                //大32位的数据一个地址,
                          LED_OUT <= writedata(7 DOWNTO 0);   //32位的数据位,用到前8位
                END IF;
             END IF;
    END IF;
    END PROCESS;
END Behavior;
2)      通过仿真元件确定其功能实现无误后,在SOPC Builer己存在芯片上新建元件
1)      按New
2)      出现Component EdiT,跳到HDL Files功能区
3)      按add 加入元件的VHDL文件*.vhd
4)      转到Signals进入芯片与元件间的线路连接设置如图进行设置
其中有些名称会自动对应,如名称没有对应则进行手动配置
注:clk 处 Interface : new clock input     ; led_out : new conduit
5)      进行Interfaces
1)      设置avalon_slave_0->Associated Clock为clock_sink则之前设置的clk
2)      Timing->write Wait 为1 ,为写操作增加一个等待周期,使写操作更稳定
3)      Deprecated->Slave addressing 这有两个选项:native 和 DYNAMIC
NATIVE:为静态地址对齐
DYNAMIC:为动态地址对齐
这个实验使用的数据位与芯片的数据位同为32位,所以这里可以不关心,这后面会对这两种方式进行个人的理解分析
4) 最后Component wizard 对元件进行版本,元件组等信息的设定,只填Group 和 Description 即可(任意填写)
   6) Finish
 3) 新建好元件后,双击元件即可添加到芯片中,最后对芯片的元件地址和中断地址进行更新配置
 4) Generate芯片后回到quartus的工程文件中,配置好其输出的引脚
 5) 将刚才的元件*.VHD设为顶层文件并工程进行编译(具体原因可能在于vhd文件不在这个工程中,有些编译生成的文件不在这个工程文件夹内而不能成功使用元件)
6)         再将原来的bdf顶层文件设回,再一次编译
7)  最后回到Nois2中编写程序
编写程序注意事项:
1)      其对元件的操作如对普通的PIO操作相似可以使用
IOWR_ALTERA_AVALON_PIO_DATA(BASE,DATA)进行写操作,其中BASE对应的基地址宏在system.h中进行查找,若在元件中定义了多个地址,则可以加入头include “io.h”直接使用IOWR(BASE,REGNUM,DATA)REGNUM为其对应的寄存器或偏移地址,则其在元件VHDL中的操作IF address = '0' THEN 这里的address ó regnum;
2)      若不是如本实验使用元件使用的数据地址不为32位,但必须是8的整数位(~128位),那么 主端口的32位与从端口的数据位宽不同,则其需要进行不同的处理. 首先,在新建元件的第5步的Interface中有个地址对齐选项(以下讨论为主位宽 > )
如选择为:native静态地址对齐
如选择为:dynamic 动态地址对齐方式
编码操作请看文件io.h.
     Altera.components/ipDeviceDrivers/nios2_ip/altera_nios2/HAL/inc/io.h
     其中NATIVE,就用IOWR()与之前一样;DYNAMIC则使用宏IOWR_**DIRECT()
其中原理还不太清晰,转个网上的大家看
转载于利利工作室
首先要明确的一点是地址对齐的方式是对Avalon slave 来说的,Avalon master无所谓地址对齐的方式,也没有这个选项。不管Avalon master的端口宽度是多少,其地址线的最低位都代表字节地址,即Avalon master的地址只有一种就是字节地址。另外,Avalon 三态桥出来的地址也是字节地址,所以连接Avalon三态桥的16位宽度的器件,最低地址位必须和三态桥的A1相连,而不是A0。同理,连接Avalon三态桥的32位宽度的器件,其最低地址位必须和三态桥的A2相连。
Avalon slave来说,有两种地址对齐方式:动态地址对齐和静态地址对齐。
动态地址对齐:动态地址对齐可以自动适应和Avalon master端口宽度不同的器件,而同时保持地址增长的方式是以字节为单位增长的方式。匹配不同端口宽度的master和slave时使用动态地址对齐方式可以得到一个连续的存贮器空间。但动态地址对齐在读操作的时候有附作用。当一个32位Nios II core读一个8位宽的slave时,物理会产生4次8位的读操作,而读一个16位宽的slave时,则要产生2次的读操作。大部分寄存器类型的外设不能容忍这种附作用,所以动态地址对齐一般不适合用于寄存器外设,主要用于存贮器。如果外部存贮器的宽度大于8位时,比如16位或32位,则必然有字节使能信号,以便进行字节粒度的写操作。所以在为这些存贮器做接口的时候, 如果采用动态地址对齐的方式,则一定要连接字节使能信号。
静态地址对齐:静态地址对齐的地址增长单位是Avalon master的端口宽度,每次读写都只对应一次操作没有什么附作用。但在匹配不同端口宽度的master和slave时,地址不能自动调整,某些地址没有相应的物理实体和它对应。当一个32位的Nios II core读一个8位宽的slave时,其获得的32位数据低8位从slave获取,而高24位则没有定义。同样,当它读16宽的slave时,其获得的32位数据低16位从slave获取,而高16位则没有定义。当Nios II core想继续读下一个8位(或16位)时,则需要增长字节地址4。除非你一定需要一个连续的地址空间,否则使用静态地址对齐方式是比较保险的方式。
IORD IOWR通常用于读写静态地址对齐的slave,而IORD_XXDIRECT和IOWR_XXDIRECT通常用于读写动态地址对齐的slave。但其实也可以交叉使用,即用IORD和IOWR读写动态地址对齐的slave,用IORD_XXDIRECT和IOWR_XXDIRECT读写静态地址对齐的slave,条件是你要正确的计算地址。IORD_XXDIRECT和IOWR_XXDIRECT以字节为单位,而IORD和IOWR以word(32位)单位。
 
                                         

你可能感兴趣的:(职场,builder,休闲,sopc,自定义元件)