根据泛型定义“枚举”类型

时间:2013-05-30 16:39:38

标签: vhdl

我正在写一个状态机,它有一个通用参数,有些状态依赖于此。由于我的状态定义为枚举(不知道它的vhdl术语),我想知道我是否可以定义这个枚举,具体取决于泛型:

generic(x: bool);  -- in the entity
....

architecture ...
    if x then generate
        type states_t is (State1, State2, State3ifX)
    else
        type states_t is (State1, State2)
    end generate;
    variable state : states_t;
begin
   case state is
       ....
       if x then generate
           when State3ifX =>
                ...
       end if;
   end case
end architecture;

我是否必须携带自重(状态3的逻辑,危险进入它(在我的情况下无关紧要,因为我不期望辐射),自ceil(ld(3))=2 > ld(2)=1以来的额外位),或者是否有剥离不必要的状态的可能性?

(在我的情况下,有几种状态可以剥离,但是单独的架构在努力时是不值得的)

3 个答案:

答案 0 :(得分:2)

您可以在使用泛型生成的流程中定义" state" -type。请参阅下面的参考示例:

entity blabla is
   generic(sel: std_logic := '0');
port(
...

architecture Behavioral of blabla is
begin

q1: if sel='0' generate
p: process(clk)
    type t_state is (s1, s2, s3);
    variable state: t_state;
begin
    if rising_edge(clk) then
       ...
    end if;
end process;
end generate;

q2: if sel='1' generate
p: process(clk)
    type t_state is (s1, s2);
    variable state: t_state;
begin
    if rising_edge(clk) then
        ...
    end if;
end process;
end generate;

答案 1 :(得分:1)

我想不出能达到你需要的方法。

从好的方面来说,你担心必须“携带自重(对于state3的逻辑,危险进入它)”并不是你需要担心的事情 - 合成器会优化逻辑离开,所以状态寄存器只会达到你实际可以达到的状态所需的大小。

答案 2 :(得分:0)

我知道这是一个旧版本,但仍然是谷歌的一个打击所以我添加我是如何做的

标签:如果x生成

声明< - 放置类型,信号和放大器在这里归属!!!!

<强>开始

ur code

结束生成标签;

你可能想要考虑第二种架构甚至更简单的只是一个不同的实体 - 只是另一个名称略有不同的vhd文件(如_x1,然后是_x2)

我觉得“genercis系统”在更高级的情况下并不是很实用(要编写很多 bloat-code ),然后你可能会使用不同的合成器,所以两个archoitecture与一个实体可能不起作用,生成内部的decalrations可能无法工作....我会为此创建不同的vhd - 它将在所有情况下工作)

干杯