【发布时间】:2015-05-20 20:23:23
【问题描述】:
我正在尝试将一大段代码从 tdf(文本设计文件)转换为 vhdl。 在这个 tdf 文件中实现了一个状态机。
Y <= state0 # state1 # state2 # state3 // start at state 0 and stop at state 3
假设我已经定义了所有状态,我该如何用 VHDL 编写上述语句。 有什么想法吗?
【问题讨论】:
标签: vhdl
我正在尝试将一大段代码从 tdf(文本设计文件)转换为 vhdl。 在这个 tdf 文件中实现了一个状态机。
Y <= state0 # state1 # state2 # state3 // start at state 0 and stop at state 3
假设我已经定义了所有状态,我该如何用 VHDL 编写上述语句。 有什么想法吗?
【问题讨论】:
标签: vhdl
用 Altera 硬件描述语言 (AHDL) 编写的 ASCII 文本文件(扩展名为 .tdf)。
AHDL 是叠加在大多数 ABEL 语言语法(更类似于 Verilog/C)上的 VHDL 语法子集。
从 ABEL-HDL 参考手册ABEL-HDL Reference Manual,运算符、表达式和方程式第 24 页和表 1-3 逻辑运算符第 25 页我们看到 # 是 OR 运算符。
有一个 AHDL 手册参见Altera AHDL Language Reference,参见表 3-1。 AHDL Symbols (Part 3 of 3) 文档第 96 页(PDF 第 117 页),其中我们还发现 # 是 OR 运算符(也由 OR 保留字表示,请参见表 3-3。算术运算符和在算术表达式中使用的比较器(第 2 部分,共 2 部分),文档第 104 页(PDF 第 125 页)。
另见表 3.4。布尔表达式中使用的逻辑运算符,文档第 107 页(PDF 第 128 页)。
还请注意您的问题“
转换此赋值语句取决于Y 和state0 是否为同一类型。
如果它们是同一类型:
Y <= state0 or state1 or state2 or state3;
如果可能的话,您可以信任综合工具进行优化。
如果它们属于不同的类型,则声明是必要的。 (从历史上看,信号的 ABEL 标识符是相同的匿名类型,问题是您是否已将这些类型声明为不同的类型)。
AHDL 不支持用户定义类型,但允许枚举状态名称。
这意味着状态类型类似于
type state is (state0, state1, state2, state3, state4,...);
signal sm: state;
并且需要条件赋值或 case 语句。
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;
or and 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。
【讨论】: