-
Notifications
You must be signed in to change notification settings - Fork 42
/
parity_ops.vhdl
103 lines (89 loc) · 3.63 KB
/
parity_ops.vhdl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
--------------------------------------------------------------------
-- _ __ __ __ ____ __ = --
-- | | / // / / // __ \ / / = --
-- | | / // /_/ // / / // / = .__ |/ _/_ .__ .__ __ --
-- | |/ // __ // /_/ // /___ = /___) | / / ) / ) (_ ` --
-- |___//_/ /_//_____//_____/ = (___ /| (_ / (___(_ (__) --
-- ===== / --
-- === --
----------------------------- = ----------------------------------
--# parity_ops.vhdl - Parity operations
--# $Id:$
--# Freely available from VHDL-extras (http://github.com/kevinpt/vhdl-extras)
--#
--# Copyright © 2010 Kevin Thibedeau
--# (kevin 'period' thibedeau 'at' gmail 'punto' com)
--#
--# Permission is hereby granted, free of charge, to any person obtaining a
--# copy of this software and associated documentation files (the "Software"),
--# to deal in the Software without restriction, including without limitation
--# the rights to use, copy, modify, merge, publish, distribute, sublicense,
--# and/or sell copies of the Software, and to permit persons to whom the
--# Software is furnished to do so, subject to the following conditions:
--#
--# The above copyright notice and this permission notice shall be included in
--# all copies or substantial portions of the Software.
--#
--# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
--# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
--# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
--# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
--# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
--# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
--# DEALINGS IN THE SOFTWARE.
--#
--# DEPENDENCIES: none
--#
--# DESCRIPTION:
--# Functions for calculating and checking parity
--------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package parity_ops is
--## Identify the type of parity
type parity_kind is ( even, odd );
--## Compute parity.
--# Args:
--# Ptype: Type of parity; odd or even
--# Val: Value to generate parity for
--# Returns:
--# Parity bit for Val.
function parity( Ptype : parity_kind; Val : std_ulogic_vector ) return std_ulogic;
--## Check parity for an error.
--# Args:
--# Ptype: Type of parity; odd or even
--# Val: Value to test parity for
--# Parity_bit: Parity bit to check
--# Returns:
--# true if Parity_bit is correct.
function check_parity( Ptype : parity_kind; Val : std_ulogic_vector;
Parity_bit : std_ulogic ) return boolean;
end package;
package body parity_ops is
--## Calculate parity
function parity( Ptype : parity_kind; Val : std_ulogic_vector) return std_ulogic is
variable xr : std_ulogic;
function xor_reduce( Val : std_ulogic_vector ) return std_ulogic is
variable result : std_ulogic := '0';
begin
for i in Val'range loop
result := result xor Val(i);
end loop;
return result;
end function;
begin
xr := xor_reduce(Val);
if Ptype = even then
return xr;
else -- odd
return not xr;
end if;
end function;
--## Verify parity. Returns true when parity matches, false for a mismatch.
function check_parity( Ptype : parity_kind; Val : std_ulogic_vector;
Parity_bit : std_ulogic ) return boolean is
begin
return parity(Ptype, Val) = Parity_bit;
end function;
end package body;