0

我是 VHDL 编程的新手,我将做一个关于内置自我修复的项目。在这个项目中,我将设计不同大小的 RAM(256 B、8kB、16kB、32kB)等。并且这些 ram 必须使用 BIST 进行测试,然后它们应该被修复。所以请通过举一个例子来帮助我,比如如何设计带有“n”行和列的 RAM

4

2 回答 2

1

Start by drawing a block diagram of the RAM at the level of abstraction you want (probably gate-level). Then use VHDL to describe the block diagram.

You should probably limit yourself to a behavioral description, i.e., don't expect to be able to synthesize it. Synthesis for FPGAs usually expects a register-transfer-level description, and synthesis for ASICs is not something I would recommend for a VHDL beginner.

于 2013-09-25T09:09:01.300 回答
0

我假设您想使用 SRAM,因为这是最简单的情况。另外,假设您想用 RAM_DEPTH 字对 RAM 建模,每个字都是 RAM_DATA_WIDTH 位宽。一种可能的方法是在三个模块中构建您的解决方案:

  1. 一个保存 RAM 位的模块。此模块应具有 RAM 的典型端口:时钟、复位(可选)、write_enable、data_in、data_out。请注意,每个 RAM 字的宽度应足以容纳数据位以及奇偶校验位,奇偶校验位是冗余位,可让您纠正任何错误。您可以在此处阅读有关用于内存校正的汉明码:http: //bit.ly/1dKrjV5。您可以在此处查看 Doulos 的 RAM 修改示例:http: //bit.ly/1aq1tn9

  2. 第二个模块循环遍历所有内存位置,根据需要修复它们。这应该在重置后立即发生。请注意,这可能需要很多时钟周期(至少 RAM_DEPTH 时钟周期)。另请注意,它不会在 VHDL 中实现为循环。您可以使用计数器来实现它,然后使用计数值作为读取地址,通过 EDC 函数传递数据值,然后将更正后的值写回 RAM 模块。

  3. 一个顶级实体(可选),实例化模块 (1) 和 (2),并协调流程。该模块可能有一个“init_done”引脚,在验证和纠正发生后将被断言。使用 RAM 的模块应检查此引脚,以了解开始使用 RAM 是否安全。

总而言之,您可以在重置时遍历所有内存位置,并根据需要使用纠错码修复它们。在确保所有内存位置都正常后,只需声明一个“init_done”信号。

于 2013-09-26T01:53:54.677 回答