FPGA综合与VHDL语法

下面的内容是在富欣实习时总结下来的。

综合相关:

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


原文地址:https://www.cnblogs.com/season-peng/p/6713521.html