向各位师兄、师姐、师弟、师妹请教一段PCI卡的读写程序
fyw1225@sohu.co 该用户已被删除
|
向各位师兄、师姐、师弟、师妹请教一段PCI卡的读写程序
下面是与我设计的一块PCI卡上FPGA的读写相关的两个VHDL程序进程,由于卡上的PCI接口芯片9054用的是C模式,因此在进程P28里,根据9054发出信号ads和blast产生传输标志信号transfer,transfer为1表示读写操作进行,为0则表示读写操作结束。
进程P29首先将9054的引脚ccs和数据读写有效引脚ready置为1,
信号selec=”000”,表示主机发出的要访问的地址为在FPGA上建立的存储器ram1的地址范围内,信号selec=”001”,表示主机发出的要访问的地址为在FPGA上 建立的存储器ram2的地址范围内。
wrcnt为主机通过9054向FPGA发出的读写控制信号,当它为1时,主机对FPGA进行写操作,当它为0时,主机对FPGA进行读操作。
信号lreset为9054输出的本地复位信号。
时钟clk为25MHz,分别接入到FPGA和9054的本地时钟引脚,作为读写控制时钟。
addr_in 为主机发来的已被转换为整数的地址信号。
data 为八位宽度的数据总线。
p28: process(lreset,clk)
begin
if lreset ='0' then
transfer <='0';
elsif clk'EVENT and clk='1' then
if ads = '0' then
transfer <='1';
elsif blast='0' then transfer<='0';
end if;
end if;
end process p28;
P29: process(lreset,clk)
begin
if lreset='0' then
ccs<='1';
ready<='1';
elsif clk'EVENT and clk = '1' then
if transfer ='1' then
if selec="000" then
if wrcnt ='0' then
data <= ram1(addr_in);
ready<='0';
end if;
elsif selec="001" then
if wrcnt = '1' then
ram2( addr_in) <= data ; ready <='0';
elsif wrcnt='0' then
data <=ram2( addr_in);
ready <='0';
end if;
end if;
elsif transfer='0' then ready<='1'; 读写结束后,将ready置1。
end if;
end if;
end process p29;
现在存在的问题是,我能够按地址对ram1和ram2进行读,并得到正确的结果,但不能够对ram2( 注:ram1在这里对主机是一个只读存储器)进行写,并且对ram2执行完写操作后,再执行对ram1或ram2中任何一个存储单元的读操作时,则产生死机,当重新启动主机后,再读ram2在死机前被写的存储单元,结果发现读出结果不是我们死机前写入的值,而是在执行写操作前的一次读操作的结果。
这几天我反复做读写实验,但还是不知道读写进程里错在什么地方(现在关键的问题就是不知写操作这部分程序导致死机的原因在哪里),因此特向各位师兄、师姐、师弟、师妹请教一下我的读写程序里有哪些错误,并向各位师兄、师姐、师弟、师妹表示我诚挚的谢意,感谢你们与我共同进行探讨,为我出谋划策。
如果师兄、师姐、师弟、师妹们要与我联系的话,我的电子邮箱是fyw1225@sohu.com。
最后,祝各位师兄、师姐、师弟、师妹们工作、生活、学习愉快。
[em12]
[此贴子已经被作者于2003-10-9 17:40:43编辑过]
[此贴子已经被作者于2003-10-9 17:44:19编辑过]
[此贴子已经被作者于2003-10-9 20:18:10编辑过]
[此贴子已经被作者于2003-10-9 20:19:46编辑过]
[此贴子已经被作者于2003-10-9 20:42:16编辑过] |
|
|
|
|
|