求助:FPGA读写外部ram
input ram_clk;
input wr,rd;
input cs;
input[7:0] data_in_bus; //写入的数据
output[7:0] data_out_bus; //读出的数据
inout[7:0] ram_data_bus; //ram的数据线,双向
output[18:0] ram_addr_bus; //ram的地址线
reg[7:0] data_out_bus;
reg[18:0] ram_addr_bus;
reg[18:0] addr_count;
reg[7:0] ram_data_bus_reg;
assign ram_data_bus=wr?'bz:ram_data_bus_reg;
initial
addr_count=11’b0;
always @(posedge ram_clk)
if(cs==1'b1) addr_count=11'b0;
else if(wr==1'b0)begin //写
ram_addr_bus<=addr_count[18:0]; //地址计数器的输出作ram的地址
ram_data_bus_reg<=data_in_bus;
addr_count<=addr_count+1'b1;
end
else if(rd==1'b0)begin //读
ram_addr_bus<=addr_count[18:0];
data_out_bus<=ram_data_bus;
addr_count<=addr_count+1'b1;
end
else addr_count<=11'b0;
endmodule
想写入并读出ram里的数据,但是也不知道写进去没有?
反正读出是不对的,data_out_bus没有读出ram里的数据,一直都是ram_data_bus的值。
请帮忙看看怎样改正阿,给点意见。弄得头都大了,谢谢。
仿真一下看看
就是仿真看的波形,data_out_bus一直和ram_data_bus的相同。
我想知道的是我这个程序有没有问题?或者我这个思路有没有问题?
不是很明白你的意思,照程序来看,由于这条语句:data_out_bus<=ram_data_bus; 必定会造成输出数据等于ram_data_bus的。而在实际应用中,读出来的数据就应该是这样,没有问题的阿,只是一般情况下需要配合输出控制信号来写入或者读出数据。
写的时候先将数据放到数据总线上,然后再写使能~
可惜我是学VHDL···关注中······
读不出来数据,可能是根本就没有写进去,访问ram要注意一些时序吧,就是wr和cs这些信号的相对关系,pulse的宽度要求是多少,需要结合ram,看一下ram的spec,吧。看一下它对输入信号的要求~
"assign ram_data_bus=wr?'bz:ram_data_bus_reg;"
上面的这个语句是什么意思?把“Z”写进ram吗?
我只是学了vhdl
提供几个调试的思路,小编不妨试下:
1、可以使用一个内部的ram看看,读写的对不对;
2、写点有规律的数,看看错在哪了
3、做下仿真之类的;不知道用的是quartus还是ise了,可以用调试工具试一试。
一开始写vhdl时候,都不用仿真的(“NB"大了,呵呵,结果总是悲剧的);现在写的话,都是完完全全仿真好才敢上板子的。
inout[7:0] ram_data_bus;怎么把addr_count[18:0]给赋值给了ram_addr_bus?双向口线可以这样使用吗?
8#兄弟说的有道理,根据你写的,好像你想在wr为0时输出ram_data_bus_reg的值给ram_data_bus,但为1时'bz这种表示好像是错误的,b代表2进制,但z却使16进制的。
我用的是ise的RAM的IP核,但是也读不出数据,不知道是什么原因。求高手解答~
assign ram_data_bus=wr?'bz:ram_data_bus_reg 弄反了吧
