我正在尝试将大量代码从tdf(文本设计文件)转换为vhdl。 在这个tdf文件中实现了一个状态机。
Y <= state0 # state1 # state2 # state3 // start at state 0 and stop at state 3
如果我定义了所有状态,我如何在VHDL中编写上述语句。 有什么想法吗?
答案 0 :(得分:1)
以Altera硬件描述语言(AHDL)编写的ASCII文本文件(扩展名为.tdf)。
AHDL是一种VHDL语法子集,叠加在大多数ABEL语言语法上(更像是Verilog / C)。
从ABEL-HDL参考手册ABEL-HDL Reference Manual,运算符,表达式和方程式第24页以及表1-3逻辑运算符我们看到#是OR运算符。
有AHDL手册见Altera AHDL Language Reference,见表3-1。 AHDL符号(第3部分,共3部分)文档第96页(PDF第117页),其中我们还发现#是一个OR运算符(也由OR保留字表示,见表3-3。算术运算符和算术表达式中使用的比较器(第2部分,共2部分),第104页(PDF页面125)。
另见表3.4。布尔表达式中使用的逻辑运算符,文档第107页(PDF页128)。
另请注意,您的问题“&lt; =”不是AHDL或ABEL中的赋值运算符。 (VHDL没有赋值运算符,赋值是一个基本操作,运算符可以重载,基本操作不能)。
转换此赋值语句取决于Y
和state0
是否属于同一类型。
如果它们属于同一类型:
Y <= state0 or state1 or state2 or state3;
如果可能,您可以信任综合工具进行优化。
如果它们属于不同类型,则声明变得必要。 (历史上,信号的ABEL标识符具有相同的匿名类型,问题是您是否已将类型声明为不同类型)。
AHDL不支持用户定义的类型,但允许使用枚举状态名称。
这意味着
的状态类型type state is (state0, state1, state2, state3, state4,...);
signal sm: state;
并要求条件转让或个案陈述。
Y <= '1' when sm = state0 or sm = state1 or sm = state2 or
sm = state3 else
'0';
在适合顺序陈述的地方:
case sm is
when state0 | state1 | state2 | state2 =>
Y <= '1';
when others =>
Y <= '0';
end case;
或if语句适用于顺序语句:
if sm = state0 or sm = state1 or sm = state2 or sm = state3 then
Y <= '1';
else
Y <= '0';
end if;
另请参阅此VHDL Reference Manual,附录C. ABEL-HDL Designer的VHDL。