查询IC设计(非FPGA)的VHDL综合,特别是在变量赋值的情况下

Gau*_*ngh 2 synthesis vhdl register-transfer-level soc asic

如果对于给定的进程,我声明一个变量(假设是一个1位变量variable temp : std_logic;),那么如果给定的条件返回true,我可以为变量赋值,即

if (xyz=1) then --Assuming that this condition returns TRUE
temp:= '1';
Run Code Online (Sandbox Code Playgroud)

?? 这种逻辑是否可以用于ASIC?

Mat*_*lor 6

是.变量可用于FPGA和IC.一个过程是一些软件,可以为一些硬件建模.这一小部分软件可以使用变量,但由于变量只在一个过程的范围内,最终你必须驱动一个信号 - 一点点硬件的输出.

例如,这里有一些组合逻辑:

process (A, B, C, D)
  variable TMP : std_logic;
begin
  if A = '1' then
    TMP := B and C;
    TMP := TMP and D;
  else
    TMP := '0';
  end if;
  F <= TMP;
end process;
Run Code Online (Sandbox Code Playgroud)

下面是一个使用变量的示例,该变量将合成到触发器的D输入上的组合逻辑(因为它处于时钟进程中):

process (CLOCK)
  variable TMP : std_logic;
begin
  if rising_edge(CLOCK) then
    TMP := A and B;
    Q <= TMP;
  end if;
end process;
Run Code Online (Sandbox Code Playgroud)

以下是在时钟进程中使用变量的示例,该变量将合成到触发器(在其D输入上具有AND门):

process (CLOCK)
  variable TMP : std_logic;
begin
  if rising_edge(CLOCK) then
    Q <= TMP;
    TMP := A and B;
  end if;
end process;
Run Code Online (Sandbox Code Playgroud)

两个时钟进程之间的唯一区别是顺序.在第一个中,变量在被访问之前被分配; 在第二个中,它在被分配之前被访问.

  • 如果在时钟进程中访问变量之前分配给变量,将推断出组合逻辑;

  • 如果在时钟进程中分配变量之前访问变量,则会推断出触发器.

  • 在组合过程中分配变量之前,不要访问变量:将推断出锁存器.

变量在进程的执行之间保留其值.因此,如果在分配给时钟进程之前访问变量,则必须在先前执行的进程上写入读取的值.在一个时钟进程中,先前的执行将在前一个时钟边沿:因此,推断出一个触发器.