我在Logisim上实现了一个单周期处理器,主要有5个子电路(所有子电路都设计复杂,用于主电路)。这5个子电路将在主电路中彼此之间具有复杂的链路。在第3个子电路中,我使用的是RAM,它基本上表示我访问的寄存器文件。该寄存器文件也可以在各个其他阶段访问/编辑。我想知道是否有任何方法,这样当其中一个阶段改变RAM(寄存器文件)中的一个值时,它会在所有子电路(和主电路)中发生变化。我希望我的寄存器文件充当通用RAM,因此它是整个电路中的单个实体。
我尝试使用子电路的符号并提供各种输入和输出,但如果输入改变了该子电路中的RAM,则在其他子电路中不会改变。
答案 0 :(得分:2)
VHDL中有一项功能可以提供类似于您所要求的功能。但在我们讨论之前,您应该听取Brian的意见,并使您的注册文件成为您设计中的正确实体。这将迫使您准确地思考部件将如何相互作用,这在某些时候您将不得不这样做。
我所说的功能是全球信号。它们可以在包中声明并在各种实体中使用。公平地说,我认为这不是一个好主意。这可能不会像您期望的那样使您的设计更清晰;它会使它变得更加神秘。无论如何,你可以自由尝试,然后告诉我们你的结论。
这是一个显示我的意思的小例子。它不应该做任何有用的事情,但它在ModelSim中运行正常并在Quartus 12.1中合成ok:
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;