1,很难得在SIGOK项目里面看到有自己CSDN博客的连接。
2,今天写点东西整理一下自己的思路。
3,别人看了也许没有意义,或许没有太多必要看下去。
4,今天搞定了4字的并行触发处理,但是现在只能精确到四字所在块,而不能确定是哪个字,这点需要继续改建,但是不是很关键的问题,可以一放。
5,可以避繁就简,做一个电平和边缘都是一次触发的版本。很高级的事件触发,很少有人用到。
6,同样的茶叶同样的水,同一次泡,似乎用量也都一样,但是泡出来颜色和口味都不一样。难道这就是所谓茶道,中午泡的两壶,似乎有点领悟了。
7,现在时间比较晚了,先做一个LA16的简单应用,做三态IO。
8,从SVN下载了SDRAM_IO的项目,检查一下FPGA代码,将IO依此从CHIP5-》NIOS-》TOP(DCH)引出。编译通过。
9,这时候想到应该改做上一个控制L16上的小灯的程序,好指示基本的控制通路建立,这样在公布的API里面带上这个程序,也可以让大家在自己控制时候有个直观的查看是否已经建立控制的指示。
10,将9的思路实现在CHIP0模块里面。控制STATUS双色小灯,下面的那个电源指示灯等里面另外一个指示,P135脚,我用来指示USB通讯。只要有WR或者RD就持续两一段时间。用如下代码实现:
always @ (posedge clk) led[1:0] <= chip0_bus32[1:0] ;
`define V_HI_BIT 14
reg [`V_HI_BIT:0]v;
always @ (posedge clk) if( ~usb_wr & ~usb_rd )v<=0; else if (~ v[`V_HI_BIT])v<=v+1;
always @ (posedge clk) led[2] <= ~ v[`V_HI_BIT] ;
随手写的代码,道理很简单:如果有读或者写,就清零V,此时点亮了LED,当V自加,直到14位变成1,就停止亮,也停止自加,等待下次读写操作的到来,这个代码用计数器巧妙地替代了状态机。其中V_HI_BIT可以调节灯亮的持续时间。
11,编译通过,之后看看NIOS处理器的命令处理,
12,由于LA16原来是实现组读写的,也就一写就写128个32位寄存器,一读也是读128个32位寄存器,这里最好能实现一次写一个32位字,读一个32位字。上位机一次写一个32位字的NIOS处理代码代码如下:7号命令来写寄存器
void set_reg()
{
unsigned int addr;
addr = usb_rd_u32();
*(unsigned int volatile*)(addr) = usb_rd_u32();
}
而上位机一次读一个32位字需要参考一下FPGA逻辑实现,主要是对PKT_END的命令的处理。8号命令在读寄存器。
void get_reg()
{
unsigned int addr,t;
addr = usb_rd_u32();
t = *(unsigned int volatile*)(addr) ;
usb_wr_u32(t);
clr_bit(USB_CTR,3) ;
set_bit(USB_CTR,3) ;
}
13,在上位机里面做了对应的处理命令如下:
void OLS_set_reg(unsigned int addr,unsigned int dat)
{
fill_byte(7,tmp); ///command
fill_byte(addr,&tmp[4]); ///addresss
fill_byte(dat,&tmp[8]); value
lw_usb_write(tmp,12);
lw_usb_write(NULL,0);
}
void OLS_get_reg(unsigned int addr,unsigned int * dat)
{
int r;
fill_byte(8,tmp); ///command
fill_byte(addr,&tmp[4]); ///addresss
lw_usb_write(tmp,8);
lw_usb_write(NULL,0);
r=lw_usb_read(tmp,4);
*dat = get_u32(tmp);
}
测试通过。
14,已经有不小收获了,之后要做的是,
1)整理一下DLL的API接口,屏蔽掉无用的接口。
2)写一个上位机的界面,调用DLL。可以设置。
2)将USB部分的修改以及之前实现的7号和8号命令在别的APP里面实现。
15,暂时结束一下今天的任务,提交SVN项目,名称SDRAM_IO 版本号2.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
今天是2014年2月7号,再继续做这个。
int __stdcall EX_LA_OPEN(unsigned short vid ,unsigned short pid) { return LA_OPEN(vid,pid,0);}
int __stdcall EX_LA_CLOSE(){lw_usb_close();}
int __stdcall EX_LA_SET_LED(unsigned int led){led &= 3; return OLS_set_reg(0x10a0,led);}
int __stdcall EX_LA_SET_OE(unsigned int oe){ return OLS_set_reg(0x10f4,oe);
int __stdcall EX_LA_SET_OUT(unsigned int val){return OLS_set_reg(0x10f0,val);}
int __stdcall EX_LA_GET_IN(unsigned int *dat){return OLS_get_reg(0x10f0,dat) ;}
在DLL实现了以上几个函数。
接下来的工作就是要进行试验了。进行试验之前先提交一下SVN,版本是3.
接下来就是做个界面设计。简单做个界面,这个界面放在DLL 里面,用户可以直接直接调用。用户可以自己编写DLL函数设置IO口,也可以调用DLL内部的此界面直接设置和测试。
界面工作了,但是还没有连接硬件,先备份 版本号4 .