这是本人写的关于将视频解码后的YCbCr422中一帧图像的亮度信号Y保存到sram中,写完一帧后从sram读出进行后续分析的verilog HDL代码。现在的问题是输出的数据仅仅是最后一个数据,而地址却是逐渐累加的,没发现什么错误。希望高手们给分析一下,不胜感激!!! VGA分辨率640*480  sram是256*16 的。最后可以帮忙改正一下。 
 
 
 
module sram_c5( 
  VGA_VS, 
  VGA_HS, 
  iclk, 
  swit, 
  Yw, 
  sram_addr, 
  sram_data, 
  sram_oe_n, 
  sram_ce_n, 
  sram_we_n, 
  sram_lb_n, 
  sram_ub_n, 
  led, 
  sram_odata, 
  ); 
input                  VGA_VS; 
input                  VGA_HS;   
input[7:0]                 Yw; 
input                    iclk; 
output[17:0]        sram_addr; 
inout[7:0]          sram_data; 
input                    swit; 
output  sram_oe_n,sram_ce_n,sram_we_n,sram_lb_n,sram_ub_n; 
output[7:0]              led; 
output[7:0]       sram_odata; 
 
wire               sram_oe_n1; 
wire               sram_we_n1; 
wire               sram_we_n2; 
wire               sram_oe_n2; 
wire                      con; 
wire[7:0] sram_data,sram_idata,sram_odata; 
wire[17:0] sram_addr1,sram_addr2; 
 
sram_wr sram_wr( 
 .iclk(iclk), 
 .Yw(Yw), 
 .VGA_VS(VGA_VS), 
 .VGA_HS(VGA_HS), 
 .sram_data(sram_data), 
 .swit(swit), 
 .sram_oe_n1(sram_oe_n1), 
 .sram_we_n1(sram_we_n1), 
 .sram_addr1(sram_addr1), 
 .con(con) 
 ); 
 
 
sram_rd sram_rd( 
    .swit(swit), 
 .iclk(iclk), 
 .sram_data(sram_data), 
 .sram_odata(sram_odata), 
 .led(led), 
 .sram_oe_n2(sram_oe_n2), 
 .sram_we_n2(sram_we_n2), 
 .sram_addr2(sram_addr2), 
 .con(con) 
); 
 
assign sram_ce_n=0; 
assign sram_lb_n=0; 
assign sram_ub_n=1; 
assign sram_addr=(!con)?sram_addr1:sram_addr2; 
assign sram_oe_n=(!con)?sram_oe_n1:sram_oe_n2; 
assign sram_we_n=(!con)?sram_we_n1:sram_we_n2; 
 
 
 
endmodule  
 
 
 
 
 
 
 
//       下面是写的模块 
 
module sram_wr( 
  sram_data, 
  Yw, 
  VGA_VS, 
  VGA_HS, 
  sram_addr1, 
  iclk, 
 
  swit, 
  sram_oe_n1, 
  sram_we_n1, 
  con    
 
 ); 
input                         iclk; 
input[7:0]                  Yw; 
output[17:0]        sram_addr1; 
input                     swit; 
input                   VGA_VS; 
input                   VGA_HS; 
output[7:0]           sram_data; 
output   sram_oe_n1,sram_we_n1; 
output                     con; 
reg[7:0]               wr_data; 
reg[17:0]               addr_r; 
reg                 sram_we_n1; 
reg                 sram_oe_n1; 
//-----------------------下面的上升沿是为了检测一帧的开始------------------------------------------// 
reg pluse_buf1; 
reg pluse_buf2; 
always @(posedge iclk) 
begin  
      pluse_buf1<= VGA_VS; 
      pluse_buf2<=pluse_buf1; 
end 
assign   pluse_raise1 = pluse_buf1  & (~pluse_buf2);//-----------vs--------------- 
 
 
 
 
 
reg flag;  
 
 
always@(posedge pluse_raise1) begin 
 if(!swit) flag<=0; 
 else begin  
     if(VGA_VS) flag<=1; 
   end 
end   
 
//----------------------------------------------------- 
 
 
 
 
 
reg con; 
always@(posedge iclk) begin 
   if(!swit) begin 
         wr_data<=8'd0; 
         addr_r<=18'd0; 
         con<=0; 
         sram_we_n1<=1; 
         sram_oe_n1<=1; 
         end 
   else if(!con) begin 
           if(flag) begin 
              if(VGA_VS) begin 
                    if(VGA_HS) begin      
                      sram_we_n1<=0;  
                      sram_oe_n1<=1; 
                      addr_r<=addr_r+1;          
                      wr_data<=Yw; 
                     end  
                 end                                        
             else begin 
                con<=1; 
               end   
                
          end  
             
     end  
end 
 
assign sram_addr1=addr_r; 
assign sram_data=(!sram_we_n1)?wr_data:8'hzz; 
 
 
endmodule     
 
 
 
 
 
下面是读的模块 
 
 
 
module sram_rd( 
  swit, 
  sram_odata, 
  sram_data, 
  sram_addr2, 
  iclk, 
  con, 
  sram_oe_n2, 
  sram_we_n2, 
  led 
  ); 
input                       swit; 
input                       iclk; 
output[7:0]           sram_odata; 
output[17:0]          sram_addr2; 
input                        con; 
input[7:0]             sram_data; 
output     sram_oe_n2,sram_we_n2; 
output[7:0]                  led; 
  
reg[7:0]                 rd_data; 
reg[17:0]                 addr_r; 
reg                   sram_oe_n2; 
 
 
wire                     VGA_4CLK; 
reg[23:0]                     cnt1; 
always@(posedge iclk) 
cnt1<=cnt1+1; 
assign VGA_4CLK=cnt1[23]; 
 
 
reg[17:0] cnt2; 
always@(posedge VGA_4CLK) begin 
   if(con&&swit) cnt2<=cnt2+1; 
   else cnt2<=17'b0; 
end 
 
 
assign     sram_we_n2=1; 
always@(posedge VGA_4CLK) begin 
  if(con&&swit) begin 
    if(cnt2<17'd47) begin 
         sram_oe_n2<=0; 
         addr_r<=cnt2; 
         rd_data<=sram_data; 
         end 
    else  begin 
         sram_oe_n2<=1; 
         rd_data<=8'h0;      
         end  
     end    
end 
 
assign sram_addr2=addr_r; 
assign sram_odata=rd_data; 
assign led=sram_odata; 
 
endmodule |