下面的内容是在富欣实习时总结下来的。
综合相关:
1.刘工说,D触发器最好不要一直刷新,需要用到使能信号,若使能信号是长时间持续的,则需要取其的上升沿和下降沿。
2.以前写代码时,为了防止生成锁存器,会像下面这样写:
elsif clk'event and clk='1' then if en='1' then q <= d; else q <= q; endif; endif;
但其实else后面的是可以去掉的,时序电路中,D触发器有CE(clk enable)这个端口,当en不满足时,CE可以不使能,那么触发器的输出就不会改变。若是在组合电路中,else后面的则是不能省略的。
由于目前的综合器比较强,我们根本不知道会综合出什么电路。可能代码的质量比较不好,但它会综合出质量比较好的电路。也有可能我们写代码时考虑到了很多的小细节,比如D触发器最好不要一直刷新之类的,但最后综合出来的电路并不符和我们的预想。以上的建议作为一种参考。
VHDL语法相关:
1.PROCEDURE若有输入和输出参数,那么写法如下:
procedure Local_Bus_read_ppcid(ppc: in std_logic_vector(2 downto 0);signal data_out: out std_logic_vector(15 downto 0)) is begin vib_sim_status <= Local_Bus_read; ppc_id <= ppc; lbd <= (others => 'Z'); wait for 270 ns; data_out <= lbd; end Local_Bus_read_ppcid;输出的信号需要加上signal,之前由于漏了这个就一直错。
2.综合时出现以下错误
found '0' definitions of operator "+", cannot determine exact overloaded matching definition for "+"
说明我用了"+"号,但并没有USE IEEE.STD_LOGIC_UNSIGNED.ALL,这里用UNSIGNED或SIGNED都可以,这个库可使得"+"号两边的数据类型可以不同
3.不管用VARIABLE还是SIGNAL,只要表达的意思一样,综合出来的电路是一样的,不用在意SIGNAL或VARIABLE在物理上的意义,这些变量只是建模的工具,重点是要将模型的意思表达清楚。还有一点,就是VARIABLE在MODELSIM仿真添加信号时,是没有的,看不到的。
4.之前在仿真的时候,我知道inout信号在in和out切换时,需要拉成高阻,这点没错,但仿真还是出错,后来发现只要在TestBench里将inout信号初始化为Z即可,我是忘了初始化5.注释生成文档:doxygen