打印

关于FPGA实现的SRAM读写控制器的验证

[复制链接]
4836|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxc806705|  楼主 | 2011-5-30 14:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了一个SRAM的读写控制器,verilog编写的,由于板子上没有现成的验证电路我现在的验证想法是这样:用串口发送数据到开发板,用一个串口接收模块接收后,
                                    写入到SRAM,然后立刻将写入的数据从刚才的地址读出来
                                    读出来的数据放到LED中显示。
目前这个模块写完了我也下载了运行,结果测试非常顺利——就是太顺利了我都怀疑我的数据根本没有通过SRAM,二是直接到了LED中。现在又点晕,有达人有空帮我看看这个状态机是否正确么?
代码如下:
module SRAM(A,D,SRAM_CE,SRAM_OE,SRAM_WE,BHE,BLE,DOUT,DIN,clk);
  input  clk;
  input  [7:0] DIN;//串口接收后的数据,8位
  output SRAM_CE,SRAM_OE,SRAM_WE,BHE,BLE;//SRAM的控制接口
  output [7:0] DOUT;//输出到LED的8位数据
  inout  [15:8] D;//16位地址线的高8位
  output [17:0] A;//18位数据线

  reg oe,we,bhe,ble;
  reg start;
  reg [2:0] state;
  reg [7:0] outbuf,inbuf1,inbuf2;
  reg [15:8] dbuf;
  reg [17:0] abuf;

  parameter   idle=3'b000,  write1=3'b001,  write2=3'b011,
              read1=3'b100, read2=3'b110;

  assign SRAM_CE = 0;
  assign SRAM_WE = we;
  assign SRAM_OE = oe;
  assign BHE     = bhe;
  assign BLE     = ble;
  assign DOUT    = outbuf;
  assign A[17:0] = abuf[17:0];
  assign D[15:8] = dbuf[15:8];

  always @(posedge clk)
    begin
      inbuf1  <=DIN;
      inbuf2  <=inbuf1;
    end

  always @(posedge clk)
    begin
      case(state)
         idle:
              begin
                if(inbuf2!=inbuf1)
                  begin
                    start <=1;
                    bhe   <=1;
                    ble   <=1;
                    we    <=0;
                    oe    <=1;
                    state <=write1;
                  end
                else
                  begin
                    start   <=0;
                    bhe     <=1;
                    ble     <=1;
                    we      <=1;
                    oe      <=1;
                    state   <=idle;
                  end
              end
       write1:
              if(start)
              begin
                abuf      <=abuf+18'b1;
                bhe       <=0;//高8位允许
                state     <=write2;
              end
       write2:
              begin
                dbuf[15:8]<=inbuf2;
                bhe       <=1;
                we        <=1;
                state     <=read1;
              end
        read1:
              begin
                oe        <=0;
                bhe      <=0
                state     <=read2;
              end
        read2:
              begin
                outbuf[7:0]<=D[15:8];
                state     <=idle;
              end
      endcase  
    end     


当写完这个帖子的时候我发现了代码肯定有问题,因为我烧录程序的时候bhe置的是1而 ble是0,也就是说反过来了,输出的是低8位,但是数据依然正确,所以这个代码肯定有问题,没有经过SRAM
有人能帮我看看哪里有问题吗?或者有更好的验证方法?

相关帖子

沙发
lxc806705|  楼主 | 2011-5-30 14:56 | 只看该作者
想到一点改进的,外加一个读取信号,先写入几个数据,然后再读取信号拉高时再依次读出来刚才写入的数据,这时候由于地址总线变了,读出来的数据肯定是从SRAM读的,但这又要加一个电平检测模块,而且还要把状态机改成2个,头大

使用特权

评论回复
板凳
lxc806705|  楼主 | 2011-6-13 15:13 | 只看该作者
终于发现问题了,开发板用的芯片和原理图上的芯片不一样,导致我用了错误的数据手册
啊啊啊啊啊啊啊啊,2周就这么浪费掉了,鄙视卖板子的,我就说读写时序这么简单我怎么搞就是不对,我了个去原来是硬件都没对--:P
最后搞对了还是很高兴哈哈

使用特权

评论回复
地板
xwj| | 2011-6-13 15:15 | 只看该作者
哈哈:lol

使用特权

评论回复
5
shihun009| | 2011-7-11 14:26 | 只看该作者
:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

154

帖子

1

粉丝