跳转到内容

可编程逻辑/VHDL 顺序语句

来自维基教科书,开放书籍,开放世界

顺序语句用于进程中指定信号的赋值方式。进程以整体顺序执行。在进程中的所有顺序语句执行完毕后,信号将被分配新的值。

信号的赋值方式如下

sQ <= sQ_next;

这个语句可以理解为“在下一个仿真周期将 sQ_next 的值赋值给 sQ”。

到目前为止,在 if 语句中只使用了信号。使用变量时同样适用,唯一的区别是:与信号一样,如果变量只在 if 语句的某些分支中被赋值,那么它的先前值会通过反馈保留下来。与使用信号不同的是,在同一个进程中读写变量,只有在读操作发生在写操作之前才会产生反馈。在这种情况下,读取的值是变量的先前值。而当使用信号时,同一个进程中的读写操作将始终产生反馈。这种现象可以用来创建使用变量的寄存器或计数器。请记住,合成工具会通过在进程中被赋值的每个信号上放置一个触发器或寄存器来解释顺序进程。这意味着通常变量不会写入触发器或寄存器。然而,如果存在先前变量值的反馈,那么该反馈将通过触发器或寄存器实现,以使进程同步。示例 6.21 描述了一个使用无符号整数类型的计数器。当对无符号类型的变量进行递增时,如果值是范围内的最大值,则会得到范围内的最小值。

示例 6.21

process
variable count: unsigned (7 downto 0);
begin
wait until clk = '1';
if reset = '1' then
count := "00000000";
else
count := count + 1;
end if;
result <= count;
end process;

在这个例子中,在 if 语句的 else 分支中,正在读取 count 变量的先前值以计算下一个值。这导致了反馈。请注意,在这个例子中实际上创建了两个寄存器。根据反馈规则,变量 count 将被注册。信号 result 也将被注册,因为顺序进程中被赋值的所有信号都将被注册。这个额外的寄存器将始终包含与变量 count 的寄存器相同的值。合成工具通常会消除这种冗余的寄存器。

CASE 语句

[编辑 | 编辑源代码]

CASE 语句是一种描述具有大量选择的条件赋值的方法。

architecture behavioral of Question1 is
begin
    process(D)
    begin
        case D is
            when "0000" | "1110" =>
                Y <= "0011";		
            when "0001" | "0100" | "0101" | "0110" | "0111" | "1010" | "1011" | "1100" | "1111" =>
                Y <= "0000";
            when "0010" | "1001" =>
                Y <= "0110";
            when "0011" | "1101" =>
                Y <= "1100";
            when "1000" =>
                Y <= "1001";
            when others =>
                null;
        end case;
    end process;
end architecture behavioral;

CASE 语句通常被合成成多路复用器。

LOOP 语句

[编辑 | 编辑源代码]
华夏公益教科书