如何在VHDL中制作一个简单的4位奇偶校验器?

时间:2011-11-19 01:32:05

标签: vhdl

我正在尝试学习VHDL,我正在尝试制作4位奇偶校验。这个想法是位来自一个输入线(每个时钟脉冲一位),并且检查器应该找出4位序列中是否存在奇数个1(即1011,0100等)并发送错误输出(例如错误标志:错误< ='1')如果有。

有人会举例说明它是如何完成的,以便我可以研究它吗?

我试过在网上搜索,但我发现的所有讨论都与某些更复杂的事情有关,我无法理解它们。

4 个答案:

答案 0 :(得分:3)

VHDL 2008标准提供了一个新的xor运算符来执行此操作。比Aaron提供的传统解决方案简单得多。

signal Data : std_logic_vector(3 downto 0) ;
signal Parity : std_logic ;
. . .
Parity <= xor Data ;

答案 1 :(得分:2)

这假定“invec”是您输入的std_logic_vector:

parity <= invec(3) xor invec(2) xor invec(1) xor invec(0);

如果它有任何大于4的输入,循环可能是最好的:

variable parity_v : std_logic := '0';
for i in invec'range loop:
  parity_v := parity_v xor invec(i);
end loop;
parity <= parity_v;

该循环将在合成时转换为适当的LUT值。

(我是从记忆中做到的;可能是轻微的语法问题。)

答案 2 :(得分:0)

代码中的小语法错误。应该在循环后删除“:”。

答案 3 :(得分:0)

pydruid.db.exceptions.ProgrammingError: Unknown error (Unknown):

或在Verilog中:

library ieee;
use ieee.std_logic_1164.all;

entity bus_parity is

    generic(
        WPARIN : integer := 8
    );

    port(
        parity_in  : in std_logic_vector(WPARIN-1 downto 0);
        parity_out : out std_logic
    );
end entity;


architecture rtl of bus_parity is
begin

process(parity_in) 
   variable i :     integer;
   variable result: std_logic;
begin

    result := '0';

    for i in parity_in'range loop
        result := result xor parity_in(i);
    end loop;

    parity_out <= result;
end process;


end architecture;