std_logic 是一个具有 9 个值的多值逻辑系统。
case 语句(IEEE Std 1076-2008 10.9 Case 语句)要求将所有值表示为选择(第 5 段)。
除了 Morten 的回答之外,您还可以做几件事。您可以通过包 std_logic_1164 函数将 std_logic_vector 案例表达式转换为 bit_vector 变量to_bitvector
(注意您尚未演示 prstate 的声明)。
architecture fum of others_case is
signal wd_link: std_logic;
signal prstate: std_logic_vector(1 downto 0);
function do_something return boolean is
begin
return true;
end function;
begin
process (reset, clock)
variable prstate_proxy: bit_vector (1 downto 0); -- locally static range
begin
if reset = '0' then
prstate <= "00";
elsif rising_edge(clock) then
prstate_proxy := to_bitvector(prstate);
case prstate_proxy is
when "00" =>
if wd_link = '1' then
prstate <= "01";
end if; -- ADDED
when "01" =>
if do_something then
prstate <= "10";
end if;
when "10" =>
if do_something then
prstate <= "11";
end if;
when "11" =>
if do_something then
prstate <= "10";
end if;
-- when others => ----please pay attention to this line
end case;
end if;
end process;
end architecture;
请注意,在分析时需要知道用作 case 语句表达式的一维数组的范围(本地静态)。变量声明满足了这一点。
您还可以将其他选项的“语句序列”留空,并显示所有二进制值选项:
library ieee;
use ieee.std_logic_1164.all;
entity others_case is
port (
reset: in std_logic;
clock: in std_logic
);
end entity;
architecture foo of others_case is
signal wd_link: std_logic;
signal prstate: std_logic_vector(1 downto 0);
function do_something return boolean is
begin
return true;
end function;
begin
process (reset, clock)
begin
if reset = '0' then
prstate <= "00";
elsif rising_edge(clock) then
case prstate is
when "00" =>
if wd_link = '1' then
prstate <= "01";
end if; -- ADDED
when "01" =>
if do_something then
prstate <= "10";
end if;
when "10" =>
if do_something then
prstate <= "11";
end if;
when "11" =>
if do_something then
prstate <= "10";
end if;
when others => ----please pay attention to this line
end case;
end if;
end process;
end architecture;
请注意,当 end 语句之前没有语句时,其他选项中缺少分号(语句分隔符)。这提供了与 Morten 的答案相同的效果。
这些架构和实体声明代表了一个最小、完整和可验证的示例,虽然在模拟时没有做任何有趣的事情,但对于综合来说应该是有效的。
如果没有看到您的设计规范的其余部分,您不需要在重置 prstate 时处理案例语句中的元逻辑值。对元逻辑值的赋值对综合无效。
其他选项代表在前面的案例陈述备选方案中未具体提及的所有可能选择,或者可能代表无。
9 值 std_ulogic 表示被分为三类进行综合。映射为二进制值、元逻辑值和高阻抗值 ('Z') 的值。
'H' 和 'L' 分别映射到 '1' 和 '0' 用于合成。
元数据(“U”、“W”、“X”和“-”)不用作综合期间评估 VHDL 代码的输入。
'Z' 表示可以被附加驱动程序覆盖的值。
不可能基于逻辑门级 (RTL) 原语库中的“Z”值进行分配或驱动选择。他们可以很容易地发现其他选择代表没有选择。
IEEE Std 1076-2008, 10.9 case statement 第 9 段:
选择 others 只允许作为最后一个选择并且作为它的唯一选择;它代表在先前备选方案的选择中未给出的所有值(可能没有)。
16.8.2.4.10 高阻抗值('Z')第 4 段的解释:
每当静态高阻抗值出现在赋值语句中的值表达式以外的任何上下文中时,综合工具应将其视为等效于静态元逻辑值。
16.8.2.4.5 元数据作为案例陈述中的选择,第 1 段:
如果一个元逻辑值作为一个选择出现,或者作为一个选择的一个元素出现,在一个由综合工具解释的案例陈述中,综合工具应该将该选择解释为一个永远不会出现的选择。也就是说,所生成的解释不需要包含与存在或不存在与选择相关联的语句序列相对应的任何构造。
Synopsys 对 RTL 综合中不存在的问题发出警告(另请参阅已撤销的 IEEE Std-1076.6-2004,5. 验证方法,验证综合设计规范不依赖于输入元数据)。