项目介绍:
1.利用按键对SDRAM写入10个数据;
2.利用按键对SDRAM读出这10个数据;
3.这10个读出数据传递给UART通过上位机显示对比。
项目模块逻辑框图:
SDRAM_CTRL:
本模块起到控制SDRAM的作用,而我们对SDRAM的操作就是要么写SDRAM,读SDRAM、初始化SDRAM或者进行SDRAM的刷新,因此SDRAM的 控制模块框图包含有这四个子模块,但是考虑到这四条命令在同时到来时应有个先后顺序,一次还应该设计一个仲裁子模块。下面依次画出这五个模块并完成这五个模块的连线。
sdram_init:
这个模块是十分重要的,因为在每次上电SDRAM时,必须先进行SDRAM初始化,后面的读写刷新指令才能够传输给SDRAM。这是无条件的并且只需一次初始化即可。对于初始化,其有自己的命令,bank,地址,最后完成刷新操作,会传出一个结束信号init_end,后面的三个命令也是在检测到有这一条命令后才能行操作。
sdram_aref:
sdram自动刷新命令,因为在上电的时候要每隔64ms进行一次电荷刷新,来保证数据的稳定性。它也有自己的命令,需要刷新的逻辑Bank,地址总线,会输出一个结束信号。其会告知后面的仲裁模块请求信号,如果仲裁模块觉得可以会给她一个使能信号。
sdram_write:
sdram写模块,输入需要确认是否完成了初始化,因此有一个init_end,同时还需要外部需要存储的数据以及想要存储的地址,还要设置一下写突发长度。在输出端同样有写的命令,写的逻辑Bank、写地址,写数据,写结束信号,同样仍然需要给仲裁模块一个响应信号让其判断目前能否进行写命令wr_sdram_en,如果仲裁模块觉得可以进行写操作,则给一个写使能信号。同时写模块需要向外面传出一个写响应信号。
sdram_read:
sdram读模块,这个模块负责读操作,同样除了时钟信号,复位信号,应该有初始化结束信号,读数据的地址,读突发长度,输出读命令,读的逻辑Bank,读地址,SDRAM传过来的读数据,后面在将这个数据读出这个模块,之所以这样设计,是因为还要设计一个fifo模块与SDRAM模块进行交互,rd_data_out就是将数据传给fifo,同样其应该请求一下仲裁模块,然后仲裁模块判断是否进行输出,若是输出则给读使能赋为高电平。还有读结束信号和读响应信号。
sdram_arbit(arbitration):
这个模块就是用来判断哪个模块运行,主要是他的输出,1.sdram时钟使能信号;2.sdram片选信号;3.sdram列选通信号;4.sdram行选通信号;5.sdram写使能信号;6.sdram的Bank片选信号;7.sdram地址总线;8.sdram的数据总线。下面就连接一下这五个模块。
sdram_ctrl:
FIFO_CTRL:
为什么会有这个模块?
1.实现跨时钟域处理,我们在对SDRAM进行写操作时,需要将写的数据先给FIFO缓存一下,然后在传递给SDRAM,同时在SDRAM读出的数据也要给FIFO进行缓存。
2.为SDRAM产生读写地址和读写请求信号。
SDRAM_TOP:
完成FIFO和SDRAM的连接
这样就可以实现SDRAM的控制了,以后也可以复用这个模块,因为本次项目是和UART一块的,所以需用到UART模块。这里有Uart_rx和Uart_tx同时调用一个PLL核为uart和sdram提供时钟,uart是50MHz工作时钟,SDRAM是100MHz工作时钟,同时SDRAM还应有一个偏移的100MHz时钟。这样就可以实现写和读。但是从SDRAM读出的信号dq,他的同步信号是sdram_clk100M是比uart_tx的时钟信号频率大,因此还需要一个fifo实现跨时钟域处理(这个并不理解)。