hanbin08041813 发表于 2011-3-1 08:09:22

qii, sopc, nios ii 10.1 IP核设计,LED验证死活不行,感觉很神奇

学sopc也有个很长一段时间,最近第一次自己设计IP核。

参照了艾米的自定义IP核:SRAM,12864的例子,以及黑金的PWM的例子,同时看了两本书,以及《Avalon-MM Interface Specialtion》,最后按部就班设计,为了验证,先从简单的开始,可是sram好像可以,lcd1602和led 都不行,在此处我先讲解我设计led的流程:



(1)当然是led ip verilog的代码

/********************************************************************
*    Module Name         :   Crazy_LED
*    Author                :   Crazy Bingo
*    Device                :    EP2C8Q208C8
*    Version               :   Quartus II 10.1
*    Date                  :   2011-2-24
*    Description         :   
*********************************************************************/
module Crazy_LED
(
    //Avalon Clock
    input            csi_clk,
    input            csi_rst_n,
    //Avalon-MM
    input        avs_address,      //multiple of 4
    input            avs_chipselect,
//    input        avs_byteenable_n,    //1,2,4,8,16,54,128
    input            avs_write,
    input        avs_writedata,      //32bit cpu
//    input            avs_read,
//    output        avs_readdata,      //32bit cpu
    //Avalon Conduit
    output        coe_data
);

reg    coe_data_r;
always @(posedge csi_clk or negedge csi_rst_n)
begin
    if (!csi_rst_n)
      coe_data_r <= 0;
    else if (avs_chipselect && avs_write && (avs_address == 0))
      coe_data_r <= avs_writedata;
end
assign coe_data = coe_data_r;

endmodule



(2)在sopc中加入component
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619042YXJS50.png
(原文件名:1.png)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619043GYPBIK.png
(原文件名:2.png)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619044MYEOQV.png
(原文件名:3.png)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619045TTEILF.png
(原文件名:4.png)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619046UCSG73.png
(原文件名:5.png)

2)加入led ip,generate
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619047T6LVKF.png
(原文件名:6.png)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619048NEX9AD.png
(原文件名:7.png)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619049QDFTHF.png
(原文件名:8.png)

(顺便提下,10.1有这两个警告,有些人也碰到了,但是好像不用管,我试过pio-led没问难题的)



(3)qii top module,分配引脚,编译,ok(警告应该没事,不用理会)
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619050S2K2X1.png
(原文件名:9.png)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619052D04B73.png
(原文件名:10.png)


(4)新建nios2工程,涉及代码

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619054Z0CBY1.png
(原文件名:11.png)



(5)下载pof后,run hardware,


printf运行了,但是led (2位)始终没反应,也没闪烁之类的,死了
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619053L4R038.png
(原文件名:12.png)

各位前辈:
(1)address 信号可不可以直接不要默认为0 ?
(2)是不是我在nios2 的管脚映射错了?
(3)这到底是为什么?????????????????

当然我确定硬件是木有问题的
我实在不知道哪里不行了,郁闷了n久n久,吃不好睡不香,早上6:30 就起了,这个世界让我好崩溃,有谁知道,给点指点,谢谢了

hanbin08041813 发表于 2011-3-1 09:21:51

不知道是不是
#define LED_DATA_ADDR LED_BASE | (1<<31)
#define LED_DATA *(unsigned long int *) (LED_DATA_ADDR)

然后后面LED_DATA = LED_DATA +1 ;死活不行


但是如果直接IOWR(LED_DATA_BASE,0,1);
就可以了

然后 address 我测试是没有就不行 有才能亮

oceanx 发表于 2011-3-1 10:05:46

#define LED_DATA_ADDR LED_BASE | (1<<31)

为什么要去做 | (1<<31)呢?
直接#define LED_DATA_ADDR LED_BASE
就行了吧!

snowy 发表于 2011-3-1 11:18:31

#define LED_DATA *(volatile unsigned long int *) (LED_DATA_ADDR)
试试!

syuanwang 发表于 2011-3-1 11:36:46

不是很懂,
只是好奇不用IOWR()
怎么向IP发送数据

hanbin08041813 发表于 2011-3-1 14:29:09

回复【2楼】oceanx
-----------------------------------------------------------------------

回复【3楼】snowy
-----------------------------------------------------------------------

回复【4楼】syuanwang 昙花公公
-----------------------------------------------------------------------



不行的,因为是nios ii fase,fast开辟了一段cache,所以nios2 写入有两种方法
(1)直接用API ,IOWR()
(2)就是#define LED_DATA *(unsigned long int *) (LED_DATA_ADDR LED_BASE | (1<<31)),然后LED_DATA = ?
详见我博客http://www.cnblogs.com/crazybingo/archive/2010/11/26/1889253.html

hanbin08041813 发表于 2011-3-1 14:35:07

发现了郁闷的问题,搞得我哪哪都不舒服
地址映射定义完接口之后,进行操作,结果第一种不可以,第二种死活可以,

(1)不可以
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619160OQCQ7K.jpg
(原文件名:这样 死活不行 LED 和我都死了.jpg)

(1)可以
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619161PT3W9K.jpg
(原文件名:这样写 很OK,流水灯OK.jpg)

怎么会那样

oceanx 发表于 2011-3-1 15:06:12

哦,从来没有用过fast的nios,呵呵。学习了,data cache的问题,必须要将地址最高位置1避免将数据写到cache

你的问题很简单啊

LED = LED + 1;
这句话需要先读LED1次,+1后再往LED里面写

而你的verilog 代码没有寄存器读操作嘛,加上读操作就可以了撒

hanbin08041813 发表于 2011-3-2 08:31:28

回复【7楼】oceanx
-----------------------------------------------------------------------
懂了你是说
output         read;
output readdata;

可是对有些器件而言,比方说1602,led,只要write就可以了啊 ,他们io又不是inout
read什么用,
我试试看吧

//read
reg        avs_readdata_r;
always @(posedge csi_clk or negedge csi_rst_n)
begin
        if (!csi_rst_n)
                avs_readdata_r <= 0;
        else if (avs_chipselect && avs_read && (avs_address == 0))        //for steady state
                avs_readdata_r <= coe_data;
        else
                avs_readdata_r <= 0;
end
assign avs_readdata = avs_readdata_r;


还是没有用不好意思。。。。。。./emotion/em178.gif./emotion/em178.gif./emotion/em178.gif

RTL如下:
http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619284JW3PP7.png
(原文件名:RTL.png)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_619285TUH07I.png
(原文件名:RTL2.png)



最后还是不行

oceanx 发表于 2011-3-2 21:24:29

最后1句
assign avs_readdata = {30{1'b0},avs_readdata_r};
不过看RTL好像也没什么问题。。。用signal Tap抓一下波形看看呢。。。

chunge2050 发表于 2011-3-6 21:00:35

回复【楼主位】hanbin08041813 CrazyBingo
-----------------------------------------------------------------------

斌哥威武!

hanbin08041813 发表于 2011-4-5 14:20:04

忘了说早就搞定了

TornadoYu 发表于 2011-4-7 13:55:40

回复【11楼】hanbin08041813 CrazyBingo
-----------------------------------------------------------------------

是啥问题?

hanbin08041813 发表于 2011-9-5 13:52:58

回复【12楼】TornadoYu
-----------------------------------------------------------------------

忘了 反正早就解决了

chahu1227 发表于 2012-3-6 13:14:08

CrazyBingo:)
页: [1]
查看完整版本: qii, sopc, nios ii 10.1 IP核设计,LED验证死活不行,感觉很神奇