0

我在 Logisim 上实现了一个单周期处理器,它主要有 5 个子电路(所有复杂的设计都用于主电路)。这 5 个子电路将在主电路中相互连接。在第三个子电路中,我使用的是 RAM,它基本上表示我访问的寄存器文件。该寄存器文件也在其他各个阶段被访问/编辑。我想知道是否有任何方法,这样当其中一个阶段更改 RAM(寄存器文件)中的值时,它会在所有子电路(以及主电路)中发生更改。我希望我的寄存器文件充当通用 RAM,以便它是整个电路中的单个实体。

我尝试使用子电路的符号并提供各种输入和输出,但如果输入改变了该子电路中的 RAM,它在其他子电路中不会改变。

4

1 回答 1

2

VHDL 中有一个功能可以提供类似于您所要求的内容。但在我们开始之前,您可能应该听听 Brian 的意见,并使您的注册文件成为您设计中的适当实体。这将迫使您准确思考这些部分将如何交互,您必须在某些时候这样做。

我正在谈论的功能是全局信号。它们可以在包中声明并在各种实体中使用。公平地说,我认为这不是一个好主意。如您所料,这可能不会使您的设计更清晰;它会使它更加神秘。无论如何,您可以自由尝试,然后告诉我们您的结论。

这是一个小例子来说明我的意思。它不应该做任何有用的事情,但它在 ModelSim 中运行正常并且在 Quartus 12.1 中合成正常:

package register_file_pkg is
    type register_file_type is array (0 to 31) of integer range 0 to 255;
    signal register_file: register_file_type;
    alias pc is register_file(31);
end;
--------------------------------------------------------------------------------
use work.register_file_pkg.all;

entity alu is
    port (
        clock: in bit;
        zero_flag: out boolean;
        last_pc_flag: out boolean
    );
end;

architecture rtl of alu is
begin
    zero_flag <= (register_file(0) = 0);
    last_pc_flag <= (pc = 255);

    process (clock) begin
        if clock'event and clock = '1' then
            register_file(0) <= pc / 4;
        end if;
    end process;
end;
--------------------------------------------------------------------------------
library ieee;
use ieee.numeric_bit.all;
use work.register_file_pkg.all;

entity cpu is
    port (
        clock: in bit;
        address_bus: out integer;
        zero_flag: out boolean;
        last_pc_flag: out boolean
    );
end;

architecture rtl of cpu is
begin
    address_bus <= pc;

    process (clock) begin
        if clock'event and clock = '1' then
            pc <= pc + 1;
        end if;
    end process;

    cpu_alu: entity work.alu
        port map(
            clock => clock,
            zero_flag => zero_flag,
            last_pc_flag => last_pc_flag
        );
end;
于 2013-11-14T19:42:30.617 回答