利用RAM实现a,b两路数据延迟

2019-07-16 00:50发布

想利用RAM块实现a,b两路数据的延迟,其中a,b都是32位,速率为61.44Mb/s ,要求a路延迟16个数据时钟周期,b路延迟8个数据周期
请各位帮忙瞧一瞧代码哪里有问题??我怎么也查不出问题来,也没有报错就是仿真得出的结果不对!!!!!!!!!!!!

`timescale 1ns / 1ps
//利用RAM实现两路数据的延迟,其中a,b都是32位,速率为61.44Mb/s ,要求a路延迟16个数据时钟周期,b路延迟8个数据周期
module bram_delay(clk_122p88MHz,a,b,a_delay,b_delay);
  input clk_122p88MHz;
  input [31:0] a;
  input [31:0] b;
  output [31:0] a_delay;
  output [31:0] b_delay;

  reg [31:0] a_delay;
  reg [31:0] b_delay;
  wire[5:0] addra,addrb;
  wire[31:0] douta,doutb;
  reg[5:0] addra1=0;
  reg[5:0] addra2=0;
  reg[5:0] addrb1=32;
  reg[5:0] addrb2=32;
  reg wea=0;
  reg web=0;
  reg flag=0;

  always@(posedge clk_122p88MHz)
    begin
           flag<= !flag;
                  if(flag ==1'b1)               
                  begin                     
                    a_delay<=a_delay;
                         b_delay<=b_delay;      
                         wea<=1'b1;
                         web<=1'b1;
                         addra2<=addra2;
                         addrb2<=addrb2;
                         if(addra1==31)
                           addra1<=0;
                         else
                           addra1<=addra1+1'b1;
                         if(addrb1==63)
                           addrb1<=32;
                         else
                           addrb1<=addrb1+1'b1;
                  end
                 else
                   begin
                          wea<=1'b0;            
                          web<=1'b0;
                          a_delay<=douta;
                          b_delay<=doutb;
                          addra1<=addra1;
                          addrb1<=addrb1;
                          if(addra1<=15)        //控制A路延迟的时间
                            addra2<=addra1+16;  
                          else
                            addra2<=addra1-16;
                          if(addrb1<=39)       //控制B路延迟的时间
                            addrb2<=addrb1+8;//........................
                          else
                            addrb2<=addrb1-8;
                        end
         end
         assign addra=!flag?addra1:addra2;
         assign addrb=!flag?addrb1:addrb2;
         
         bram_16 bram_16 (
  .clka(clk_122p88MHz), // input clka
  .wea(wea), // input [0 : 0] wea
  .addra(addra), // input [3 : 0] addra
  .dina(a), // input [31 : 0] dina
  .douta(douta), // output [31 : 0] douta
  .clkb(clk_122p88MHz), // input clkb
  .web(web), // input [0 : 0] web
  .addrb(addrb), // input [3 : 0] addrb
  .dinb(b), // input [31 : 0] dinb
  .doutb(doutb) // output [31 : 0] doutb
);

endmodule


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
youzizhile
2019-07-16 05:56
现在的程序相当于是在程序第一个clk_122p88MHz上升沿处理    if(flag ==1'b1)  后的程序,第二个clk_122p88MHz上升沿处理else后的程序。还有一个错误是程序没有初始化存储器 a_delay和b_delay;
   
    设计fpga程序,首先要画出时序逻辑图,然后根据逻辑图来编写程序,这样编写完程序后就可以有目的的验证,不要先动手编程序,要不然还要从头开始设计。
   

一周热门 更多>