0

低速のクロック速度 (clk_a) でブロック RAM に継続的に書き込みを行うアプリケーションがあり、この低速のクロック サイクル内で高速のクロック速度 (clk_b) でブロック RAM から 3 つのインデックスを読み取って、これらの値を次のように使用する必要があります。結果は、次の遅いクロックでブロック RAM に書き戻されます。これらの 3 つのインデックスは、低速クロックのポーズエッジで書き込まれた現在のアドレスと、すぐ隣の 2 つのアドレス (addr_a -1 および addr_a +1) です。

これを合成する効率的な方法は何ですか?これまでの私の最善の試みは、アドレスをインクリメントする高速クロック レートで実行される小さなカウンター (トリプレット) を使用することですが、Yosys が RAM を適切に推測していないように見えるため、ロジックが不足してしまいます。これにはどのような戦略が適していますか?

ここに私が持っているものがあります:

module myRam2 (
 input clk_a,
 input clk_b,
 input we_a,
 input re_a,
 input [10:0] addr_a,
 input [10:0] addr_b,
 input [11:0] din_a,
 output [11:0] leftNeighbor,
 output [11:0] currentX,
 output [11:0] rightNeighbor
);
  parameter MEM_INIT_FILE2 = "";
 initial
    if (MEM_INIT_FILE2 != "")
      $readmemh(MEM_INIT_FILE2, ram2);
     
reg [11:0] ram2 [0:2047];
reg [1:0] triplet = 3;
reg [10:0] old_addr_a;
reg [11:0] temp;

always @(posedge clk_a) begin
    ram2[addr_a] <= din_a;
end

always@(posedge clk_b) 
if (old_addr_a != addr_a) begin
        triplet <= 0;
        old_addr_a <= addr_a;
        end
    else 
        if(triplet < 3) begin
            triplet <= triplet +1;
        end



  
  always @(posedge clk_b) begin
        temp <= ram2[addr_a + (triplet - 1)];
end

always @(posedge clk_b) begin
case(triplet)
0: leftN <= temp;
1: X <= temp;
2: rightN <= temp;
endcase
end



reg signed [11:0] leftN;
reg signed [11:0] X;
reg signed [11:0] rightN;


assign leftNeighbor = leftN;
assign currentX = X;
assign rightNeighbor = rightN;

endmodule
4

1 に答える 1