回答
是的,在VHDL过程中使用的变量是可合成的。
正如Brian Drummond所写,您可以合成具有变量的流程,网表结果取决于变量是在分配之前还是之后读取的。
如果变量被读之前分配,则变量将来自先前时间到当前时间的值 ,和存储(通常触发器 或锁存器)是必需的,以保持状态随着时间的推移。示例代码,其中两个 sig
和var
将导致触发器,由于可变var
分配之前被读取 :
process (clk_i) is
variable var : std_logic;
begin
if rising_edge(clk_i) then
sig <= var;
var := arg;
end if;
end process;
如果变量之后分配读取,那么任何一个变量值是 未使用,所以没有存储在网表中实现。因此该变量仅用于产生中间值,例如以便于编写代码。 实施例的代码,其中仅sig
将导致触发器,由于可变 var
分配后读取:
process (clk_i) is
variable var : std_logic;
begin
if rising_edge(clk_i) then
var := arg;
sig <= var;
end if;
end process;
在更复杂的(现实的)代码,它可能难以确保变量 仅分配后读取,因此不会推断意外存储 (触发器或锁存器)。一种有用的编码风格是在代码的开头为所有变量分配 未知('X'
)。如果在 指定之前读取变量,则通常会在模拟和调试时发现该错误。 示例代码:
process (clk_i) is
variable var : std_logic;
begin
if rising_edge(clk_i) then
var := `X`; -- Ensure variable assign before any use to avoid storage
var := arg;
sig <= var;
end if;
end process;
注意,在模拟它通常需要额外的努力包括在波形 变量; ModelSim例如在 单独的“本地”视图中显示过程变量。如果保持状态的变量不在 波形中,则调试要困难得多,因为波形然后是 只显示了一半的故事。
因此,一种实用的编码风格是在变量中只使用变量中的中间值,因此在分配后总是进行读取。
+1为了很好的解释。如果“如果变量在*之前/之后被读取”,你会考虑重写“如果变量被使用*之前/之后”吗?我认为,在这种情况下具体说明会使你的观点更有效。 – rick
文字相应更新;好点子。 –
- 1. 不可合成的VHDL代码
- 2. 如何使这个VHDL代码可以合成?
- 3. VHDL代码综合错误
- 4. 是否有可能将C++代码集成到Wix项目中
- 5. 是否有可能将代码分成两个类文件?
- 6. 是否有可能从代码内生成卫星组件?
- 7. 的Python:代码VHDL代码生成
- 8. State_Machine VHDL代码,请你检查它为什么不起作用!它合成好
- 9. 是否有可能实现双通道与下面的代码
- 10. 是否有可能将C代码编译为Javascript代码?
- 11. 是否有可能在vhdl中有泛型类型?
- 12. 是否有可能与VS2010
- 13. 是否有可能与Java
- 14. 是否有可能与CSS
- 15. 是否有可能与svg.marker
- 16. 使MP3解码器VHDL代码合成的
- 17. 它可能是什么样的代码?
- 18. 是代数声音合成可能吗?
- 19. 是否有可能在运行时生成并运行TemplateHaskell生成的代码?
- 20. 我如何知道我的代码是否可合成? [Verilog]
- 21. 是否有JavaScript的代码合同库?
- 22. 是否有可能取代使用jQuery的颜色代码?
- 23. 代码,以生成所有可能的组合
- 24. VHDL:信号s不能合成
- 25. std_logic_vector与赛灵思VHDL整数合成
- 26. 是否有可能直接在代码中有错误描述?
- 27. 是否有可能拥有多个共享代码的项目?
- 28. 是否有可能在JavaScript函数中有php代码?
- 29. 从VHDL代码生成状态机图?
- 30. 是否有可能看到代码合同静态分析器的进度?
但是,这将如何纳入综合网表。或者等效硬件如何看起来像 – Maximus
这取决于你使用变量的方式。它可以表示组合逻辑(门)或寄存器,取决于在时钟进程中使用它之前还是之后分配它。 –