-1

我目前正在尝试使用以前制作的组件设计程序计数器(PC)。我设计的模型在这里看起来像这张照片

我遇到的问题是将我的 MUX 组件连接到 PC 寄存器组件。我应该使用给定的信号,但我不确定如何准确连接它们。AS代表,编译后我收到

错误 (10028):无法在 pc_update.vhd(52) 解析网络“PC_next[31]”的多个常量驱动程序

...

错误 (10028):无法在 pc_update.vhd(52) 解析网络“PC_next[14]”的多个常量驱动程序

错误 (10029):pc_update.vhd(63) 中的常量驱动程序

错误:无法详细说明顶级用户层次结构

我知道那是因为我有两个组件试图写入同一个信号,这是错误的,我只是不知道应该如何修复它。任何帮助表示赞赏。

这是我得到的代码,我的实现从第 41 行的 begin 语句开始。

library ieee ;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

---------------------------------------------------

entity pc_update is
    port( clk: in std_logic; -- clock
        incH_ldL: in std_logic; -- increment PC = PC + 4 when high,
                                -- load PCInput when low
        PCInput: in std_logic_vector(31 downto 0); -- external input for PC
        InstrAddr: out std_logic_vector(31 downto 0) ); -- instruction address
end entity pc_update;

----------------------------------------------------

architecture pc_update_arch of pc_update is

    component register32 is
        port( clr: in std_logic; -- async. clear
              clk: in std_logic; -- clock
               ld: in std_logic; -- load
                D: in std_logic_vector(31 downto 0); -- data input
                Q: out std_logic_vector(31 downto 0) ); -- data output
    end component register32;

    component mux2to1_32 is
        port( sel: in std_logic; -- selection bit input
               X0: in std_logic_vector(31 downto 0); -- first input
               X1: in std_logic_vector(31 downto 0); -- second input
                Y: out std_logic_vector(31 downto 0)); -- output
    end component mux2to1_32;


    signal PC_current: std_logic_vector(31 downto 0); -- the current state of
                                                      -- PC reg
    signal PC_add_4: std_logic_vector(31 downto 0); -- output from the adder 
    signal PC_next: std_logic_vector(31 downto 0); -- output from the MUX

    begin

        PC: register32 Port Map(  --32 bit register
           clk => '1', 
            ld => '1',  
             D => PC_next, 
             Q => PC_Current 
           );

       MUX: mux2to1_32 Port Map(  -- 32 bit multiplexor
          sel => incH_ldL, 
           X0 => PCInput ,
           X1 => PC_add_4,
            Y =>  PC_next 
         );


    PC_add_4 <= (PC_current + 4);

    process (incH_ldL, clk, PC_next, PC_current)
        begin
        if rising_edge(clk) then
            if  (incH_ldL = '0') then
                PC_next <= PCInput;
            else PC_next  <= PC_add_4;
            end if;
        end if; 
        InstrAddr <= PC_current;    
    end process;

end architecture pc_update_arch; 

编辑因为它似乎需要。这是 mux2to1_32 和 register32 register32 的代码

library ieee ;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

---------------------------------------------------

entity register32 is port( 
clr: in std_logic; -- async. clear
clk: in std_logic; -- clock
 ld: in std_logic; -- load
  D: in std_logic_vector(31 downto 0); -- data input
  Q: out std_logic_vector(31 downto 0) ); -- data output
end entity register32;

----------------------------------------------------

architecture register32_arch of register32 is

begin 
    process(clk, clr)
    begin
        if clr = '1' then
            q <= x"00000000";
        elsif rising_edge(clk) then
           if ld = '1' then
                q <= d;
           end if;
        end if;
    end process;
END register32_arch;

mux2to1_32

library ieee ;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

---------------------------------------------------

entity mux2to1_32 is
port( sel: in std_logic; -- selection bit input
X0: in std_logic_vector(31 downto 0); -- first input
X1: in std_logic_vector(31 downto 0); -- second input
Y: out std_logic_vector(31 downto 0)); -- output

end entity mux2to1_32;

----------------------------------------------------

architecture mux2to1_32_arch of mux2to1_32 is
begin

    Y <= X1 when (SEL = '1') else X0;

end architecture mux2to1_32_arch; 
4

1 回答 1

0

你的进程和MUX实例做几乎相同的事情(假设你的mux2to1_32作品命名)。然而,该过程会产生一个注册输出(因为它只作用于时钟边沿)。您需要删除其中一个。

请注意,对于您的流程,incH_ldL并不PC_next需要在敏感列表中,因为您只在clk有事件时才查看它们(这已经在敏感列表中)。PC_current如果Instr_addr <= PC_current将其移出流程以成为独立的并发语句,也可以将其取出 - 没有理由将其捆绑在流程中。

另请注意,您没有分配clr端口 onPC并且您分配clk'1',这几乎肯定是一个错误。

事实上,您使用的组件几乎完全没有必要。整个设计可以通过 1 个内部信号、与您所拥有的过程类似的过程以及单个并发语句来完成:

architecture pc_update_arch of pc_update is
    signal PC : std_logic_vector(31 downto 0):=(others=>'0');
begin
    process (clk)
        begin
        if rising_edge(clk) then
            if  (incH_ldL = '0') then
                PC <= PCInput;
            else
                PC <= PC + 4;
            end if;
        end if; 

    end process;
    InstrAddr <= PC;
end architecture pc_update_arch;

如果您确实希望使用组件进行实现,则根本不需要描述任何逻辑 - 只需描述连接信号。

于 2014-12-01T03:02:54.167 回答