FPGA 学习小组
直播中

alexdos

6年用户 804经验值
擅长:可编程逻辑 电源/新能源 嵌入式技术 模拟技术
私信 关注

FPGA中UART控制器的奇偶校验器模块的实现方式

奇偶校验器根据奇偶校验的设置和输入数据计算出奇偶校验位,所以在定义其实体时需要添加两个类属参数 DATA_LENGTH 和 PARITY_RULE,分别表示校验数据的长度和校验规则,代码如下:

  1. entity parity_verifier is
  2.                 generic (
  3.                 DATA_LENGTH : integer := 8;
  4.                 PARITY_RULE : PARITY := NONE );
  5.                 port (
  6.                 source : in std_logic_vector(DATA_LENGTH-1 downto 0);
  7.                 parity : out std_logic );
  8. end parity_verifier;


其中,PARITY 是在 UART_PACKAGE 库中定义的,代码如下:

  1. -- 奇偶校验规则定义
  2. type PARITY is
  3. (
  4. NONE, -- 无奇偶校验
  5. ODD, -- 奇校验
  6. EVEN -- 偶校验
  7. );


奇偶校验器的端口定义如表 5-8 所示。

1.jpg

奇偶校验器的实现代码如下:

  1. -- 库声明
  2. library IEEE;
  3. use IEEE.STD_LOGIC_1164.all;
  4. use WORK.UART_PACKAGE.ALL;
  5. -- 实体声明
  6. entity parity_verifier is
  7. -- 类属参数
  8. generic (
  9. DATA_LENGTH : integer := 8;
  10. PARITY_RULE : PARITY := NONE );
  11. -- 端口
  12. port (
  13. source : in std_logic_vector(DATA_LENGTH-1 downto 0);
  14. parity : out std_logic );
  15. end parity_verifier;
  16. --}} End of automatically maintained section
  17. -- 结构体
  18. architecture parity_verifier of parity_verifier is
  19. begin
  20. -- enter your statements here --
  21. -- 按照校验规则计算校验位
  22. with PARITY_RULE select
  23. parity <= MultiXOR(source) when ODD, -- 奇校验
  24. ( not MultiXOR(source) ) when EVEN, -- 偶校验
  25. '1' when others;
  26. end parity_verifier;


上述奇偶校验器实现代码中的 MultiXOR 函数也是在 UART_PACKAGE 库中定义的,其功能是对输入序列进行异或计算。MultiXOR 的函数声明如下:

  1. function MultiXOR(
  2. din : in std_logic_vector )
  3. return std_logic;


MultiXOR 的函数实现如下:

  1. function MultiXOR(
  2. din : in std_logic_vector )
  3. return std_logic is
  4. variable check : std_logic;
  5. begin
  6. check := din(din'LOW);
  7. for i in 1 to (din'HIGH) loop
  8. check := check xor din(i);
  9. end loop;
  10. return check;
  11. end MultiXOR;


对上述奇偶校验器进行仿真测试,在偶校验设置下,仿真得到的波形如图 5-14 所示。

2.jpg

注意:偶校验和奇校验的计算有一个技巧。如果使用偶校验,在待校验序列中有偶数个“1”,则得到的结果为“1”,反之为“0”;如果使用奇校验,在待校验序列中有奇数个“1”,则得到的结果为“1”,反之为“0”。

更多回帖

发帖
×
20
完善资料,
赚取积分