搜索
bottom↓
回复: 22

看了一些SDRAM控制代码,状态机看得真累,搞不清为何要那样复杂贴上一段我自己写的部分(

[复制链接]

出0入0汤圆

发表于 2010-11-14 14:58:19 | 显示全部楼层 |阅读模式
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity SDRAMINTERFACE is
    Port (         clk,exreset :in STD_LOGIC;                --------clk是125MSDRAM的反相,这样相当于信号在负沿输出,靠正沿打入SDRAM
                                          clke : out  STD_LOGIC;
                   ncs : out  STD_LOGIC;
                  nwe : out  STD_LOGIC;
                   ncas : out  STD_LOGIC;
                  nras : out  STD_LOGIC;
                   dqml : out  STD_LOGIC;
                   dqmh : out  STD_LOGIC;
                   ba0 : out  STD_LOGIC;
                   ba1 : out  STD_LOGIC;
                                          initfinish:        out  STD_LOGIC;
                                          logicaddr:in STD_LOGIC_VECTOR (23 downto 0);
                   sdramaddr : out  STD_LOGIC_VECTOR (12 downto 0);
                   sdramdata : inout  STD_LOGIC_VECTOR (15 downto 0));
end SDRAMINTERFACE;

architecture Behavioral of SDRAMINTERFACE is
        signal reset:STD_LOGIC;
        signal resetcount:integer range 0 to 30000;
begin
        control:process(reset,clk)
        begin
                if reset='1' then
                        clke<='0';
                        ncs<='1';
                        ncas<='1';
                        nras<='1';
                        nwe<='1';
                        dqml<='0';
                        dqmh<='0';
                        ba0<='0';
                        ba1<='0';
                        sdramdata<="ZZZZZZZZZZZZZZZZ";
                elsif falling_edge(clk) then
                        clke<='1';
                        case resetcount is
                                when 14502=>                --nop
                                        ncs<='0';
                                when 14510=>                --prechange,等待Trp 20ns=3clk
                                        nras<='0';
                                        --ncas<='1';
                                        nwe<='0';
                                        sdramaddr(10)<='1';
                                when 14513=>                --autorefresh
                                        ncas<='0';
                                        nwe<='1';
                                when 14514=>                --nop,66ns,等待自动刷新完成       
                                        ncas<='1';
                                        nras<='1';
                                when        14523=>                --先保险起见,多一个时钟,发第二次的自动刷新
                                        nras<='0';
                                        ncas<='0';
                                when 14524=>
                                        ncas<='1';
                                        nras<='1';
                                when 14533=>                --loadmoderegister
                                        nras<='0';
                                        ncas<='0';
                                        nwe<='0';
                                        sdramaddr<="0000000110111";                --全页突发
                                when 14534=>                --nop,66ns,等待自动刷新完成       
                                        nras<='1';
                                        ncas<='1';
                                        nwe<='1';
                                when others=>       
                                       
                                        在这里加上SDARM控制代码,暂时略去
                                       
                        end case;
                end if;
        end process control;
       
        resetcontrol:process(clk,exreset)
        begin
                if exreset='1' then
                        initfinish<='1';
                        reset<='1';
                        resetcount<=0;
                        --resetcount<=14495;                                ------仿真时用
                elsif falling_edge(clk) then
                        if resetcount<14540 then
                                resetcount<=resetcount+1;
                                if resetcount>14500 then
                                        reset<='0';
                                end if;
                        else
                                initfinish<='0';                                 -----到这边时完成了上电初始化工作
                        end if;       
                end if;
        end process resetcontrol;

end Behavioral;

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-11-14 15:04:42 | 显示全部楼层
仿真波形

(原文件名:初始化SDRAM.JPG)

出0入0汤圆

发表于 2010-11-14 21:06:53 | 显示全部楼层
真厉害!!顶你一个

出0入0汤圆

发表于 2010-11-15 00:32:53 | 显示全部楼层
不错,支持一下

出0入0汤圆

发表于 2010-11-16 10:30:55 | 显示全部楼层
验证通过了吗?

出0入0汤圆

 楼主| 发表于 2010-11-19 21:23:11 | 显示全部楼层
传个更详细的大图

(原文件名:详细的波形图.JPG)

出0入0汤圆

发表于 2010-11-20 10:34:01 | 显示全部楼层
回复【5楼】888888888888
-----------------------------------------------------------------------

高手啊,能把你qq留个不,小弟不胜感激

出0入0汤圆

 楼主| 发表于 2010-11-28 11:40:58 | 显示全部楼层
更正:预充持续1个时钟,之后是两个NOP,上图代码有问题,预充持续了三个时钟,漏了NOP,是代码拷贝时忘了改

出0入0汤圆

发表于 2010-11-28 22:29:10 | 显示全部楼层
我是菜鸟,我觉得写SDRAM控制器,状态机还比较好解决,难的是速度高时的时序约束设计上。

出0入0汤圆

发表于 2011-7-10 23:18:06 | 显示全部楼层
vhdl

出0入0汤圆

发表于 2011-7-11 09:57:16 | 显示全部楼层
很复杂么,不觉得你的有比别人的代码特别的地方

出0入0汤圆

发表于 2011-7-13 21:53:52 | 显示全部楼层
楼主的意思是他的代码是如C语言一样的依次运行,各种操作从头到尾一目了然,只受定时器记录的当前时刻影响;

不像状态机类型的代码,每个状态的转移受很多条件影响,各个条件和输出有复杂的交叉关系,逻辑思维不强的人,很容易看晕倒!

出0入0汤圆

发表于 2011-7-23 17:54:54 | 显示全部楼层
up

出0入0汤圆

发表于 2011-7-23 20:40:13 | 显示全部楼层
真正困难的地方被略去了

出0入0汤圆

发表于 2011-7-23 22:07:48 | 显示全部楼层
楼主应该是个新手,殊不知计数器本是就是个状态机。

出0入0汤圆

发表于 2011-10-31 09:05:42 | 显示全部楼层
请教sdram数据存储2M数据中有10个左右异常数据,请教!小弟qq2441701360,谢谢邮箱2441701360qq.com,谢谢

出0入0汤圆

发表于 2011-11-14 13:19:23 | 显示全部楼层
有没有完整的?
没有看到刷新程序?

出0入0汤圆

发表于 2011-11-14 13:49:06 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-2-24 15:18:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 20:15:40 | 显示全部楼层
楼主这代码跟状态机有本质区别么?我倒觉得用状态机写出来还更容易后期维护

出0入0汤圆

发表于 2013-8-7 08:54:13 | 显示全部楼层
高手

出0入0汤圆

发表于 2013-8-9 11:25:35 | 显示全部楼层
对于懂C和C++的人来说,这代码看的比较熟悉,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 08:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表