A parity generator.
authorMalte S. Stretz <mss@apache.org>
Wed, 15 Jul 2009 11:54:54 +0000 (13:54 +0200)
committerMalte S. Stretz <mss@apache.org>
Wed, 15 Jul 2009 11:54:54 +0000 (13:54 +0200)
fhw_rs232/rs232_globals_p.vhd
fhw_rs232/rs232_recv.vhd
fhw_rs232/rs232_send.vhd
fhw_rs232/rs232_uart.vhd
fhw_rs232_t/rs232_globals_parity_t.vhd [new file with mode: 0644]

index a0aa09b..ae5f967 100644 (file)
@@ -8,21 +8,33 @@
 -- pragma library fhw_rs232
 library fhw_rs232;
 
-library fhw_tools;
-use fhw_tools.types.all;
-
 library ieee;
 use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;
 
 package rs232_globals_p is
   
-  
+  function get_parity(
+    word : std_logic_vector;
+    odd  : std_logic) return std_logic;
   
 end rs232_globals_p;
 
 package body rs232_globals_p is
 
-  
+  function get_parity(
+    word : std_logic_vector;
+    odd  : std_logic) return std_logic is
+    variable gen_v : std_logic_vector(word'high + 1 downto word'low);
+    variable par_v : std_logic;
+  begin
+    gen_v(word'high + 1) := odd;
+    gen_v(word'high downto word'low) := word;
+    par_v := '0';
+    for i in gen_v'high downto gen_v'low loop
+      par_v := par_v xor gen_v(i);
+    end loop;
+    return par_v;
+  end get_parity;
   
 end rs232_globals_p;
index d92b579..b2d0608 100644 (file)
@@ -7,6 +7,7 @@
 -- This entity is part of the following library:
 -- pragma library fhw_rs232
 library fhw_rs232;
+use fhw_rs232.rs232_globals_p.all;
 
 library ieee;
 use ieee.std_logic_1164.all;
@@ -18,7 +19,7 @@ entity rs232_recv is
     clock_divider  : positive; -- TODO: calculate this based on clock_interval
     data_width     : positive := 8;
     parity_enabled : std_logic := '0';
-    parity         : std_logic := '0');
+    parity_type    : std_logic := '1');
   port(
     clk : in  std_logic;
     rst : in  std_logic;
index 5b69ab9..5844ea8 100644 (file)
@@ -7,6 +7,7 @@
 -- This entity is part of the following library:
 -- pragma library fhw_rs232
 library fhw_rs232;
+use fhw_rs232.rs232_globals_p.all;
 
 library ieee;
 use ieee.std_logic_1164.all;
@@ -18,7 +19,7 @@ entity rs232_send is
     clock_divider  : positive; -- TODO: calculate this based on clock_interval
     data_width     : positive := 8;
     parity_enabled : std_logic := '0';
-    parity         : std_logic := '0');
+    parity_type    : std_logic := '1');
   port(
     clk : in  std_logic;
     rst : in  std_logic;
@@ -32,7 +33,6 @@ entity rs232_send is
 -----------------------------------------------------------------------
 
 architecture rtl of rs232_send is
-  
   type state_t is (
     state_idle_c,
     state_load_c,
@@ -53,8 +53,9 @@ begin
   
   frame_s(frame_t'high) <= '0';
   frame_s(frame_t'high - 1 downto frame_t'high - 8) <= txd;
-  frame_s(frame_t'low + 1) <= parity_s;
+  frame_s(frame_t'low + 1) <= get_parity(txd, parity_type);
   frame_s(frame_t'low) <= '1';
+  
 
   sequence : process(clk, rst)
   begin
index 0767ad3..aea6748 100644 (file)
@@ -18,7 +18,7 @@ entity sd_host is
     clock_divider  : positive; -- TODO: calculate this based on clock_interval
     data_width     : positive := 8;
     parity_enabled : std_logic := '0';
-    parity         : std_logic := '0');
+    parity_type    : std_logic := '1');
   port(
     clk : in  std_logic;
     rst : in  std_logic;
@@ -43,7 +43,7 @@ architecture rtl of sd_host is
       clock_divider  : positive := clock_divider;
       data_width     : positive := data_width;
       parity_enabled : std_logic := parity_enabled;
-      parity         : std_logic := parity);
+      parity_type    : std_logic := parity_type);
     port(
       clk : in  std_logic;
       rst : in  std_logic;
@@ -58,7 +58,7 @@ architecture rtl of sd_host is
       clock_divider  : positive := clock_divider;
       data_width     : positive := data_width;
       parity_enabled : std_logic := parity_enabled;
-      parity         : std_logic := parity);
+      parity_type    : std_logic := parity_type);
     port(
       clk : in  std_logic;
       rst : in  std_logic;
diff --git a/fhw_rs232_t/rs232_globals_parity_t.vhd b/fhw_rs232_t/rs232_globals_parity_t.vhd
new file mode 100644 (file)
index 0000000..ffc2f6a
--- /dev/null
@@ -0,0 +1,69 @@
+-----------------------------------------------------------------------
+-- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
+--
+-- Testing the parity generator.
+-----------------------------------------------------------------------
+-- This entity is part of the following library:
+-- pragma library fhw_rs232_t
+library fhw_rs232_t;
+library fhw_rs232;
+use fhw_rs232.rs232_globals_p.all;
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+library stefanvhdl;
+use stefanvhdl.txt_util.all;
+
+-----------------------------------------------------------------------
+
+entity rs232_globals_parity_t is
+end rs232_globals_parity_t;
+
+architecture test of rs232_globals_parity_t is
+  procedure t(
+    word   : std_logic_vector;
+    expect : std_logic) is
+    variable e_p_v, e_e_v : std_logic;
+    variable o_p_v, o_e_v : std_logic;
+  begin
+    e_e_v := expect; o_e_v := not expect;
+    e_p_v := get_parity(word, '0'); assert e_p_v = e_e_v report "wrong E parity for " & str(word) & ": " & str(e_p_v) & " != " & str(e_e_v);
+    o_p_v := get_parity(word, '1'); assert o_p_v = o_e_v report "wrong O parity for " & str(word) & ": " & str(o_p_v) & " != " & str(o_e_v);
+  end t;
+begin
+  t("0", '0');
+  t("1", '1');
+  
+  t("00", '0');
+  t("01", '1');
+  t("10", '1');
+  t("11", '0');
+  
+  t("000", '0');
+  t("001", '1');
+  t("010", '1');
+  t("011", '0');
+  t("100", '1');
+  t("101", '0');
+  t("110", '0');
+  t("111", '1');
+  
+  t("0000", '0');
+  t("0001", '1');
+  t("0010", '1');
+  t("0011", '0');
+  t("0100", '1');
+  t("0101", '0');
+  t("0110", '0');
+  t("0111", '1');
+  t("1000", '1');
+  t("1001", '0');
+  t("1010", '0');
+  t("1011", '1');
+  t("1100", '0');
+  t("1101", '1');
+  t("1110", '1');
+  t("1111", '0');
+end test;