我正在写一个状态机,它有一个通用参数,有些状态依赖于此。由于我的状态定义为枚举(不知道它的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
以来的额外位),或者是否有剥离不必要的状态的可能性?
(在我的情况下,有几种状态可以剥离,但是单独的架构在努力时是不值得的)
答案 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 - 它将在所有情况下工作)
干杯