Menu Close

VHDL boolean与bit类型逻辑运算

VHDL运算符中介绍了逻辑运算符及重载函数,但由于侧重点不同,并没有详细介绍逻辑运算符使用的详细规则。本节内容以逻辑运算为重点展开介绍。逻辑运算符是VHDL语言的预定义类型,数据类型boolean, bit, boolean_vector, bit_vector 对应的数据对象可以直接参与运算。

  1. BOOLEAN逻辑运算符

为了介绍方便,下面将STD库中的boolean类型逻辑操作符重新列出:

type boolean is (FALSE, TRUE);

    -- The predefined operations for this type are as follows:

    function "and"  (l, r: boolean) return boolean;
    function "or"   (l, r: boolean) return boolean;
    function "nand" (l, r: boolean) return boolean;
    function "nor"  (l, r: boolean) return boolean;
    function "xor"  (l, r: boolean) return boolean;
    function "xnor" (l, r: boolean) return boolean;

    function "not" (anonymous: boolean) return boolean;

  • 布尔类型与逻辑(and)

boolean 类型运算如表1到表8所示,

表1

and

L \ R FALSE TRUE
FALSE FALSE FALSE
TRUE FALSE TRUE

由于在数字设计(如FPGA或ASIC)在编译后,可以用0代表FALSE,1 代表TRUE,因此表1的表示方法也可以用表2表示,后面为了清晰,都采用0,1 代表FALSE, TRUE的方法表示。

表2

and

L \ R 0 1
0 0 0
1 0 1
  • 布尔或逻辑(OR)

表3   OR

L \ R 0 1
0 0 1
1 1 1
  • 布尔逻辑与非(nand)

表4  nand

L \ R 0 1
0 1 1
1 1 0
  • 布尔逻辑或非(nor)

表5    nor

L \ R 0 1
0 1 0
1 0 0
  • 布尔逻辑异或(xor)

表       xor

L \ R 0 1
0 0 1
1 1 0
  • 布尔逻辑异或非(xnor)

表7  xnor

L \ R 0 1
0 1 0
1 0 1
  • 布尔逻辑非(not)

表8       not

a 0 1
not a 1 0

例1: 利用boolean 类型设计逻辑电路并进行仿真验证

(1) 可综合的实体程序

entity test_boolean is
    Port ( a : in boolean;
           b : in boolean;
           c,d ,e,f,g: out boolean
           );
end test_boolean;

architecture Behavioral of test_boolean is

begin
c<=a and b;
d<=a or b;
e<=a xor b;
f<=a xnor b;
g<= not a;

end Behavioral;

从上面的程序可以看出,由于boolean 数据类型是STD库中定义的数据类型,逻辑运算也是库中的预定义函数,因此不需要使用libary 及use语句预先引用,就可以直接使用。

(2)仿真程序

entity tb is
end tb;

architecture tb_arch of tb is
    signal a, b      : boolean;  -- inputs 
    signal c,d,e,f,g : boolean;  -- outputs
begin
    -- connecting tb_arch signals with test_boolen.vhd
    UUT : entity work.test_boolean port map (a => a, b => b, 
                  c => c, d => d,e=>e,f=>f,g=>g);

    -- inputs
    -- 00 at 0 ns
    -- 01 at 20 ns, as b is 0 at 20 ns and a is changed to 1 at 20 ns
    -- 10 at 40 ns
    -- 11 at 60 ns
    a <= false, true after 20 ns, false after 40 ns, true after 60 ns;
    b <= false, true after 40 ns;        
end tb_arch ;

本程序提供了仿真激励,仿真程序的实体不需要声明输入、输出,只要在构造体的声明区域声明需要的信号,并在构造体的描述区域给出随时间变化的逻辑值,并与被测的实体映射即可。语句:

a <= false, true after 20 ns, false after 40 ns, true after 60 ns;

表示,信号a在0时刻为false并持续20 ns。从 20 ns时刻开始为ture,并持续到40 ns, 40 ns到 60 ns期间为false, 60 ns后稳定在逻辑true值上不变。语句:

b <= false, true after 40 ns;

的解释类似。关于VHDL 仿真程序的编写,在后续的章节中还会详细讲解。

(3)仿真波形如图1所示

图1

从图1的仿真结果可以看出,输入、输出完全符合例1设计的逻辑关系。

2. BIT类型逻辑运算符

BIT类型逻辑运算符如下:

type bit is ('0', '1');
 -- The predefined operations for this type are as follows: 
