集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1904|回复: 3

最近学习了一个用verilog描述SRAM的例子,有一点看不懂,请大牛指点

[复制链接]
sihaiguoxin 发表于 2010-9-25 16:10:44 | 显示全部楼层 |阅读模式
module sram_test( rst        ,
                  clkin      ,
                             
                  sram_ab    ,
                  sram_db    ,
                  sram_wr    ,
                  sram_rd    ,            
                  sram_cs    ,
                  sram_be    ,
                             error,
                  task_start , //Start    Testing ---LED1
                  task_finish,  //Testing  Finish  ---LED2
                                  flash_ce,
                                  flash_oe,
                                  flash_we,
                                  sd_cas,
                                  sd_ras,
                                  sd_we

                 );
input           rst       ;
input           clkin     ;

output [17:0]   sram_ab   ;
output [5:0]    sram_be   ;
inout  [15:0]   sram_db   ;

output          sram_wr   ;
output          sram_rd   ;
output          sram_cs   ;
output error;
output          task_start ;
output          task_finish;        
output                         flash_ce,flash_oe,flash_we;
output         sd_cas,sd_ras,sd_we;
//ports
wire            rst       ;  
wire            clkin     ;  
                              
reg    [17:0]   sram_ab   ;  
wire   [15:0]   sram_db   ;  
reg             sram_wr   ;  
reg             sram_rd   ;  
                              
reg             task_start ;
reg             task_finish;
wire flash_ce=1;
wire flash_oe=1;
wire flash_we=1;
wire sd_cas=1;
wire sd_ras=1;
wire sd_we=1;
//internal signals
reg             clk_2;
wire            clk;

reg  [2:0]      STATE,NEXT;
reg             error     ;
reg  [15:0]     sram_db_reg;
reg  [15:0]     count      ;

//parameters
parameter     IDLE     = 3'D0,
               WRITE_1  = 3'D1,
               WRITE_2  = 3'D2,
               READ_1   = 3'D3,
               READ_2   = 3'D4;

assign  sram_cs = 1'b0;
assign  sram_be = 6'd0;              
assign  sram_db = sram_rd ? sram_db_reg:'hz;

reg [1:0] clk_count;
always @(posedge clkin or negedge rst)
        if(!rst)
                begin
                        clk_count<=2'd0;
                end
        else
                begin
                           clk_count<=clk_count+1'b1;
                end
assign clk = clk_count[1];


//state machine              
always @ (STATE or sram_ab or error or task_start)
begin
     case(STATE)
     IDLE    : if(task_start)
                   NEXT = WRITE_1;
               else
                   NEXT = IDLE   ;
     WRITE_1 : NEXT = WRITE_2;
     WRITE_2 : if( sram_ab >= 18'h3ffff)
                   NEXT = READ_1;
               else
                   NEXT = WRITE_1;
     READ_1  : NEXT = READ_2;
     READ_2  : if(  sram_ab >= 18'h3ffff)//error ||
                   NEXT = IDLE;
               else
                   NEXT = READ_1;
     default : NEXT = IDLE ;
     endcase
end

//registe the state
always @ (posedge clk or negedge rst)
if(!rst)
    STATE <= IDLE;
else
    STATE <= NEXT;


always @ (posedge clk or negedge rst)
if(!rst)
    begin
        sram_ab      <=18'h3ffff;
        sram_db_reg  <=16'hffffffff;
        sram_wr      <=1'b1;
        sram_rd      <=1'b1;
    end
else
    case(STATE)
    IDLE    : begin
                  sram_rd     <= 1;
                  sram_wr     <= 1;
              end
    WRITE_1 : begin
                  sram_ab     <= sram_ab+1;
                  sram_db_reg <= sram_db_reg+1;
                  sram_wr     <= 1'b0;
                  sram_rd     <= 1'b1;  
              end
    WRITE_2 : begin
                  sram_wr  <= 1'b1;
                  sram_rd  <= 1'b1;
     //             if( sram_ab >= 18'h3ffff)
     //                  sram_ab <= 18'h3ffff;
              end
    READ_1  : begin
                  sram_ab <= sram_ab+1;
                  sram_wr <= 1'b1;
                  sram_rd <= 1'b0;
                  sram_db_reg <= 'hffffffff;
              end
    endcase


always @ (posedge clk or negedge rst)      
if(!rst)                                    
   begin                                    
       error      <= 1'b0;
       task_start <= 1'b1;
       task_finish<= 1'b0;
       count      <= 16'hffff;                           
   end                                       
else                                         
   case(STATE)
                     
   WRITE_1 : //if( sram_ab < 'd1024 )
               begin                           
                    task_start <= 1'b1;
                    count      <= 16'hffff;
               end
   READ_1  : begin
                 count<=count+1;
             end                                                               
   READ_2  : begin                           
                 if( sram_db != count)
                     error <= 1'b1;
                  else
                    begin                       
                       error <= 1'b0;
                       if(sram_ab >= 18'h3ffff)
                          begin
                             task_finish <= 1'b1;
                             //task_start  <= 1'b1;
                          end
                    end              
             end                             
   endcase                                   
  
endmodule


就是最后两个always为什么要那样写呢???谢谢
 楼主| sihaiguoxin 发表于 2010-9-25 16:14:12 | 显示全部楼层
这当中应该是一个分频的,一个状态机(三段式的),然后后面两个always搞不懂了
注意一点的是sram_rd是一个读写信号,高为读,低为写;sram_wr是输出使能,跪求高人指点
losboy 发表于 2011-7-5 23:49:04 | 显示全部楼层
我也看不懂,希望能有人帮助一下
luner 发表于 2011-7-7 17:15:36 | 显示全部楼层
我也需要这么段代码,跪求高人指点下~
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-6-17 20:01 , Processed in 0.061051 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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