如何实现具有“不关心”输入且直接表示“不关心”的VHDL函数?
Free Range VHDL的练习4.8-2a要求我:
...使用...选择信号分配编写实现这些功能的VHDL模型。
a)F(A,B,C,D)= A'CD'+ B'C + BCD'
此代码有效:
library ieee;
use ieee.std_logic_1164.all;
entity funca_selected is
port (
a: in std_ulogic;
b: in std_ulogic;
c: in std_ulogic;
d: in std_ulogic;
x: out std_ulogic);
end entity;
architecture rtl of funca_selected is
signal s: std_ulogic_vector(3 downto 0);
begin
s <= a & b & c & d;
with s select x <=
'1' when "0010" | "0110" | "0011" | "1010" | "1011" | "1110",
'0' when others;
end architecture;
然而,它是函数定义的不良表示。我想使用“不关心”输入来编码它,以便代码更接近于定义。这将减少工作量,并且更容易正确。我试过这个:
with s select x <=
'1' when "0-10" | "-01-" | "-110",
'0' when others;
这不起作用:当我的测试床运行此功能时,结果始终为“0”。
我使用的是GHDL版本0.29 + gcc4.3.i386。
VHDL函数如何表示“不关心”输入?
答案 0 :(得分:3)
使用overbar表示法(如A̅),练习4.8-2a中的函数是:
F(A,B,C,D)=A̅CD̅+B̅C+BCD̅
GHDL最多只支持VHDL-2000(根据GHDL features),因此没有VHDL-2008比较操作与不关心(' - ')检查。 GHDL的另一种表达形式是:
x <= ((not a) and c and (not d)) or
((not b) and c) or
(b and c and (not d));
但是,如果工具中有VHDL-2008,那么检查不关心的?=运算符可以用作:
x <= (s ?= "0-10") or (s ?= "-01-") or (s ?= "-110");
请注意,此表达式还将VHDL-2008隐式布尔值应用于std_logic转换。
或案例?,也检查不关心,可以用作:
process (s) is
begin
case? s is
when "0010" | "0110" | "0011" | "1010" | "1011" | "1110" => x <= '1';
when others => x <= '0';
end case?;
end process;
没有? VHDL-2008中的运算符,用于并发类似案例的赋值。
有关VHDL-2008功能的更多信息,请参阅VHDL-2008: Why It Matters。
答案 1 :(得分:1)
VHDL中的比较是元素完全匹配的非常纯粹的元素。这是VHDL愚蠢之一,它通过case?
语句和=?
运算符
http://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_small/#matchcase
遗憾的是,GHDL不支持VHDL-2008,因此您必须使用std_match
函数,我认为这也禁止使用with..select
。
答案 2 :(得分:1)
是的,ghdl只能被认为符合IEEE Std 1076-1993标准,而且还有一两个漏洞。
当我们意识到不需要第一个术语(A̅CD̅)时,函数可以更简单,没有结果依赖于它。第一个产品术语在输出中从未被发现。
无论选定信号分配的评估目标是表达式。您可以使用MortenZdk的并发信号赋值语句中的表达式:
library ieee;
use ieee.std_logic_1164.all;
entity f_test is
end;
architecture test of f_test is
subtype vector is std_logic_vector (3 downto 0);
type vectorstream is array (0 to 15) of vector;
constant stimulous: vectorstream :=(
x"0",x"1",x"2",x"3",x"4",X"5",x"6",x"7",
x"8",x"9",x"A",x"B",x"C",x"D",x"E",X"F"
);
signal index: integer range 0 to 15;
signal a,b,c,d: std_logic;
signal x: std_logic;
begin
Test_Vectors:
process
variable TV: std_logic_vector(3 downto 0);
begin
-- first term is valid
for i in vectorstream'range loop
index <= (i); -- make vector index visible in waveform
TV := vector(stimulous(i));
a <= TV(3); b <= TV(2); c <= TV(1); d <= TV(0);
wait for 10 ns;
end loop;
wait; -- ends simulation
end process;
EVALUATE: -- "the code more closely matches the definition"
with TO_X01(
( not a and c and not d) or -- b is don't care
( not b and c ) or -- a, d are don't care
( b and c and not d) -- a is don't care
) select x <= '1' when '1',
'0' when '0',
'X' when 'X'; -- equivalent of 'else 'X' in
-- concurrent signal assignment
end;
TO_X01被称为强度剥离器,来自包std_logic_1164并且评估为“X”,“0”或“1”。
所选择的信号分配具有等效的条件信号分配,并且两者都可以表示为过程,这是它们的模拟方式。
ghdl -a f_test.vhdl
ghdl -r f_test --wave=f_test.ghw
open f_test.ghw
你可以添加to stimulous,允许演示传播其他元素值,如stdlogic_table中指定的“and”和std_Logic_1164包中的“or”映射到类型X01,以减少所选信号赋值语句中的选项数量。
另请注意,在选择x&lt; ='1'时'1'时,第一个'1'表示std_logic值,而第二个'1'表示X01类型的值。
您可以注释掉A̅CD̅的第一个产品术语行,以证明它对结果x没有影响。