具有无关紧要的输入功能

时间:2013-07-28 17:10:31

标签: vhdl truthtable

如何实现具有“不关心”输入且直接表示“不关心”的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函数如何表示“不关心”输入?

3 个答案:

答案 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?语句和=?运算符

获得了在VHDL-2008中修复它的扩展

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

gtkwave simulation result

你可以添加to stimulous,允许演示传播其他元素值,如stdlogic_table中指定的“and”和std_Logic_1164包中的“or”映射到类型X01,以减少所选信号赋值语句中的选项数量。

另请注意,在选择x&lt; ='1'时'1'时,第一个'1'表示std_logic值,而第二个'1'表示X01类型的值。

您可以注释掉A̅CD̅的第一个产品术语行,以证明它对结果x没有影响。