我就说我写的应该不会有错,但看signaltap,怎么一直在写状态里面跳转,查了半天,原来是数字写错了。。。
细节啊
这次只是最基本的falsh控制,操作他的读写擦除,最后,在某个地址读出了我写进去的数
端口属性列表:
module flash_ctrl(
input clk,
input rst_n,
//input [2:0] key,
input ry_by,//由flash送到fpga
output reset,//送到flash
output ce_n,oe_n,we_n, //送到flash
output [20:0] addr,//送到flash
//output [7:0] data_out,
inout [7:0] data//从flash读出数据是是input,其余擦除和写的时候作output,控制信号
);
1.擦除(chip擦除而非扇区擦除):
/*1.擦除:共6个命令,写完每个命令后,先让WE写使能有效,然后再让它无效
AAA AA 555 55 AAA 80 AAA AA 555 55 AAA 10
第一个状态先得让其无效,最后发完命令还有RYBY的判断(1才能跳转到wr_state)
2.写(板子的byte脚拉低,所以只能是8位数据位操作):
AAA AA 555 55 AAA AA PA PD
3.读
送要读的地址就OK(vhdl中注意signal的特点,否则如果读连续的多个数据,可能读出数据出错)
代码:
略
主要步骤:
1.端口列表以及输入输出属性
2.双向口的处理(三态)
3.状态机(擦除,写,读)
三个大状态中又分为若干个小状态(考虑延迟,所以赋值在下一个时钟上升沿才能真正有效到达,所以会在每个送地址,送数后的一个状态,才将WE拉低有效,之后再拉高,送地址,送数据),写到这里,我想应该可以将送地址和送数据和前面那个的拉高写在一个状态中,可以减少状态机,类似流水线操作
文章评论(0条评论)
登录后参与讨论