奇偶校验器根据奇偶校验的设置和输入数据计算出奇偶校验位,所以在定义其实体时需要添加两个类属参数 DATA_LENGTH 和 PARITY_RULE,分别表示校验数据的长度和校验规则,代码如下:
- entity parity_verifier is
- generic (
- DATA_LENGTH : integer := 8;
- PARITY_RULE : PARITY := NONE );
- port (
- source : in std_logic_vector(DATA_LENGTH-1 downto 0);
- parity : out std_logic );
- end parity_verifier;
其中,PARITY 是在 UART_PACKAGE 库中定义的,代码如下:
- -- 奇偶校验规则定义
- type PARITY is
- (
- NONE, -- 无奇偶校验
- ODD, -- 奇校验
- EVEN -- 偶校验
- );
奇偶校验器的端口定义如表 5-8 所示。
奇偶校验器的实现代码如下:
- -- 库声明
- library IEEE;
- use IEEE.STD_LOGIC_1164.all;
- use WORK.UART_PACKAGE.ALL;
- -- 实体声明
- entity parity_verifier is
- -- 类属参数
- generic (
- DATA_LENGTH : integer := 8;
- PARITY_RULE : PARITY := NONE );
- -- 端口
- port (
- source : in std_logic_vector(DATA_LENGTH-1 downto 0);
- parity : out std_logic );
- end parity_verifier;
- --}} End of automatically maintained section
- -- 结构体
- architecture parity_verifier of parity_verifier is
- begin
- -- enter your statements here --
- -- 按照校验规则计算校验位
- with PARITY_RULE select
- parity <= MultiXOR(source) when ODD, -- 奇校验
- ( not MultiXOR(source) ) when EVEN, -- 偶校验
- '1' when others;
- end parity_verifier;
上述奇偶校验器实现代码中的 MultiXOR 函数也是在 UART_PACKAGE 库中定义的,其功能是对输入序列进行异或计算。MultiXOR 的函数声明如下:
- function MultiXOR(
- din : in std_logic_vector )
- return std_logic;
MultiXOR 的函数实现如下:
- function MultiXOR(
- din : in std_logic_vector )
- return std_logic is
- variable check : std_logic;
- begin
- check := din(din'LOW);
- for i in 1 to (din'HIGH) loop
- check := check xor din(i);
- end loop;
- return check;
- end MultiXOR;
对上述奇偶校验器进行
仿真测试,在偶校验设置下,仿真得到的波形如图 5-14 所示。
注意:偶校验和奇校验的计算有一个技巧。如果使用偶校验,在待校验序列中有偶数个“1”,则得到的结果为“1”,反之为“0”;如果使用奇校验,在待校验序列中有奇数个“1”,则得到的结果为“1”,反之为“0”。