首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

向各位师兄、师姐、师弟、师妹请教一段PCI卡的读写程序

向各位师兄、师姐、师弟、师妹请教一段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编辑过]

返回列表