我正在尝试学习VHDL,我正在尝试制作4位奇偶校验。这个想法是位来自一个输入线(每个时钟脉冲一位),并且检查器应该找出4位序列中是否存在奇数个1(即1011,0100等)并发送错误输出(例如错误标志:错误< ='1')如果有。
有人会举例说明它是如何完成的,以便我可以研究它吗?
我试过在网上搜索,但我发现的所有讨论都与某些更复杂的事情有关,我无法理解它们。
答案 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;