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 就起了,这个世界让我好崩溃,有谁知道,给点指点,谢谢了 不知道是不是
#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 我测试是没有就不行 有才能亮 #define LED_DATA_ADDR LED_BASE | (1<<31)
为什么要去做 | (1<<31)呢?
直接#define LED_DATA_ADDR LED_BASE
就行了吧! #define LED_DATA *(volatile unsigned long int *) (LED_DATA_ADDR)
试试! 不是很懂,
只是好奇不用IOWR()
怎么向IP发送数据 回复【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 发现了郁闷的问题,搞得我哪哪都不舒服
地址映射定义完接口之后,进行操作,结果第一种不可以,第二种死活可以,
(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)
怎么会那样 哦,从来没有用过fast的nios,呵呵。学习了,data cache的问题,必须要将地址最高位置1避免将数据写到cache
你的问题很简单啊
LED = LED + 1;
这句话需要先读LED1次,+1后再往LED里面写
而你的verilog 代码没有寄存器读操作嘛,加上读操作就可以了撒 回复【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)
最后还是不行 最后1句
assign avs_readdata = {30{1'b0},avs_readdata_r};
不过看RTL好像也没什么问题。。。用signal Tap抓一下波形看看呢。。。 回复【楼主位】hanbin08041813 CrazyBingo
-----------------------------------------------------------------------
斌哥威武! 忘了说早就搞定了 回复【11楼】hanbin08041813 CrazyBingo
-----------------------------------------------------------------------
是啥问题? 回复【12楼】TornadoYu
-----------------------------------------------------------------------
忘了 反正早就解决了 CrazyBingo:)
页:
[1]