低速のクロック速度 (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