微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于FPGA时序约束设计请教!

关于FPGA时序约束设计请教!

时间:10-02 整理:3721RD 点击:
我有如下一段程序,在写BRAM时出现时序问题,主要是我的数据要写到4块BRAM里面,共512Byte,前128Byte写到BRAM0里面,接着写BRAM1,2,3,这样导致rx_bram_din_reg 信号是1托4,而且这个信号位宽是64位的,所以编译的时候时序约束不满足,请各位帮忙看看,我应该加什么样的约束,才能使得我的设计满足要求呀?非常感谢!
   always@(posedge clk)
   begin
    if(rst)
     begin
         rx_bram_din_reg  <= 64'b0;  
     end
else
  begin
      rx_bram_din_reg <=  rx_bram_din;
  end   
   end
always@(posedge clk)
   begin
    if(rst)
     begin
         rx_bram_wr_en0  <= 1'b0;
         rx_bram_wr_en1  <= 1'b0;
         rx_bram_wr_en2  <= 1'b0;
         rx_bram_wr_en3  <= 1'b0;
     end
else begin
     case(rx_bram_addr[5:4])
          2'b00:begin
          rx_bram_wr_en0  <= rx_bram_wr_en;
      rx_bram_wr_en1  <= 1'b0;
      rx_bram_wr_en2  <= 1'b0;
      rx_bram_wr_en3  <= 1'b0;
         end
   2'b01:begin
          rx_bram_wr_en0  <= 1'b0;
      rx_bram_wr_en1  <= rx_bram_wr_en;
      rx_bram_wr_en2  <= 1'b0;
      rx_bram_wr_en3  <= 1'b0;
         end
   2'b10:begin
          rx_bram_wr_en0  <= 1'b0;
      rx_bram_wr_en1  <= 1'b0;
      rx_bram_wr_en2  <= rx_bram_wr_en;
      rx_bram_wr_en3  <= 1'b0;
         end
    2'b11:begin
          rx_bram_wr_en0  <= 1'b0;
      rx_bram_wr_en1  <= 1'b0;
      rx_bram_wr_en2  <= 1'b0;
      rx_bram_wr_en3  <= rx_bram_wr_en;
         end      
              default: begin
                        rx_bram_wr_en0  <= 1'b0;
      rx_bram_wr_en1  <= 1'b0;
      rx_bram_wr_en2  <= 1'b0;
      rx_bram_wr_en3  <= 1'b0;
                       end
            endcase
end
   end
   
   assign   rx_doutb = {rx_doutb3[1023:0],rx_doutb2[1023:0],rx_doutb1[1023:0],rx_doutb0[1023:0]};
   
   DMA_BRAM rx_bram_inst0 (
     .clka(clk), // input clka
     .wea(rx_bram_wr_en0), // input [0 : 0] wea
     .addra({1'b0,rx_bram_addr_reg}), // input [4 : 0] addra
     .dina(rx_bram_din_reg ), // input [63 : 0] dina
     .douta(), // output [63 : 0] douta
     .clkb(clk), // input clkb
     .web(1'b0), // input [0 : 0] web
     .addrb(1'b0), // input [0 : 0] addrb
     .dinb(), // input [63 : 0] dinb
     .doutb(rx_doutb0) // output [1023 : 0] doutb
   );
   
   
   DMA_BRAM rx_bram_inst1 (
     .clka(clk), // input clka
     .wea(rx_bram_wr_en1), // input [0 : 0] wea
     .addra({1'b0,rx_bram_addr_reg}), // input [4 : 0] addra
     .dina(rx_bram_din_reg ), // input [63 : 0] dina
     .douta(), // output [63 : 0] douta
     .clkb(clk), // input clkb
     .web(1'b0), // input [0 : 0] web
     .addrb(1'b0), // input [0 : 0] addrb
     .dinb(), // input [63 : 0] dinb
     .doutb(rx_doutb1) // output [1023 : 0] doutb
   );
   DMA_BRAM rx_bram_inst2 (
     .clka(clk), // input clka
     .wea(rx_bram_wr_en2), // input [0 : 0] wea
     .addra({1'b0,rx_bram_addr_reg}), // input [4 : 0] addra
     .dina(rx_bram_din_reg ), // input [63 : 0] dina
     .douta(), // output [63 : 0] douta
     .clkb(clk), // input clkb
     .web(1'b0), // input [0 : 0] web
     .addrb(1'b0), // input [0 : 0] addrb
     .dinb(), // input [63 : 0] dinb
     .doutb(rx_doutb2) // output [1023 : 0] doutb
   );
   
      DMA_BRAM rx_bram_inst3 (
     .clka(clk), // input clka
     .wea(rx_bram_wr_en3), // input [0 : 0] wea
     .addra({1'b0,rx_bram_addr_reg}), // input [4 : 0] addra
     .dina(rx_bram_din_reg ), // input [63 : 0] dina
     .douta(), // output [63 : 0] douta
     .clkb(clk), // input clkb
     .web(1'b0), // input [0 : 0] web
     .addrb(1'b0), // input [0 : 0] addrb
     .dinb(), // input [63 : 0] dinb
     .doutb(rx_doutb3) // output [1023 : 0] doutb
   );

下面是时序报告:
SLICE_X69Y127.AQ        Tcko                  0.337   rx_dma_bram_wrapper_inst/rx_bram_din_reg<43>
                                                           rx_dma_bram_wrapper_inst/rx_bram_din_reg_40
     RAMB36_X6Y40.DIADI0     net (fanout=4)        9.339   rx_dma_bram_wrapper_inst/rx_bram_din_reg<40>
     RAMB36_X6Y40.CLKARDCLKL Trdck_DIA             0.707   rx_dma_bram_wrapper_inst/rx_bram_inst1/U0/xst_blk_mem_generator/gnativebmg.native_blk_mem_gen/valid.cstr/ramloop[20].ram.r/v6_init.ram/TRUE_DP.SIMPLE_PRIM36.ram
                                                           rx_dma_bram_wrapper_inst/rx_bram_inst1/U0/xst_blk_mem_generator/gnativebmg.native_blk_mem_gen/valid.cstr/ramloop[20].ram.r/v6_init.ram/TRUE_DP.SIMPLE_PRIM36.ram
     ----------------------------------------------------  ---------------------------
     Total                                        10.383ns (1.044ns logic, 9.339ns route)
                                                           (10.1% logic, 89.9% route)

你可以手工在RTL里将rx_bram_din_reg寄存器组duplicate成四份,并用preserve注释防止综合器对其进行优化,那样一拖四就变成一拖一了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top