组合电路的ⅤHDL设计 优先编码器 编码器( encoder)也属于码制转换器一类 (BCD-1-out-of-10)(p49表2-9) 优先编码器属于多对1转换关系,没有一一对应关系,难 以采用上述方式描述 74148优先编码器真值表见p278表5-23,表中含有大 量‘x’项,目前ⅤHDL还不能直接对其进行运算处理; 在p.384表5-26中,显示了行为设计的一种形式:采用 for-loop语句 也可以采用数据流设计中的条件代入语句实现 例:简化74148优先编码器的数据流设计 数据输入订[7.0]低电平有效控制输入e低电平有效 数据输出a[2.0]反函数输出 library ieee use ieee std logic 1164. all; entity encoder is port(i: in std logic vector(7 downto 0) el: in std logic a: out std logic vector(2 downto O)) end encoder: architecture rtl of encoder is signal al std logic vector(2 downto O)
组合电路的 VHDL 设计 优先编码器 编码器(encoder)也属于码制转换器一类 (BCD—1-out-of-10) ( p.49 表 2-9 ) 优先编码器属于多对 1 转换关系,没有一一对应关系,难 以采用上述方式描述; 74148 优先编码器真值表 见 p.278 表 5-23,表中含有大 量‘x’项,目前 VHDL 还不能直接对其进行运算处理; 在 p.384 表 5-26 中,显示了行为设计的一种形式:采用 for-loop 语句; 也可以采用数据流设计中的条件代入语句实现: 例: 简化 74148 优先编码器的数据流设计 数据输入 i[7..0] 低电平有效 控制输入 el 低电平有效 数据输出 a[2..0] 反函数输出 library ieee; use ieee.std_logic_1164.all; entity kencoder is port (i: in std_logic_vector (7 downto 0); el: in std_logic; a: out std_logic_vector(2 downto 0)); end kencoder; architecture rtl of kencoder is signal a1:std_logic_vector(2 downto 0);
al <=000"when i(7)='0 else 001"when i(7 downto 6-10" else 010"when i(7 downto 5)110"else 0ll"when i(7 downto 4=1110" else 100"when i(7 downto 3)=11110"else 101"when i(7 downto 2)111110" else 110"when i(7 downto 11111110"else 111 a<=al when el=o' else"111 奇偶校验电路 parity checker 奇偶校验电路是实现数据错误检验的一种基本电路,其方 式是检测在9位输入数据中‘1’的个数是奇数还是偶数 3输入端异或门可以看作3位奇偶校验电路: 1’的个数为奇数时输出为‘1’,为偶数时输出为“0’ 利用该电路可以构成9位奇偶校验电路 p.418表5-479位奇偶校验电路的行为设计 p419表5-489位奇偶校验电路的结构设计 例9位奇偶校验电路的数据流设计 library ieee use ieee std logic 1164 all
begin a1 <="000" when i(7)= '0' else "001" when i(7 downto 6)="10" else "010" when i(7 downto 5)="110" else "011" when i(7 downto 4)="1110" else "100" when i(7 downto 3)="11110" else "101" when i(7 downto 2)="111110" else "110" when i(7 downto 1)="1111110" else "111"; a<=a1 when el='0' else "111"; end rtl; 奇偶校验电路 parity checker 奇偶校验电路是实现数据错误检验的一种基本电路,其方 式是检测在 9 位输入数据中‘1’的个数是奇数还是偶数; 3 输入端异或门可以看作 3 位奇偶校验电路: ‘1’的个数为奇数时输出为‘1’,为偶数时输出为‘0’; 利用该电路可以构成 9 位奇偶校验电路; p.418 表 5-47 9 位奇偶校验电路的行为设计 p.419 表 5-48 9 位奇偶校验电路的结构设计 例 9 位奇偶校验电路的数据流设计 library ieee; use ieee.std_logic_1164.all;
enti port(i: in std logic vector( 1 to 9) even, odd: out std logic) end parity architecture rtl of kparity 9 i signal yl, y2, y3, y: std logic, yl<=i(1) xor i(2)xor i(3) y2<=1(4)xor i(5)xor i(6) y3<=i(7) xor i( 8)xor 1(9); yI xor y2 xor y3 odd<=y; even<= not y end rtI 运算电路 运算电路主要包括比较器( comparator)、加法器(add) 乘法器( multipliers)和算术逻辑单元(ALU)等电路。 在运算电路中,运算量经常需要进行算术运算; 在VHDL中,算术运算不能对bt、 std logic d logic vector等类型进行 此外,二进制的数值表达方式本身也存在符号表达方式 问题,不同表达方式的运算规则不同 为了解决类型与运算的相容问题,统一符号运算问题, 在包集合 IEEE std logic arith中,定义了 signed和 unsinged 两种类型,以及与这两种类型相应的转换函数和对这些类型 进行的运算,其规则如下(针对加减运算)
entity kparity9 is port (i: in std_logic_vector ( 1 to 9); even,odd : out std_logic); end kparity9 ; architecture rtl of kparity9 is signal y1,y2,y3,y: std_logic; begin y1<= i(1) xor i(2) xor i(3) ; y2<= i(4) xor i(5) xor i(6) ; y3<= i(7) xor i(8) xor i(9) ; y<= y1 xor y2 xor y3 ; odd<= y ; even<= not y; end rtl; 运算电路 运算电路主要包括比较器(comparator)、加法器(add)、 乘法器(multipliers)和算术逻辑单元(ALU)等电路。 在运算电路中,运算量经常需要进行算术运算; 在 VHDL 中,算术运算不能对 bit 、 std_logic 、 std_logic_vector 等类型进行; 此外,二进制的数值表达方式本身也存在符号表达方式 问题,不同表达方式的运算规则不同; 为了解决类型与运算的相容问题,统一符号运算问题, 在包集合 IEEE.std_logic_arith 中,定义了 signed 和 unsinged 两种类型,以及与这两种类型相应的转换函数和对这些类型 进行的运算,其规则如下(针对加/减运算):
若运算量中存在 signed类型,结果就为 signed类型;否 则为 unsinged类型 若结果被指定为 std logic、 std logic vector等类型,则 signed或 unsigned类型的结果自动转为指定类型; 运算结果的长度为最长运算量的长度,但若 型与 signed类型运算,会自动变为后一类型,其长度会增加 以在最高位增加符号位"O 对于通常所用的 sdt logic vector类型的数据d,需要进 行算术运算时,可以采用函数 signed(d将其转换为 signed类 型,或采用函数 unsigned(d)将其转换为 unsigned类型,运算 完毕后,通过代入语句将结果直接赋值给 sdt logic vector类 型的信号,即可恢复通用的类型; 例P445表5-55各种运算结果的类型 8位不同类型数据的加/减法器 数据流设计 library ieee use ieee std logic 1164. all; use ieee std logic arith.all vadd Is port(a, b: in unsigned( 7 downto0); c: in signed(7 downton); d: in std logic vector( 7 downto0 ); s: out unsigned 8 downto O) t: out signed( 8 downto 0) u:out signed (7 downto 0); v: out std logic vector( 8 downto O)) end vac
若运算量中存在 signed 类型,结果就为 signed 类型;否 则为 unsinged 类型; 若结果被指定为 std_logic、std_logic_vector 等类型,则 signed 或 unsigned 类型的结果自动转为指定类型; 运算结果的长度为最长运算量的长度,但若 unsigned 类 型与 signed 类型运算,会自动变为后一类型,其长度会增加 1 以在最高位增加符号位'0'; 对于通常所用的 sdt_logic_vector 类型的数据 d,需要进 行算术运算时,可以采用函数 signed(d)将其转换为 signed 类 型,或采用函数 unsigned(d)将其转换为 unsigned 类型,运算 完毕后,通过代入语句将结果直接赋值给 sdt_logic_vector 类 型的信号,即可恢复通用的类型; 例 P.445 表 5-55 各种运算结果的类型 8 位不同类型数据的加/减法器 数据流设计 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity vadd is port (a,b: in unsigned( 7 downto 0 ); c : in signed ( 7 downto 0 ); d : in std_logic_vector( 7 downto 0 ); s : out unsigned (8 downto 0); t : out signed (8 downto 0); u : out signed (7 downto 0); v : out std_logic_vector(8 downto 0)); end vadd;
architecture rtl of vadd is s<=(0&a)+(0&b) t<=a+C V<=C-unsigned(d) d rtl 例p446表5 可选输入的加法器 数据流设计,采用条件代入语句 std logic arith. all entity vaddshr port(a, b, c, d: in signed( 7 downto 0) sel: in std logic s: out signed (7 downto O)); end vaddshr: architecture rtl of vaddshr s<=a+b when sel='l' else c+d d rtl 以上输入和输出均采用 signed类型;在实际应用中,数 据传递采用统一的 std logic类型比较方便,因此在端口信号 中最好全都采用 std logic类型,由此会要求程序进行相应改 变 例采用 std logic类型端口的8位加法器
architecture rtl of vadd is begin s <= ('0' & a)+('0' & b); t <= a+c; u <= c+signed(d); v <= c-unsigned(d); end rtl; 例 p.446 表 5-56 可选输入的加法器 数据流设计,采用条件代入语句 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity vaddshr is port (a,b,c,d: in signed( 7 downto 0 ); sel : in std_logic; s : out signed (7 downto 0)); end vaddshr; architecture rtl of vaddshr is begin s <= a+b when sel='1' else c+d; end rtl; 以上输入和输出均采用 signed 类型;在实际应用中,数 据传递采用统一的 std_logic 类型比较方便,因此在端口信号 中最好全都采用 std_logic 类型,由此会要求程序进行相应改 变。 例 采用 std_logic 类型端口的 8 位加法器 library ieee;