0

我有一个应用程序,我以低时钟速度(clk_a)连续写入块内存,并且在这个慢时钟周期内需要以快速时钟速度(clk_b)从块内存读取三个索引以使用这些值作为数学模块中的操作数,结果在下一个慢时钟上写回块 ram。这三个索引是在慢时钟 posedge 写入的当前地址,加上两个直接相邻地址(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

0

关于效率,以下方法应该有效,并且不需要更快的时钟:

module myRam2 (
 input wire clk,
 input wire we,
 input wire re,
 input wire [10:0] addr_a,
 input wire [10:0] addr_b,
 input wire [11:0] din_a,
 output reg [11:0] leftNeighbor,
 output reg [11:0] currentX,
 output reg [11:0] rightNeighbor
);

reg [11:0] ram2 [2047:0];/* synthesis syn_ramstyle = "no_rw_check" */;

always @(posedge clk) begin
    if(we)  ram2[addr_a]                            <= din_a;
    if(re)  {leftNeighbor,currentX,rightNeighbor}   <= {ram2[addr_b-1],ram2[addr_b],ram2[addr_b+1]};
end

endmodule

过去,综合关键字帮助我增加了正确推断 ram 的可能性。

编辑:删除了第二个建议一维映射的示例。事实证明,至少莱迪思 LSE 无法处理这种方法。然而,第一个代码剪切应该根据 Active-HDL 和 Lattice LSE 工作。

于 2020-07-18T22:18:12.047 回答