VHDL不支持自定义类型

VHDL不支持自定义类型,vhdl,Vhdl,所以我用VHDL在一台简单的计算机上工作,我用一种自定义类型的控制信号创建了我的ALU,让合成器自由选择一种特定的编码方案,简化了ALU逻辑。太好了 然后我去写控制单元,对于一些操作,ALU没有被使用。理想情况下,对于这些循环,我会为ALU控制信号指定一个不关心的条件,以避免潜在地需要一堆额外的逻辑来迫使它进入一个我可能选择不好的特定状态。但是,我找不到任何关于如何或是否可能为自定义类型的信号指定不关心条件的信息。用std_逻辑_向量替换alu_op信号修复了控制单元的问题,但随后需要我手动指定

所以我用VHDL在一台简单的计算机上工作,我用一种自定义类型的控制信号创建了我的ALU,让合成器自由选择一种特定的编码方案,简化了ALU逻辑。太好了

然后我去写控制单元,对于一些操作,ALU没有被使用。理想情况下,对于这些循环,我会为ALU控制信号指定一个不关心的条件,以避免潜在地需要一堆额外的逻辑来迫使它进入一个我可能选择不好的特定状态。但是,我找不到任何关于如何或是否可能为自定义类型的信号指定不关心条件的信息。用std_逻辑_向量替换alu_op信号修复了控制单元的问题,但随后需要我手动指定alu中的编码。有没有什么方法可以让合成器选择ALU编码,并在控制单元中生成逻辑而不在意

我的自定义类型在包文件中定义为

type ALU_op is (PASS_A, PASS_B, ADD, SUB);
然后ALU看起来像:

entity ALU is 
    GENERIC(N : integer := 8);
    PORT(
        A, B : IN unsigned(N-1 downto 0);
        OP : IN ALU_op;
        R : OUT unsigned(N-1 downto 0)
    );
end ALU;

architecture arch of ALU is
    signal result : unsigned(N-1 downto 0);
begin
    with OP select
    R <= 
        A when PASS_A,
        B when PASS_B,
        A+B when ADD,
        A-B when SUB;
end arch;
然后在控制单元中,我不想做其他事情,比如:

process(state)
begin
    case state is
        when S1 => alu_op <= PASS_A;
        when S2 => alu_op <= ADD;
        when S3 => alu_op <= ???; --Don't Care, currently have to pick an arbitrary value
        ... (etc)
    end case;
end process;

我意识到对于这个小例子来说,它不会有太大的区别,但它似乎是可能的,并且在更复杂的系统中可能非常有益。谢谢

除了在您的类型中添加一个“不在乎”,它将合并到您将在ALU中执行的操作中,我看不出有任何方法可以做到这一点。。。顺便说一句,不管别人用的是什么类型的,你都应该有一个答案。首先你要问,真的有问题吗?因此,综合使用枚举类型的设计,即您当前拥有的4种类型和一种使用std_logic_vector的类型,而不必在意。它们大小不同吗?有什么不同吗?比如你可以更快地运行设计?这两种编码风格是否更易于维护?不太可能减少ALU-OTOH的大小,如果添加额外的枚举值,则可能会增加大小。一个有效的X映射可能在生成PASS_A、PASS_B…时节省很少的逻辑,但同样,您可能不会。@B.Go我并不总是建议使用其他映射。与select或case语句一起使用时,必须涵盖所有情况。对于自定义类型,使用“其他”可能会掩盖您忘记某些选项的事实。因此,显式且不包含when-others案例意味着编译器将拾取您忘记的内容。