function "and" (l, r: bit) return bit; 
function "or" (l, r: bit) return bit; 
function "nand" (l, r: bit) return bit; 
function "nor" (l, r: bit) return bit; 
function "xor" (l, r: bit) return bit; 
function "xnor" (l, r: bit) return bit; 
function "not" (anonymous: bit) return bit;

Bit 类型的逻辑运算与Boolean类型的逻辑运算及其类似,返回值为bit类型,在EDA软件综合时将’0′,’1’解释成0,1二值分别代表高低电平。

Bit类型逻辑运算与上面列出的真值表,表2~表8一致。由于bit类型与boolean一样都是VHDL预定义类型,因此在VHDL编程时可以直接使用。

例2: 利用Bit 类型设计逻辑电路并进行仿真验证

修改例1的设计和测试程序,并对bit类型的逻辑运算进行测试。

(1)实体设计程序

entity test_bit is
   Port ( a :         in bit;
          b :         in bit;
          c,d ,e,f,g: out bit
           );
end test_bit;

architecture Behavioral of test_bit is

begin

c<=a and b;
d<=a or b;
e<=a xor b;
f<=a xnor b;
g<= not a;

end Behavioral;

(2)仿真程序

entity tb is
end tb;

architecture tb_arch of tb is
    signal a, b : bit;  -- inputs 
    signal c,d,e,f,g : bit;  -- outputs
begin
    -- connecting testbench signals with half_adder.vhd
    UUT : entity work.test_bit port map (a => a, b => b, 
                  c => c, d => d,e=>e,f=>f,g=>g);

    -- inputs
    -- 00 at 0 ns
    -- 01 at 20 ns, as b is 0 at 20 ns and a is changed to 1 at 20 ns
    -- 10 at 40 ns
    -- 11 at 60 ns
    a <= '0', '1' after 20 ns, '0' after 40 ns, '1' after 60 ns;
    b <= '0', '1' after 40 ns;        
end tb_arch ;

(3)仿真波形, 如图2所示,

图2

从图2的仿真结果可以看出,bit类型与boolean的运算规则一致,只是在EDA软件中,直接将枚举类型中的’0′,’1’直接解释成0,1 二值。而boolean类型直接使用false和true表示逻辑值。

3.关于boolean与bit类型及其运算的讨论

  • 相同点
    • 都是2值枚举类型,
    • 在FPGA或IC的设计中都可以解释成0,1二值,
    • 都可以作为entity的端口,实现电路的接口设计,
    • 都是VHDL语言的预定义类型,
    • 都具有相同的逻辑运算规则,
    • 都可以作为基本标量类型从而组成矢量类型,分别为boolen_vector,bit_vector。
  • 不同点
    • boolean类型的二值为false、true,而bit类型的二值为’0′,’1’,
    • 不能相互赋值,虽然boolean与bit类型非常接近,但二者并没有类型转换的机制,因此并不能混合使用。

例3  boolean 与bit类型相互赋值测试

以bit类型作为实体设计,如例2的(1)部分,测试程序采用例1的(2)部分组合,在Vivado下进行测试。程序重新列出如下:

(1)实体设计程序

entity test_bit is
   Port ( a :         in bit;
          b :         in bit;
          c,d ,e,f,g: out bit
           );
end test_bit;

architecture Behavioral of test_bit is

begin

c<=a and b;
d<=a or b;
e<=a xor b;
f<=a xnor b;
g<= not a;

end Behavioral;

(2)仿真程序:(将boolean类型传递给bit类型)

entity tb is
end tb;

architecture tb_arch of tb is
    signal a, b : boolean;  -- inputs 
    signal c,d,e,f,g : bit;  -- outputs
begin
    -- connecting testbench signals with half_adder.vhd
    UUT : entity work.test_bit port map (a => a, b =>b, 
                  c => c, d => d,e=>e,f=>f,g=>g);

    -- inputs
    -- 00 at 0 ns
    -- 01 at 20 ns, as b is 0 at 20 ns and a is changed to 1 at 20 ns
    -- 10 at 40 ns
    -- 11 at 60 ns
--   

 a <= false, true after 20 ns, false after 40 ns, true after 60 ns;
 b <= false, true after 40 ns;         
end tb_arch ;

(3)编译结果:如图3所示,

图3

从图3的编译结果可以看出,虽然bit, boolean的类型非常接近但并不兼容,因此不能对二者实现混合运算。STD库中的程序包也没有二者的转换函数,当然如果喜欢也可以由用户自定义函数实现二者的相互转换,或重载逻辑运算符实现二者的混合运算。

 

Posted in FPGA, FPGA 教材教案, IC, IC 教材教案, VHDL, VHDL, 开发语言, 教材与教案, 文章, 编程语言

发表回复

相关链接