总结:对Quartus II 工具使用不足。不能有效的使用SignalTap II ,导致大量时间浪费,学习效率非常低下。
之前对示波器的使用很欠缺,也导致任务停滞不前。
今天解决的问题:SDRAM突发写/读,突发长度为8的时候,读出的数据顺序有问题。后来在徐老师、文老师的帮助下,借助SignalTap II 工具,很清晰的找到问题所在。
error: 程序中sdram_data是与SDRAM芯片数据总线相接口的双向信号。而用于点亮LED的数据室sys_data_out,
sys_data_out <= sdram_data,这样就比sdram_data慢了一个时钟。而用于将sys_data_out赋值给data_check_0...data_check8的always模块中,对于这个赋值又是在if语句中完成的。if的条件是(sdram_rd_ack && (!sys_dout_rdy)),实际上就读早了。通过sdram_rd_ack_r<=sdram_rd_ack,并且条件改为 (sdram_rd_ack_r && (!sys_dout_rdy)) ,就能正确的从第一个数据开始读出了。但是还有一个问题,sys_dout_rdy是一个多余的条件,并且它将最后一个数据给截掉了。
所以最终修改后的部分代码为:
/
if(sdram_rd_ack_r ) begin
if(cnt_clk==9'd1) data_check1 <= sys_data_out;
if(cnt_clk==9'd2) data_check2 <= sys_data_out;
if(cnt_clk==9'd3) data_check3 <= sys_data_out;
if(cnt_clk==9'd4) data_check4 <= sys_data_out;
if(cnt_clk==9'd5) data_check5 <= sys_data_out;
if(cnt_clk==9'd6) data_check6 <= sys_data_out;
if(cnt_clk==9'd7) data_check7 <= sys_data_out;
if(cnt_clk==9'd8) data_check8 <= sys_data_out;
end
/
这反映了,我写的代码质量很差,if条件交织在一起是很混乱的,容易产生错误。