最新日志

发表于:2007-12-24 16:20:36
标签:FPGA  Verilog  

0

一个Verilog程序,仿真不出想要的结果,请高手指点

     程序如下,想要实现如下功能:FVAL为帧有效信号,LVAL为行有效信号,flag1,flag2分别为两个存储器的标志信号,flag1为0时,向第一个存储器中存入数据,为1时读取第一个存储器中的数据;flag2为第二个存储器的标志信号,功能同flag1。

 d[31:0]为输入的32位数据信号,通过FPGA存储到两个外部存储器中。r[31:0]为内部寄存器,D1[31:0],D2[31:0]为输出到两个存储器数据信号。rst为复位信号,STROBE为时钟信号,其它为存储器使能信号。

module  acquisition(FVAL,LVAL,d,STROBE,rst,addr1,addr2,WE1,WE2,CS1,CS2,
                   D1,D2);
        
         input FVAL,LVAL;
         input STROBE;
         input rst;
         input[31:0] d;
        
        
         output[3:0] WE1,WE2;
         output[3:0] CS1,CS2;
         output[16:0]addr1,addr2;
         output[31:0] D1,D2;

        reg OE1,OE2;
        reg[3:0] WE1,WE2;
        reg[3:0] CS1,CS2;
        reg[16:0] addr1,addr2;
        reg[31:0] D1,D2 ;
        reg[31:0]r ;//寄存数据
        reg flag1;
        reg flag2;

   
       
    always@(posedge STROBE or posedge rst)
      begin
       if(rst)
         begin
          D1<=32'b00000000000000000000000000000000;
          D2<=32'b00000000000000000000000000000000;
         end
       else if(flag1==0)
         D1[31:0]<=r[31:0];
       else if(flag2==0)
         D2[31:0]<=r[31:0];
      end

      

    always@(posedge STROBE or posedge rst)
      if(rst)
        begin
         r[31:0]<=32'b00000000000000000000000000000000;
        end
      else if(FVAL&&LVAL)
        begin
         r[31:0]<=d[31:0];
        end

  always@(posedge rst or posedge FVAL)
  begin
    @(posedge rst)
     begin
      flag2<=1;
      flag1<=0;
     end
    @(posedge FVAL)
     begin
      flag1<=~flag1;
      flag2<=~flag2;
     end
  end 
  
 
always@(posedge STROBE or posedge rst)
      begin
       if(rst)
         addr1<=17'd0;
       else if(FVAL&&LVAL&&(!flag1))
         addr1<=addr1+17'd1;
       else if(!FVAL)
         addr1<=0;
       else if(flag1)
         addr1<=addr1+17'd1;
      end

   always@(posedge STROBE or posedge rst)
     begin
       if(rst)
         addr2<=17'd0;
       else if(FVAL&&LVAL&&(!flag2))
         addr2<=addr2+17'd1;
       else if(!FVAL)
         addr2<=0;
       else if(flag2)
         addr2<=addr2+17'd1;
     end 

  
    always@(posedge STROBE or posedge rst)
      begin
       if(rst)
          begin
          CS1[3:0]<=4'b1111;
          CS2[3:0]<=4'b1111;
          WE1[3:0]<=4'b1111;
          WE2[3:0]<=4'b1111;
          end
       else if(FVAL&&LVAL&&(!flag1))
          begin
          CS1[3:0]<=4'b0000;
          WE1[3:0]<=4'b0000;
          end
       else if(FVAL&&LVAL&&(!flag2))
          begin
          CS2[3:0]<=4'b0000;
          WE2[3:0]<=4'b0000;
          end
      else if(!FVAL)
          begin
          CS1[3:0]<=4'b1111;
          CS2[3:0]<=4'b1111;
          WE1[3:0]<=4'b1111;
          WE2[3:0]<=4'b1111;
          end
   end
  endmodule   

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(409)
总共 , 当前 /