仅对英特尔可见 — Ixiasoft
2.4.2.1. 高速时钟域(High-Speed Clock Domains)
2.4.2.2. 重构环路(Restructuring Loops)
2.4.2.3. 控制信号反压(Control Signal Backpressure)
2.4.2.4. 使用FIFO状态信号的流程控制
2.4.2.5. 包含skid缓冲器的流程控制
2.4.2.6. Read-Modify-Write存储器
2.4.2.7. 计数器和累加器
2.4.2.8. 状态机
2.4.2.9. 储存器
2.4.2.10. DSP模块
2.4.2.11. 一般逻辑
2.4.2.12. 求模与除法
2.4.2.13. 复位
2.4.2.14. 硬件重用
2.4.2.15. 算法要求
2.4.2.16. FIFO
2.4.2.17. 三元加法器(Ternary Adders)
5.2.1. 不足的寄存器(insufficient Registers)
5.2.2. 短路径/长路径(short path/long path)
5.2.3. 快进限制(Fast Forward Limit)
5.2.4. 环路(loop)
5.2.5. 每个时钟域一个关键链
5.2.6. 相关时钟组中的关键链
5.2.7. 复杂的关键链
5.2.8. 延伸到可定位的节点
5.2.9. 域边界入口和域边界出口(Domain Boundary Entry and Domain Boundary Exit)
5.2.10. 包括双时钟存储器的关键链
5.2.11. 关键链比特和总线
5.2.12. 延迟线
仅对英特尔可见 — Ixiasoft
2.4.2.9.2. 使用简单双端口存储器
将一个设计移植到 Intel® Hyperflex™ 体系结构中时,请考虑原始设计是否包含一个双端口存储器(在每个端口上使用不同的时钟)以及运行该存储器的最大频率。如果您的设计实际上在两个写端口上使用相同的时钟那么需要使用两个简单双时钟存储器对其进行重组。
此方法的优势在于简单双端口模块支持高达1 GHz的频率。其劣势是实现存储器所需要的存储器模块的数量增加了一倍。
图 73. Intel® Arria® 10真双端口存储器实现之前版本的 英特尔® Quartus® Prime Pro Edition软件对 Intel® Arria® 10器件生成这一真双端口存储器结构。

双端口,双时钟存储器实现
module true_dual_port_ram_dual_clock #(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6) ( input [(DATA_WIDTH-1):0] data_a, data_b, input [(ADDR_WIDTH-1):0] addr_a, addr_b, input we_a, we_b, clk_a, clk_b, output reg [(DATA_WIDTH-1):0] q_a, q_b ); // Declare the RAM variable reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0]; always @ (posedge clk_a) begin // Port A if (we_a) begin ram[addr_a] <= data_a; q_a <= data_a; end else begin q_a <= ram[addr_a]; end end always @ (posedge clk_b) begin // Port B if (we_b) begin ram[addr_b] <= data_b; q_b <= data_b; end else begin q_b <= ram[addr_b]; end end endmodule
对使用不同写时钟的双端口存储器进行同步是很困难的。要确保两个端口不要同时对一个指定地址进行写操作。在很多设计中,双端口存储器通常对其中一个端口执行写操作,然后是使用这两个端口(1W2R)的两个读操作。您可以通过使用两个简单双端口存储器模型化此行为。在简单双端口存储器中,写操作总是写入两个存储器,而读操作取决于端口。