diff --git a/lib/FIFO/sim/tb_async_fifo_ctrl.fdo b/lib/FIFO/sim/tb_async_fifo_ctrl.fdo
new file mode 100644
index 0000000..cfa76ee
--- /dev/null
+++ b/lib/FIFO/sim/tb_async_fifo_ctrl.fdo
@@ -0,0 +1,15 @@
+## NOTE: Do not edit this file.
+##
+vlib work
+vcom -explicit -93 "../src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../src/gray_counter.vhd"
+vcom -explicit -93 "../src/dpram.vhd"
+vcom -explicit -93 "../src/async_fifo_ctrl.vhd"
+vcom -explicit -93 "../src/tb_async_fifo_ctrl.vhd"
+vsim -t 1ps -lib work tb_async_fifo_ctrl
+view wave
+do {tb_async_fifo_ctrl.wdo}
+view structure
+view signals
+
+run 10us
diff --git a/lib/FIFO/sim/tb_async_fifo_ctrl.wdo b/lib/FIFO/sim/tb_async_fifo_ctrl.wdo
new file mode 100644
index 0000000..8f23edb
--- /dev/null
+++ b/lib/FIFO/sim/tb_async_fifo_ctrl.wdo
@@ -0,0 +1,36 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/rst
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/clk_w
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/we
+add wave -noupdate -format Literal -radix hexadecimal /tb_async_fifo_ctrl/ptr_w
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/clk_r
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/re
+add wave -noupdate -format Literal -radix hexadecimal /tb_async_fifo_ctrl/ptr_r
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/fifo_almost_empty
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/fifo_empty
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/fifo_almost_full
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/fifo_full
+add wave -noupdate -format Literal -radix hexadecimal /tb_async_fifo_ctrl/din
+add wave -noupdate -format Literal -radix hexadecimal /tb_async_fifo_ctrl/dout
+add wave -noupdate -format Logic /tb_async_fifo_ctrl/uut/inst_gray_counter_w/ce
+add wave -noupdate -format Literal -radix hexadecimal /tb_async_fifo_ctrl/uut/bnxt_w
+add wave -noupdate -format Literal /tb_async_fifo_ctrl/uut/bcnt_r
+add wave -noupdate -format Literal -radix decimal /tb_async_fifo_ctrl/uut/diffw
+add wave -noupdate -format Literal -radix decimal /tb_async_fifo_ctrl/uut/diffr
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {250000 ps} 0}
+configure wave -namecolwidth 190
+configure wave -valuecolwidth 80
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {115874 ps} {612358 ps}
diff --git a/lib/FIFO/sim/tb_gray_counter.fdo b/lib/FIFO/sim/tb_gray_counter.fdo
new file mode 100644
index 0000000..b619f71
--- /dev/null
+++ b/lib/FIFO/sim/tb_gray_counter.fdo
@@ -0,0 +1,13 @@
+## NOTE: Do not edit this file.
+##
+vlib work
+vcom -explicit -93 "../src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../src/gray_counter.vhd"
+vcom -explicit -93 "../src/tb_gray_counter.vhd"
+vsim -t 1ps -lib work tb_gray_counter
+view wave
+do {tb_gray_counter.wdo}
+view structure
+view signals
+
+run 1us
diff --git a/lib/FIFO/sim/tb_gray_counter.wdo b/lib/FIFO/sim/tb_gray_counter.wdo
new file mode 100644
index 0000000..b33112f
--- /dev/null
+++ b/lib/FIFO/sim/tb_gray_counter.wdo
@@ -0,0 +1,25 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_gray_counter/rst
+add wave -noupdate -format Logic /tb_gray_counter/ce
+add wave -noupdate -format Logic /tb_gray_counter/clk
+add wave -noupdate -format Literal /tb_gray_counter/bcnt
+add wave -noupdate -format Literal /tb_gray_counter/bnxt
+add wave -noupdate -format Literal /tb_gray_counter/gcnt
+add wave -noupdate -format Literal /tb_gray_counter/gnxt
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {20898 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+update
+WaveRestoreZoom {0 ps} {134759 ps}
diff --git a/lib/FIFO/sim/tb_sync_fifo_ctrl.fdo b/lib/FIFO/sim/tb_sync_fifo_ctrl.fdo
new file mode 100644
index 0000000..fff4902
--- /dev/null
+++ b/lib/FIFO/sim/tb_sync_fifo_ctrl.fdo
@@ -0,0 +1,15 @@
+## NOTE: Do not edit this file.
+##
+vlib work
+vcom -explicit -93 "../src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../src/gray_counter.vhd"
+vcom -explicit -93 "../src/dpram.vhd"
+vcom -explicit -93 "../src/sync_fifo_ctrl.vhd"
+vcom -explicit -93 "../src/tb_sync_fifo_ctrl.vhd"
+vsim -t 1ps -lib work tb_sync_fifo_ctrl
+view wave
+do {tb_sync_fifo_ctrl.wdo}
+view structure
+view signals
+
+run 10us
diff --git a/lib/FIFO/sim/tb_sync_fifo_ctrl.wdo b/lib/FIFO/sim/tb_sync_fifo_ctrl.wdo
new file mode 100644
index 0000000..8821953
--- /dev/null
+++ b/lib/FIFO/sim/tb_sync_fifo_ctrl.wdo
@@ -0,0 +1,32 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_sync_fifo_ctrl/rst
+add wave -noupdate -format Logic /tb_sync_fifo_ctrl/we
+add wave -noupdate -format Literal -radix hexadecimal /tb_sync_fifo_ctrl/ptr_w
+add wave -noupdate -format Logic /tb_sync_fifo_ctrl/re
+add wave -noupdate -format Literal -radix hexadecimal /tb_sync_fifo_ctrl/ptr_r
+add wave -noupdate -format Logic /tb_sync_fifo_ctrl/fifo_almost_empty
+add wave -noupdate -format Logic /tb_sync_fifo_ctrl/fifo_empty
+add wave -noupdate -format Logic /tb_sync_fifo_ctrl/fifo_almost_full
+add wave -noupdate -format Logic /tb_sync_fifo_ctrl/fifo_full
+add wave -noupdate -format Literal -radix hexadecimal /tb_sync_fifo_ctrl/din
+add wave -noupdate -format Literal -radix hexadecimal /tb_sync_fifo_ctrl/dout
+add wave -noupdate -format Literal -radix unsigned /tb_sync_fifo_ctrl/uut/pw_next
+add wave -noupdate -format Literal -radix unsigned /tb_sync_fifo_ctrl/uut/pr_next
+add wave -noupdate -format Literal -radix unsigned /tb_sync_fifo_ctrl/uut/diff
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {290000 ps} 0}
+configure wave -namecolwidth 190
+configure wave -valuecolwidth 80
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {0 ps} {2166667 ps}
diff --git a/lib/FIFO/src/async_fifo_ctrl.vhd b/lib/FIFO/src/async_fifo_ctrl.vhd
new file mode 100644
index 0000000..90fe9be
--- /dev/null
+++ b/lib/FIFO/src/async_fifo_ctrl.vhd
@@ -0,0 +1,244 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: The call/return/data stack
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/async_fifo_ctrl.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+-----------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+LIBRARY WORK;
+USE WORK.FIFO_CTRL_PKG.ALL;
+
+entity async_fifo_ctrl is
+ Generic (
+ addr_width : integer := 3;
+ almost_full_thresh : integer := 6;
+ almost_empty_thresh : integer := 2
+ );
+ Port
+ (
+ rst : in STD_LOGIC;
+ clk_w : in STD_LOGIC;
+ clk_r : in STD_LOGIC;
+ we : in STD_LOGIC;
+ re : in STD_LOGIC;
+ ptr_w : out unsigned (addr_width-1 downto 0);
+ ptr_r : out unsigned (addr_width-1 downto 0);
+ fifo_full : out STD_LOGIC;
+ fifo_empty : out STD_LOGIC;
+ fifo_afull : out STD_LOGIC;
+ fifo_aempty : out STD_LOGIC
+ );
+end async_fifo_ctrl;
+
+architecture Behavioral of async_fifo_ctrl is
+
+ signal gcnt_w : unsigned (addr_width downto 0);
+ signal gcnt2_w : unsigned (addr_width downto 0);
+ signal bcnt2_aw : unsigned (addr_width downto 0);
+ signal bcnt_w : unsigned (addr_width downto 0);
+ signal gnxt_w : unsigned (addr_width downto 0);
+ signal bnxt_w : unsigned (addr_width downto 0);
+ signal gcnt_r : unsigned (addr_width downto 0);
+ signal gcnt2_r : unsigned (addr_width downto 0);
+ signal bcnt2_ar : unsigned (addr_width downto 0);
+ signal bcnt_r : unsigned (addr_width downto 0);
+ signal gnxt_r : unsigned (addr_width downto 0);
+ signal bnxt_r : unsigned (addr_width downto 0);
+
+ signal empty, full : std_logic;
+ signal write_inhibit, read_inhibit : std_logic;
+ signal winc, rinc : std_logic;
+
+ -- synthesis translate_off
+ signal diffw : signed (addr_width downto 0);
+ signal diffr : signed (addr_width downto 0);
+ -- synthesis translate_on
+
+begin
+
+ ptr_w <= bcnt_w(addr_width-1 downto 0);
+ ptr_r <= bcnt_r(addr_width-1 downto 0);
+ winc <= we and (not write_inhibit);
+ rinc <= re and (not read_inhibit);
+ fifo_full <= write_inhibit;
+ fifo_empty <= read_inhibit;
+
+proc_write_inhibit:
+ process(rst, clk_w)
+ begin
+ if rst = '1' then
+ write_inhibit <= '0';
+ elsif rising_edge(clk_w) then
+ write_inhibit <= full;
+ end if;
+ end process;
+
+proc_read_inhibit:
+ process(rst, clk_r)
+ begin
+ if rst = '1' then
+ read_inhibit <= '1';
+ elsif rising_edge(clk_r) then
+ read_inhibit <= empty;
+ end if;
+ end process;
+
+proc_sync_grptr:
+ process(clk_w)
+ variable p1, p2 : unsigned (addr_width downto 0);
+ begin
+ if rising_edge(clk_w) then
+ gcnt2_r <= p2;
+ p2 := p1;
+ p1 := gcnt_r;
+ end if;
+ end process;
+
+proc_ptr_gwptr:
+ process(clk_r)
+ variable p1, p2 : unsigned (addr_width downto 0);
+ begin
+ if rising_edge(clk_r) then
+ gcnt2_w <= p2;
+ p2 := p1;
+ p1 := gcnt_w;
+ end if;
+ end process;
+
+proc_status_full:
+ process(gnxt_w, gcnt2_r)
+ begin
+ if (gnxt_w = (not gcnt2_r(gcnt2_r'left downto gcnt2_r'left-1) & gcnt2_r(gcnt2_r'left-2 downto 0))) then
+ full <= '1';
+ else
+ full <= '0';
+ end if;
+ end process;
+
+proc_status_empty:
+ process(gnxt_r, gcnt2_w)
+ begin
+ if (gnxt_r = gcnt2_w) then
+ empty <= '1';
+ else
+ empty <= '0';
+ end if;
+ end process;
+
+proc_sync_arptr:
+ process(clk_w)
+ variable p1, p2 : unsigned (addr_width downto 0);
+ begin
+ if rising_edge(clk_w) then
+ bcnt2_ar <= p2;
+ p2 := p1;
+ p1 := bcnt_r;
+ end if;
+ end process;
+
+proc_ptr_awptr:
+ process(clk_r)
+ variable p1, p2 : unsigned (addr_width downto 0);
+ begin
+ if rising_edge(clk_r) then
+ bcnt2_aw <= p2;
+ p2 := p1;
+ p1 := bcnt_w;
+ end if;
+ end process;
+
+proc_status_almost_full:
+ process(rst, clk_w)
+ variable diff : unsigned (addr_width downto 0);
+ begin
+ -- synthesis translate_off
+ diffw <= signed(diff);
+ -- synthesis translate_on
+ if rst = '1' then
+ fifo_afull <= '0';
+ diff := (others => '0');
+ elsif rising_edge(clk_w) then
+ if diff >= almost_full_thresh-1 then
+ fifo_afull <= '1';
+ else
+ fifo_afull <= '0';
+ end if;
+ diff := unsigned(abs(signed(bnxt_w) - signed(bcnt2_ar)));
+ end if;
+ end process;
+
+proc_status_almost_empty:
+ process(rst, clk_r)
+ variable diff : unsigned (addr_width downto 0);
+ begin
+ -- synthesis translate_off
+ diffr <= signed(diff);
+ -- synthesis translate_on
+ if rst = '1' then
+ fifo_aempty <= '1';
+ diff := (others => '0');
+ elsif rising_edge(clk_r) then
+ if diff <= almost_empty_thresh+1 then
+ fifo_aempty <= '1';
+ else
+ fifo_aempty <= '0';
+ end if;
+ diff := unsigned(abs(signed(bcnt2_aw) - signed(bnxt_r)));
+ end if;
+ end process;
+
+inst_gray_counter_w : entity work.gray_counter
+ generic map (
+ width => addr_width+1,
+ init_value => 0
+ )
+ port map (
+ rst => rst,
+ clk => clk_w,
+ ce => winc,
+ bcnt => bcnt_w,
+ bnxt => bnxt_w,
+ gcnt => gcnt_w,
+ gnxt => gnxt_w
+ );
+
+inst_gray_counter_r : entity work.gray_counter
+ generic map (
+ width => addr_width+1,
+ init_value => 0
+ )
+ port map (
+ rst => rst,
+ clk => clk_r,
+ ce => rinc,
+ bcnt => bcnt_r,
+ bnxt => bnxt_r,
+ gcnt => gcnt_r,
+ gnxt => gnxt_r
+ );
+
+end Behavioral;
+
diff --git a/lib/FIFO/src/dpram.vhd b/lib/FIFO/src/dpram.vhd
new file mode 100644
index 0000000..b8f8565
--- /dev/null
+++ b/lib/FIFO/src/dpram.vhd
@@ -0,0 +1,79 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: Dual-ported register file with asynchrous read
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/dpram.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+-----------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+entity dpram is
+ Generic (
+ addr_width : integer := 3;
+ data_width : integer := 8
+ );
+ Port (
+ clka : in STD_LOGIC;
+ clkb : in STD_LOGIC;
+ en_a : in STD_LOGIC;
+ en_b : in STD_LOGIC;
+ we_a : in STD_LOGIC;
+ addr_a : in unsigned (addr_width-1 downto 0);
+ addr_b : in unsigned (addr_width-1 downto 0);
+ din_a : in unsigned (data_width-1 downto 0);
+ dout_b : out unsigned (data_width-1 downto 0)
+ );
+end dpram;
+
+architecture Behavioral of dpram is
+
+ constant depth : integer := 2**addr_width;
+ type RAMtype is array (0 to depth-1) of unsigned (data_width-1 downto 0);
+ signal RAM : RAMtype;
+
+begin
+
+process (clka)
+begin
+if clka'event and clka = '1' then
+ if en_a = '1' then
+ if we_a = '1' then
+ RAM(to_integer(addr_a)) <= din_a;
+ end if;
+ end if;
+end if;
+end process;
+
+process (clkb)
+begin
+if clkb'event and clkb = '1' then
+ if en_b = '1' then
+ dout_b <= RAM(to_integer(addr_b));
+ end if;
+end if;
+end process;
+
+
+end Behavioral;
+
diff --git a/lib/FIFO/src/fifo_ctrl_pkg.vhd b/lib/FIFO/src/fifo_ctrl_pkg.vhd
new file mode 100644
index 0000000..a8c9c61
--- /dev/null
+++ b/lib/FIFO/src/fifo_ctrl_pkg.vhd
@@ -0,0 +1,46 @@
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/fifo_ctrl_pkg.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+-----------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+package fifo_ctrl_pkg is
+
+ -- Constants
+ -- Types
+
+ -- Functions
+ function bin2gray(xb : unsigned) return unsigned;
+ function gray2bin(xg : unsigned) return unsigned;
+
+end fifo_ctrl_pkg;
+
+package body fifo_ctrl_pkg is
+
+ function bin2gray(xb : unsigned) return unsigned is
+ variable xg : unsigned(xb'left downto xb'right);
+ begin
+
+ xg(xg'left) := xb(xb'left);
+ for i in 1 to xb'left loop
+ xg(xg'left-i) := xb(xb'left-i+1) xor xb(xb'left-i);
+ end loop;
+
+ return xg;
+ end bin2gray;
+
+ function gray2bin(xg : unsigned) return unsigned is
+ variable xb : unsigned(xg'left downto xg'right);
+ begin
+
+ xb(xb'left) := xg(xg'left);
+ for i in 1 to xg'left loop
+ xb(xb'left-i) := xb(xb'left-i+1) xor xg(xg'left-i);
+ end loop;
+
+ return xb;
+ end gray2bin;
+
+end fifo_ctrl_pkg;
+
diff --git a/lib/FIFO/src/gray_counter.vhd b/lib/FIFO/src/gray_counter.vhd
new file mode 100644
index 0000000..eb17fd5
--- /dev/null
+++ b/lib/FIFO/src/gray_counter.vhd
@@ -0,0 +1,88 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: The call/return/data stack
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/gray_counter.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+-----------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+LIBRARY WORK;
+USE WORK.FIFO_CTRL_PKG.ALL;
+
+entity gray_counter is
+ Generic (
+ width : natural := 3;
+ init_value : natural := 0
+ );
+ Port
+ (
+ rst : in STD_LOGIC;
+ clk : in STD_LOGIC;
+ ce : in STD_LOGIC;
+ bcnt : out unsigned (width-1 downto 0);
+ bnxt : out unsigned (width-1 downto 0);
+ gcnt : out unsigned (width-1 downto 0);
+ gnxt : out unsigned (width-1 downto 0)
+ );
+end gray_counter;
+
+architecture Behavioral of gray_counter is
+
+ signal cntb : unsigned (width-1 downto 0);
+ signal nxtb : unsigned (width-1 downto 0);
+ signal cntg : unsigned (width-1 downto 0);
+ signal nxtg : unsigned (width-1 downto 0);
+
+begin
+
+ bnxt <= nxtb;
+ gnxt <= nxtg;
+
+ process(rst, clk, ce, cntb, nxtb)
+ begin
+ if rst = '1' then
+ cntb <= to_unsigned(init_value, width);
+ nxtb <= to_unsigned(init_value, width);
+ cntg <= to_unsigned(init_value, width);
+ nxtg <= to_unsigned(init_value, width);
+ bcnt <= to_unsigned(init_value, width);
+ gcnt <= to_unsigned(init_value, width);
+ else
+ if rising_edge(clk) then
+ bcnt <= nxtb;
+ gcnt <= nxtg;
+ cntb <= nxtb;
+ cntg <= nxtg;
+ end if;
+ nxtg <= bin2gray(nxtb);
+ nxtb <= cntb;
+ if ce = '1' then
+ nxtb <= cntb + 1;
+ end if;
+ end if;
+ end process;
+
+end Behavioral;
+
diff --git a/lib/FIFO/src/sync_fifo_ctrl.vhd b/lib/FIFO/src/sync_fifo_ctrl.vhd
new file mode 100644
index 0000000..ef8661f
--- /dev/null
+++ b/lib/FIFO/src/sync_fifo_ctrl.vhd
@@ -0,0 +1,199 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: The call/return/data stack
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/sync_fifo_ctrl.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+-----------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+entity sync_fifo_ctrl is
+ Generic (
+ addr_width : integer := 3;
+ almost_full_thresh : integer := 6;
+ almost_empty_thresh : integer := 2
+ );
+ Port
+ (
+ rst : in STD_LOGIC;
+ clk : in STD_LOGIC;
+ we : in STD_LOGIC;
+ re : in STD_LOGIC;
+ ptr_w : out unsigned (addr_width-1 downto 0);
+ ptr_r : out unsigned (addr_width-1 downto 0);
+ fifo_full : out STD_LOGIC;
+ fifo_empty : out STD_LOGIC;
+ fifo_afull : out STD_LOGIC;
+ fifo_aempty : out STD_LOGIC
+ );
+end sync_fifo_ctrl;
+
+architecture Behavioral of sync_fifo_ctrl is
+
+ signal pW, pW_cnt, pW_next : unsigned (addr_width-1 downto 0);
+ signal pR, pR_cnt, pR_next : unsigned (addr_width-1 downto 0);
+ signal empty, full : std_logic;
+ signal pre_empty, pre_full : std_logic;
+ signal was_write : std_logic;
+ signal write, read : std_logic;
+ signal diff : unsigned (addr_width downto 0);
+
+begin
+
+ read <= '1' when re = '1' and empty = '0' else '0';
+ write <= '1' when we = '1' and full = '0' else '0';
+
+ fifo_full <= full;
+ fifo_empty <= empty;
+
+
+proc_diff_gen:
+ process(rst, clk)
+ begin
+ if rst = '1' then
+ diff <= (others => '0');
+ elsif rising_edge(clk) then
+ if write = '1' and read = '0' then
+ diff <= diff + 1;
+ elsif write = '0' and read = '1' then
+ diff <= diff - 1;
+ end if;
+ end if;
+ end process;
+
+proc_status_almost_full:
+ process(rst, clk)
+ begin
+ if rst = '1' then
+ fifo_afull <= '0';
+ elsif rising_edge(clk) then
+ if diff >= almost_full_thresh-1 then
+ fifo_afull <= '1';
+ else
+ fifo_afull <= '0';
+ end if;
+ end if;
+ end process;
+
+proc_status_almost_empty:
+ process(rst, clk)
+ begin
+ if rst = '1' then
+ fifo_aempty <= '1';
+ elsif rising_edge(clk) then
+ if diff <= almost_empty_thresh+1 then
+ fifo_aempty <= '1';
+ else
+ fifo_aempty <= '0';
+ end if;
+ end if;
+ end process;
+
+proc_full_reg:
+ process(rst, clk)
+ begin
+ if rst = '1' then
+ full <= '0';
+ elsif rising_edge(clk) then
+ full <= pre_full;
+ end if;
+ end process;
+
+proc_empty_reg:
+ process(rst, clk)
+ begin
+ if rst = '1' then
+ empty <= '1';
+ elsif rising_edge(clk) then
+ empty <= pre_empty;
+ end if;
+ end process;
+
+proc_status_w:
+ process(was_write, pW_next, pR_next, pW, pR, we, re)
+ begin
+ if (pW_next = pR) and (we = '1' or was_write = '1') then
+ pre_full <= '1';
+ else
+ pre_full <= '0';
+ end if;
+ if (pR_next = pW) and (re = '1' or was_write = '0') then
+ pre_empty <= '1';
+ else
+ pre_empty <= '0';
+ end if;
+ end process;
+
+proc_flag_write:
+ process(rst, clk)
+ begin
+ if rst = '1' then
+ was_write <= '0';
+ elsif rising_edge(clk) then
+ if write = '1' then
+ was_write <= '1';
+ elsif read = '1' then
+ was_write <= '0';
+ end if;
+ end if;
+ end process;
+
+proc_ptr_w:
+ process(rst, clk, pW, we, full)
+ begin
+ if rst = '1' then
+ pW <= to_unsigned(0, addr_width);
+ pW_next <= to_unsigned(0, addr_width);
+ elsif rising_edge(clk) then
+ if we = '1' then
+ pW <= pW_next;
+ end if;
+ end if;
+ pW_next <= pW;
+ if we = '1' and full = '0' then
+ pW_next <= pW + 1;
+ end if;
+ ptr_w <= pW;
+ end process;
+
+proc_ptr_r:
+ process(rst, clk, pR_next, pR, re, empty)
+ begin
+ if rst = '1' then
+ pR <= to_unsigned(0, addr_width);
+ pR_next <= to_unsigned(0, addr_width);
+ elsif rising_edge(clk) then
+ if re = '1' then
+ pR <= pR_next;
+ end if;
+ end if;
+ pR_next <= pR;
+ if re = '1' and empty = '0' then
+ pR_next <= pR + 1;
+ end if;
+ ptr_r <= pR_next;
+ end process;
+
+end Behavioral;
+
diff --git a/lib/FIFO/src/tb_async_fifo_ctrl.vhd b/lib/FIFO/src/tb_async_fifo_ctrl.vhd
new file mode 100644
index 0000000..2e95862
--- /dev/null
+++ b/lib/FIFO/src/tb_async_fifo_ctrl.vhd
@@ -0,0 +1,176 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_nco
+-- Module Name: tb_nco.vhd
+-- Project Name: nco
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/tb_async_fifo_ctrl.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+-----------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.MATH_REAL.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+USE STD.TEXTIO.ALL;
+
+-- LIBRARY WORK;
+-- USE.YOURLIB.WHATELSE
+
+ENTITY tb_async_fifo_ctrl IS
+END tb_async_fifo_ctrl;
+
+ARCHITECTURE behavior OF tb_async_fifo_ctrl IS
+
+ --Constants
+ constant PERIOD_W : time := 10 ns;
+ constant PERIOD_R : time := 20 ns;
+ constant ADDR_WIDTH : integer := 3;
+
+ --Inputs
+ signal rst : STD_LOGIC := '1';
+ signal clk_w : STD_LOGIC := '0';
+ signal clk_r : STD_LOGIC := '0';
+ signal we : STD_LOGIC := '0';
+ signal re : STD_LOGIC := '0';
+ signal din : unsigned (7 downto 0);
+ --Outputs
+
+ signal ptr_w : unsigned (ADDR_WIDTH-1 downto 0);
+ signal ptr_r : unsigned (ADDR_WIDTH-1 downto 0);
+ signal dout : unsigned (7 downto 0);
+ signal fifo_full : STD_LOGIC;
+ signal fifo_empty : STD_LOGIC;
+ signal fifo_almost_full : STD_LOGIC;
+ signal fifo_almost_empty : STD_LOGIC;
+ signal mem_we : STD_LOGIC;
+
+ signal write_en : STD_LOGIC := '0';
+ signal read_en : STD_LOGIC := '0';
+
+ signal wdata : unsigned (7 downto 0) := (others => '0');
+ signal rdata : unsigned (7 downto 0) := (others => '0');
+ signal rdata2 : unsigned (7 downto 0) := (others => '0');
+
+BEGIN
+
+ din <= wdata;
+
+ -- Instantiate the Unit Under Test (UUT)
+ uut: entity work.async_fifo_ctrl
+ GENERIC MAP
+ (
+ addr_width => ADDR_WIDTH,
+ almost_full_thresh => 6,
+ almost_empty_thresh => 2
+ )
+ PORT MAP
+ (
+ rst => rst,
+ clk_w => clk_w,
+ clk_r => clk_r,
+ we => we,
+ re => re,
+ ptr_w => ptr_w,
+ ptr_r => ptr_r,
+ fifo_full => fifo_full,
+ fifo_empty => fifo_empty,
+ fifo_afull => fifo_almost_full,
+ fifo_aempty => fifo_almost_empty
+
+ );
+
+ inst_dpram: entity work.dpram
+ GENERIC MAP (
+ addr_width => ADDR_WIDTH,
+ data_width => 8
+ )
+ PORT MAP(
+ clka => clk_w,
+ clkb => clk_r,
+ en_a => '1',
+ en_b => '1',
+ we_a => mem_we,
+ addr_a => ptr_w,
+ addr_b => ptr_r,
+ din_a => din,
+ dout_b => dout
+ );
+
+ tb_clk_w : PROCESS
+ BEGIN
+ clk_w <= not clk_w;
+ wait for PERIOD_W/2;
+ END PROCESS;
+
+ tb_clk_r : PROCESS
+ BEGIN
+ clk_r <= not clk_r;
+ wait for PERIOD_R/2;
+ END PROCESS;
+
+ tb_write : PROCESS
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 5*PERIOD_W;
+ rst <= '0';
+ wait for 5*PERIOD_W;
+ write_en <= '1';
+ wait for 15*PERIOD_W;
+ write_en <= '0';
+
+ wait;
+
+ END PROCESS;
+
+ tb_read : PROCESS
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 15*PERIOD_R;
+ read_en <= '1';
+
+ wait;
+
+ END PROCESS;
+
+ we <= write_en and not fifo_full;
+ mem_we <= we;
+
+ tb_w : PROCESS(rst, clk_w)
+ BEGIN
+
+ if rst = '1' then
+ wdata <= (others => '0');
+ elsif rising_edge(clk_w) then
+ if we = '1' then
+ wdata <= wdata + 1;
+ end if;
+ end if;
+
+ END PROCESS;
+
+ re <= read_en and not fifo_empty;
+
+ tb_r : PROCESS(rst, clk_r)
+ BEGIN
+
+ if rst = '1' then
+ rdata <= (others => '0');
+ elsif rising_edge(clk_r) then
+ rdata2 <= rdata;
+ if re = '1' then
+ assert rdata2 = dout report "FIFO read error!" severity failure;
+ rdata <= rdata + 1;
+ end if;
+ end if;
+
+ END PROCESS;
+
+END behavior;
\ No newline at end of file
diff --git a/lib/FIFO/src/tb_gray_counter.vhd b/lib/FIFO/src/tb_gray_counter.vhd
new file mode 100644
index 0000000..00380d7
--- /dev/null
+++ b/lib/FIFO/src/tb_gray_counter.vhd
@@ -0,0 +1,83 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_gray_counter
+-- Module Name: tb_gray_counter.vhd
+-- Project Name: gray_counter package
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/tb_gray_counter.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+-----------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.MATH_REAL.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+USE STD.TEXTIO.ALL;
+
+LIBRARY WORK;
+USE WORK.FIFO_CTRL_PKG.ALL;
+
+ENTITY tb_gray_counter IS
+END tb_gray_counter;
+
+ARCHITECTURE behavior OF tb_gray_counter IS
+
+ constant PERIOD : time := 10 ns;
+ constant WIDTH : integer := 3;
+
+ --Signals
+ signal gcnt : unsigned (WIDTH-1 downto 0) := to_unsigned(0, WIDTH);
+ signal bcnt : unsigned (WIDTH-1 downto 0) := to_unsigned(0, WIDTH);
+ signal gnxt : unsigned (WIDTH-1 downto 0) := to_unsigned(0, WIDTH);
+ signal bnxt : unsigned (WIDTH-1 downto 0) := to_unsigned(0, WIDTH);
+ signal rst : STD_LOGIC := '1';
+ signal clk : STD_LOGIC := '0';
+ signal ce : STD_LOGIC := '0';
+
+BEGIN
+
+inst_gray_counter : entity work.gray_counter
+ generic map (width => WIDTH)
+ port map (
+ rst => rst,
+ clk => clk,
+ ce => ce,
+ bcnt => bcnt,
+ bnxt => bnxt,
+ gcnt => gcnt,
+ gnxt => gnxt
+ );
+
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb_counter : PROCESS
+
+ BEGIN
+
+ wait for 4*PERIOD;
+ rst <= '0';
+ wait for 1*PERIOD;
+ ce <= '1';
+ wait for 3*PERIOD;
+ ce <= '0';
+ wait for 4*PERIOD;
+ ce <= '1';
+ wait for 1*PERIOD;
+ ce <= '0';
+ wait for 1*PERIOD;
+ ce <= '1';
+
+ wait;
+
+ END PROCESS;
+
+END behavior;
\ No newline at end of file
diff --git a/lib/FIFO/src/tb_sync_fifo_ctrl.vhd b/lib/FIFO/src/tb_sync_fifo_ctrl.vhd
new file mode 100644
index 0000000..4eb81e3
--- /dev/null
+++ b/lib/FIFO/src/tb_sync_fifo_ctrl.vhd
@@ -0,0 +1,221 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_nco
+-- Module Name: tb_nco.vhd
+-- Project Name: nco
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/FIFO/src/tb_sync_fifo_ctrl.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+-----------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.MATH_REAL.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+USE STD.TEXTIO.ALL;
+
+-- LIBRARY WORK;
+-- USE.YOURLIB.WHATELSE
+
+ENTITY tb_sync_fifo_ctrl IS
+END tb_sync_fifo_ctrl;
+
+ARCHITECTURE behavior OF tb_sync_fifo_ctrl IS
+
+ --Constants
+ constant PERIOD : time := 10 ns;
+ constant ADDR_WIDTH : integer := 3;
+
+ --Inputs
+ signal rst : STD_LOGIC := '1';
+ signal clk : STD_LOGIC := '0';
+ signal we : STD_LOGIC := '0';
+ signal re : STD_LOGIC := '0';
+ signal din : unsigned (7 downto 0);
+ --Outputs
+
+ signal ptr_w : unsigned (ADDR_WIDTH-1 downto 0);
+ signal ptr_r : unsigned (ADDR_WIDTH-1 downto 0);
+ signal dout : unsigned (7 downto 0);
+ signal fifo_full : STD_LOGIC;
+ signal fifo_empty : STD_LOGIC;
+ signal fifo_almost_full : STD_LOGIC;
+ signal fifo_almost_empty : STD_LOGIC;
+ signal mem_we : STD_LOGIC;
+
+ signal write_en : STD_LOGIC := '0';
+ signal read_en : STD_LOGIC := '0';
+
+ signal wdata : unsigned (7 downto 0) := (others => '0');
+ signal rdata : unsigned (7 downto 0) := (others => '0');
+ signal rdata2 : unsigned (7 downto 0) := (others => '0');
+
+BEGIN
+
+ din <= wdata;
+
+ -- Instantiate the Unit Under Test (UUT)
+ uut: entity work.sync_fifo_ctrl
+ GENERIC MAP
+ (
+ addr_width => ADDR_WIDTH,
+ almost_full_thresh => 6,
+ almost_empty_thresh => 2
+ )
+ PORT MAP
+ (
+ rst => rst,
+ clk => clk,
+ we => we,
+ re => re,
+ ptr_w => ptr_w,
+ ptr_r => ptr_r,
+ fifo_full => fifo_full,
+ fifo_empty => fifo_empty,
+ fifo_afull => fifo_almost_full,
+ fifo_aempty => fifo_almost_empty
+
+ );
+
+ inst_dpram: entity work.dpram
+ GENERIC MAP (
+ addr_width => ADDR_WIDTH,
+ data_width => 8
+ )
+ PORT MAP(
+ clka => clk,
+ clkb => clk,
+ en_a => '1',
+ en_b => '1',
+ we_a => mem_we,
+ addr_a => ptr_w,
+ addr_b => ptr_r,
+ din_a => din,
+ dout_b => dout
+ );
+
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb_write : PROCESS
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 5*PERIOD;
+ rst <= '0';
+ wait for 7*PERIOD;
+ write_en <= '1';
+ wait for 25*PERIOD;
+ write_en <= '0';
+ wait for 7*PERIOD;
+ write_en <= '1';
+ wait for 25*PERIOD;
+ write_en <= '0';
+ wait for 7*PERIOD;
+ write_en <= '1';
+ wait for 1*PERIOD;
+ write_en <= '0';
+ wait for 1*PERIOD;
+ write_en <= '1';
+ wait for 1*PERIOD;
+ write_en <= '0';
+ wait for 3*PERIOD;
+ write_en <= '1';
+ wait for 4*PERIOD;
+ write_en <= '0';
+ wait for 17*PERIOD;
+ write_en <= '1';
+ wait for 25*PERIOD;
+ write_en <= '0';
+
+ wait;
+
+ END PROCESS;
+
+ tb_read : PROCESS
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 25*PERIOD;
+ read_en <= '1';
+ wait for 25*PERIOD;
+ read_en <= '0';
+ wait for 25*PERIOD;
+ read_en <= '1';
+ wait for 1*PERIOD;
+ read_en <= '0';
+ wait for 5*PERIOD;
+ read_en <= '1';
+ wait for 1*PERIOD;
+ read_en <= '0';
+ wait for 5*PERIOD;
+ read_en <= '1';
+ wait for 1*PERIOD;
+ read_en <= '0';
+ wait for 5*PERIOD;
+ read_en <= '1';
+ wait for 1*PERIOD;
+ read_en <= '0';
+ wait for 5*PERIOD;
+ read_en <= '1';
+ wait for 1*PERIOD;
+ read_en <= '0';
+ wait for 5*PERIOD;
+ read_en <= '1';
+ wait for 1*PERIOD;
+ read_en <= '0';
+ wait for 5*PERIOD;
+ read_en <= '1';
+ wait for 1*PERIOD;
+ read_en <= '0';
+ wait for 7*PERIOD;
+ read_en <= '1';
+ wait for 15*PERIOD;
+ read_en <= '0';
+
+ wait;
+
+ END PROCESS;
+
+ we <= write_en and not fifo_full;
+ mem_we <= we;
+
+ tb_w : PROCESS(rst, clk)
+ BEGIN
+
+ if rst = '1' then
+ wdata <= (others => '0');
+ elsif rising_edge(clk) then
+ if we = '1' then
+ wdata <= wdata + 1;
+ end if;
+ end if;
+
+ END PROCESS;
+
+ re <= read_en and not fifo_empty;
+
+ tb_r : PROCESS(rst, clk)
+ BEGIN
+
+ if rst = '1' then
+ rdata <= (others => '0');
+ elsif rising_edge(clk) then
+ rdata2 <= rdata;
+ if re = '1' then
+ assert rdata = dout report "FIFO read error!" severity failure;
+ rdata <= rdata + 1;
+ end if;
+ end if;
+
+ END PROCESS;
+
+END behavior;
\ No newline at end of file
diff --git a/lib/PCK_FIO-1.16/PCK_FIO.html b/lib/PCK_FIO-1.16/PCK_FIO.html
new file mode 100644
index 0000000..8b8c8c5
--- /dev/null
+++ b/lib/PCK_FIO-1.16/PCK_FIO.html
@@ -0,0 +1,297 @@
+
+
+
+
+
+ VHDL package for formatted file output
+
+
+
+
+
+
+Name
+PCK_FIO - VHDL package for formatted file output
+
+
+
+Contents
+Usage
+
The file output function 'fo'
+
Format specifiers
+
Special characters
+
Things to watch out for
+
Methodology notes
+
Parametrization
+
Test bench
+
Known limitations and problems
+
Author
+
+
+
+Usage
+PCK_FIO is a VHDL package that defines fprint, a function
+for formatted file output.
+After installing the package you can call fprint as follows:
+
fprint(F, L, Format, fo(Expr_1), fo(Expr_2), ... fo(Expr_n));
+where F is the filehandle and L is the line variable.
+The argument Format is the format string, which consists of ``normal''
+substrings which are copied verbatim, and format specifiers, starting with
+'%'.
+A typical format string looks as follows:
+
"Arg1 = %6r, Arg2 = %10d, Arg3 = %-5r\n"
+The remaining arguments are the expressions whose results you want to write
+to the file, embedded in fo function calls. There can be 0 to
+32 of such arguments. The expressions can be of any type for which an fo
+function exists. String expressions can also be called directly.
+
+
+
+The file output function 'fo'
+The fo (file output) functions do the trick. They
+return a tagged string representation that is meaningful to format specifiers.
+Here are some examples:
+ fo (signed'("1100")) returns "S:1100"
+ fo (unsigned'("1100")) returns "U:1100"
+ fo (TRUE) returns "L:T"
+ fo (127) returns "I:127"
+The internal behavior of fo is irrelevant to the typical user.
+The fo function is currently overloaded as follows:
+
function fo (Arg: unsigned) return string;
+ function fo (Arg: signed) return string;
+ function fo (Arg: std_logic_vector) return string;
+ function fo (Arg: std_ulogic_vector) return string;
+ function fo (Arg: bit_vector) return string;
+ function fo (Arg: integer) return string;
+ function fo (Arg: std_ulogic) return string;
+ function fo (Arg: bit) return string;
+ function fo (Arg: boolean) return string;
+ function fo (Arg: character) return string;
+ function fo (Arg: string) return string;
+ function fo (Arg: time) return string;
+
+
+
+
+
+Format specifiers
+The general format of a format specifier is:
+ %[-][n]c
+The optional - sign specifies left justified output; default is
+right justified.
+The optional number n specifies a field-width. If it is not specified,
+fprint
+does something reasonable.
+
c is the conversion specifier. Currently the following conversion
+specifiers are supported:
+
+-
+r
+
+-
+reasonable output format (inspired by Synopsys VSS)
+
+Prints the ``most reasonable'' representation e.g. hex for
+unsigned, signed and other bit-like vectors (not preferred for integers)
+
+-
+b
+
+-
+bit-oriented output
+
+-
+d
+
+-
+decimal output
+
+-
+s
+
+-
+string output (e.g. in combination with 'IMAGE for enum types)
+
+-
+q
+
+-
+``qualified'' string output (shows internal representation from fo)
+
+-
+{}
+
+-
+Iteration operator, used as follows:
+
+-
+%n{<format-string>}
+
+
In this case, n is the iteration count and is mandatory. Iteration
+can be nested.
+
+
+
+Special characters
+To print a double-quote, use '""' in the format string (VHDL
+convention). To print the special characters, '\', and '%',
+escape them with '\'. To prevent '{' and '}'
+from being interpreted as opening and closing brackets in iteration strings,
+escape them with '\'.
+A newline is specified in the format string by '\n'.
+
+
+
+Things to notice
+The fprint function expands into VHDL write and writeline
+commands. As in plain VHDL, nothing will be written to the output file
+until a writeline is given. Therefore, don't forget to include
+'\n'
+commands in the format string, or it ``will not work''.
+The preferred format specifier for integers is, naturally, %d.
+This calls the VHDL write for integers. If you specify a field
+width that is too small, the field will automatically be expanded. If you
+use %r for integers, the field is not expanded automatically, which
+means that some digits are simply thrown away. This may sometimes be useful
+but it is also dangerous. Look at the test bench output for differences
+between %d and %r output.
+
When using the %d format specifier, the VHDL constraints for
+the allowed integer range apply.
+
In VHDL, signed/unsigned types have been standardized only relatively
+recently, in the package IEEE.numeric_std. The lack of a standard
+has caused (and is causing) portability issues. The most popular non-standard
+package that defines signed/unsigned is IEEE.std_logic_arith from
+Synopsys. PCK_FIO has been developed with this latter package, and still
+refers to this package by default. However, PCK_FIO works with
+IEEE.numeric_std
+as well. To use IEEE.numeric_std, replace the reference to IEEE.std_logic_arith
+in the source code. This needs to be done consistently in a design
+database (e.g. in the PCK_FIO test bench as well).
+
+
+
+Methodology notes
+The obvious application for fprint is in test benches, to produce
+output files that trace the simulation behavior.
+Another interesting application for fprint is to produce info,
+warning and error messages in your models. As it can take arguments, fprint
+is much better suited for this task than VHDL's assert or report
+statements. Actually fprint produces its own (few) warning messages.
+
An advanced usage is the generation of test vectors in a specific format.
+Instead of using the fo functions, you can write your own set
+of functions that return the symbols of a specific test format in a way
+that is understandable to the fprint format specifiers. As an
+example, when a high output value should be represented using the symbol
+'H' it suffices to write a conversion function that returns "B:H" and call
+it in combination with the %b format specifier.
+
+
+
+Parametrization
+Prefix and postfix strings for bit-oriented and hex-oriented output are
+parameterizable in the packages to accommodate different output styles.
+The settings in the distribution are such that hex output is indicated
+by the prefix '0x', while bit output prefix and postfix are empty
+strings.
+You can adapt the output style by modifying the following constants
+in the package header:
+
-- prefix string for hex output
+
-- VHDL style: "X"""
+
-- Verilog style: "h'"
+
-- C style: "0x"
+
constant FIO_h_PRE: string := "0x";
+
-- postfix string for hex output
+
-- VHDL style: """"
+
constant FIO_h_POST: string := "";
+
-- prefix string for bit vector output
+
-- VHDL style: "B"""
+
-- Verilog style: "b'"
+
constant FIO_bv_PRE: string := "";
+
-- postfix string for bit vector output
+
-- VHDL style: """"
+
constant FIO_bv_POST: string := "";
+
-- prefix string for bit output
+
-- VHDL style: "'"
+
-- Verilog style: "b'"
+
constant FIO_b_PRE: string := "";
+
-- postfix string for bit output
+
-- VHDL style: "'"
+
constant FIO_b_POST: string := "";
+
+
+
+Test bench
+Included in the distribution is a file TB_PCK_FIO.vhd with a test
+bench for the PCK_FIO package. The file PCK_FIO.out.gold contains
+the expected output. If you run the test bench it should produce the file
+PCK_FIO.out
+that should be identical to PCK_FIO.out.gold. The source files
+should be analyzed in a VHDL library EASICS_PACKAGES.
+A good way to understand fprint is to inspect the test bench
+and what it produces.
+
+
+
+Known limitations and problems
+This VHDL package is an implementation of a flexible concept. It is likely
+to be extended and modified in the future. Backward compatibility is not
+guaranteed. Therefore, it is not recommended to give this package the status
+of a company-wide standard package (or even worse, a VHDL standard package).
+Rather, it should be linked with a particular project (and it can be regarded
+as a standard package within that project).
+PCK_FIO is written in standard VHDL Std1076-1987. Nevertheless, some
+simulators/versions have problems with the package. The following is an
+overview of currently known issues:
+
+
+
+| Simulator |
+
+PCK_FIO handling |
+
+
+
+| Synopsys VSS 3.5 and earlier |
+
+Incorrect (all zero) output in compiled mode |
+
+
+
+| Synopsys VSS 97.01 |
+
+OK |
+
+
+
+| Mentor quickhdl |
+
+OK |
+
+
+
+| Modeltech modelsim |
+
+OK |
+
+
+
+| Cadence Leapfrog |
+
+Should work with 4.4.1
+ Mysterious problems have been reported - please run the test bench
+and report problems |
+
+
+PCK_FIO and various simulators/versions
+
+
+Although the package name suggests file IO, it only does file output.
+
+
+
+Author
+Jan Decaluwe
+
+
+
+
diff --git a/lib/PCK_FIO-1.16/PCK_FIO.out.gold b/lib/PCK_FIO-1.16/PCK_FIO.out.gold
new file mode 100644
index 0000000..dcd183e
--- /dev/null
+++ b/lib/PCK_FIO-1.16/PCK_FIO.out.gold
@@ -0,0 +1,206 @@
+PCK_FIO.out: TESTBENCH OUTPUT FOR PCK_FIO
+-----------------------------------------
+
+This is the result of running the PCK_FIO testbench.
+This file should be compared with PCK_FIO.out.gold, which is
+the reference output. Any difference indicates a portability
+issue or a simulator non-compliance or bug.
+
+
+--------------------
+-- Basic features --
+--------------------
+
+-- First some auxiliary declarations
+> file RESULT: text is out "PCK_FIO.out";
+> variable L: line;
+> variable BoolTrue: boolean := TRUE;
+> variable BoolFalse: boolean := FALSE;
+> variable IntPos: integer := 5678;
+> variable BigIntPos: integer := 12345678;
+> variable IntNeg: integer := -8765;
+> variable BigIntNeg: integer := -87654321;
+> variable Uns: unsigned(6 downto 0) := unsigned'("1010010");
+> variable Unk: unsigned(6 downto 0) := unsigned'("1X10Z10");
+> variable Std: std_logic_vector(6 downto 0) := std_logic_vector'("0010010");
+> variable SigPos: signed(6 downto 0) := signed'("0010010");
+> variable SigNeg: signed(6 downto 0) := signed'("1010010");
+> variable BitX: std_logic := 'X';
+> variable Bit1: std_logic := '1';
+> variable Bit0: std_logic := '0';
+
+
+-- fprint call with no arguments
+> fprint(RESULT, L, "No arguments.\n);"
+No arguments.
+
+-- Special characters need to be escaped
+> fprint(RESULT, L, "Special characters: \% \\ " \n");
+Special characters: % \ "
+
+-- Various format specifiers interprete the same object differently
+> fprint(RESULT, L, "Format specifiers: %r %d %b %q\n);"
+> fo(Uns), fo(Uns), fo(Uns), fo(Uns)
+> );
+Format specifiers: 0x52 82 1010010 U:1010010
+
+-- Format string can be shortened by using the iteration specifier
+> fprint(RESULT, L, "Iteration specifier: %4{%r }\n);"
+> fo(Uns), fo(SigPos), fo(SigNeg), fo(Std)
+> );
+Iteration specifier: 0x52 0x12 0x52 0x12
+
+------------------------------------
+-- Support for bit-oriented types --
+------------------------------------
+
+-- Reasonable format
+> fprint(RESULT, L, "Reasonable format: %9{%r }\n",
+> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+> );
+Reasonable format: 0x12 0x52 0x12 0x52 0x?? 1 X T F
+
+-- Decimal format
+> fprint(RESULT, L, "Decimal format: %7{%d }\n",
+> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+> );
+Decimal format: 18 82 18 -46 -1 1 -1 1 0
+
+-- Bit format
+> fprint(RESULT, L, "Bit format: %7{%b }\n",
+> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+> );
+Bit format: 0010010 1010010 0010010 1010010 1X10Z10 1 X 1 0
+
+
+-- Alignment
+-- Template of the call: ( stands for the format specifier)
+
+> fprint(RESULT, L, "Bitvectors with : %4{|}\n",
+> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg)
+> );
+
+-- Results of the call with various format specifiers
+
+Bitvectors with %1r: 0x52|0x12|0x12|0x52|
+Bitvectors with %2r: 0x52|0x12|0x12|0x52|
+Bitvectors with %3r: 0x52|0x12|0x12|0x52|
+Bitvectors with %4r: 0x52|0x12|0x12|0x52|
+Bitvectors with %5r: 0x52| 0x12| 0x12| 0x52|
+Bitvectors with %6r: 0x52| 0x12| 0x12| 0x52|
+Bitvectors with %7r: 0x52| 0x12| 0x12| 0x52|
+Bitvectors with %8r: 0x52| 0x12| 0x12| 0x52|
+Bitvectors with %9r: 0x52| 0x12| 0x12| 0x52|
+
+Bitvectors with %-1r: 0x52|0x12|0x12|0x52|
+Bitvectors with %-2r: 0x52|0x12|0x12|0x52|
+Bitvectors with %-3r: 0x52|0x12|0x12|0x52|
+Bitvectors with %-4r: 0x52|0x12|0x12|0x52|
+Bitvectors with %-5r: 0x52 |0x12 |0x12 |0x52 |
+Bitvectors with %-6r: 0x52 |0x12 |0x12 |0x52 |
+Bitvectors with %-7r: 0x52 |0x12 |0x12 |0x52 |
+Bitvectors with %-8r: 0x52 |0x12 |0x12 |0x52 |
+Bitvectors with %-9r: 0x52 |0x12 |0x12 |0x52 |
+
+Bitvectors with %1d: 82|18|18|-46|
+Bitvectors with %2d: 82|18|18|-46|
+Bitvectors with %3d: 82| 18| 18|-46|
+Bitvectors with %4d: 82| 18| 18| -46|
+Bitvectors with %5d: 82| 18| 18| -46|
+Bitvectors with %6d: 82| 18| 18| -46|
+Bitvectors with %7d: 82| 18| 18| -46|
+Bitvectors with %8d: 82| 18| 18| -46|
+Bitvectors with %9d: 82| 18| 18| -46|
+
+Bitvectors with %-1d: 82|18|18|-46|
+Bitvectors with %-2d: 82|18|18|-46|
+Bitvectors with %-3d: 82 |18 |18 |-46|
+Bitvectors with %-4d: 82 |18 |18 |-46 |
+Bitvectors with %-5d: 82 |18 |18 |-46 |
+Bitvectors with %-6d: 82 |18 |18 |-46 |
+Bitvectors with %-7d: 82 |18 |18 |-46 |
+Bitvectors with %-8d: 82 |18 |18 |-46 |
+Bitvectors with %-9d: 82 |18 |18 |-46 |
+
+
+-------------------------------
+-- Support for integer types --
+-------------------------------
+
+
+-- Template of the call: ( stands for the format specifier)
+
+> fprint(RESULT, L, "Integers with : %4{|}\n",
+> fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+> );
+
+-- Results of the call with various format specifiers
+
+Integers with %5d: 5678|-8765|12345678|-87654321|
+Integers with %6d: 5678| -8765|12345678|-87654321|
+Integers with %7d: 5678| -8765|12345678|-87654321|
+Integers with %8d: 5678| -8765|12345678|-87654321|
+Integers with %9d: 5678| -8765| 12345678|-87654321|
+Integers with %10d: 5678| -8765| 12345678| -87654321|
+
+Integers with %-5d: 5678 |-8765|12345678|-87654321|
+Integers with %-6d: 5678 |-8765 |12345678|-87654321|
+Integers with %-7d: 5678 |-8765 |12345678|-87654321|
+Integers with %-8d: 5678 |-8765 |12345678|-87654321|
+Integers with %-9d: 5678 |-8765 |12345678 |-87654321|
+Integers with %-10d: 5678 |-8765 |12345678 |-87654321 |
+
+Integers with %5r: 5678|-8765| 5678|-4321|
+Integers with %6r: 5678|- 8765| 45678|-54321|
+Integers with %7r: 5678|- 8765| 345678|-654321|
+Integers with %8r: 5678|- 8765| 2345678|-7654321|
+Integers with %9r: 5678|- 8765| 12345678|-87654321|
+Integers with %10r: 5678|- 8765| 12345678|- 87654321|
+
+Integers with %-5r: 5678|-8765| 1234|-8765|
+Integers with %-6r: 5678 |-8765 | 12345|-87654|
+Integers with %-7r: 5678 |-8765 | 123456|-876543|
+Integers with %-8r: 5678 |-8765 | 1234567|-8765432|
+Integers with %-9r: 5678 |-8765 | 12345678|-87654321|
+Integers with %-10r: 5678 |-8765 | 12345678 |-87654321 |
+
+
+----------------------
+-- Support for time --
+----------------------
+-- For portability reasons, time is converted
+-- into an integer value (of nanoseconds)
+> wait for 648 ns
+> fprint (RESULT, L, "The time is now %d ns\n", fo(now));
+The time is now 648 ns
+
+----------------------------------------
+-- Erroneous calls and error messages --
+----------------------------------------
+
+-- Less arguments than formats specifiers
+> fprint(RESULT, L, "%d %d %d %d \n", fo(Uns), fo(Std));
+82 18
+** Warning: FIO_PrintLastValue: Format specifier beyond last argument
+** in format string: "%d %d %d %d \n"
+** ------^
+
+-- Unsupported format specifier
+> fprint(RESULT, L, "%r %v %r %r\n", fo(Uns), fo(Std), fo(Uns), fo(Std));
+0x52
+** Warning: FIO_PrintArg: Unexpected format specifier 'v'
+** in format string: "%r %v %r %r\n"
+** ----^
+** Assuming 'q' to proceed: V:0010010 0x52 0x12
+
+
+----------------------------------------
+-- Things you wouldn't expect to work --
+----------------------------------------
+
+-- Nested iteration
+> fprint(RESULT, L, "%3{<<%3{_END_}>>}\n");
+<<_END__END__END_>><<_END__END__END_>><<_END__END__END_>>
diff --git a/lib/PCK_FIO-1.16/PCK_FIO.vhd b/lib/PCK_FIO-1.16/PCK_FIO.vhd
new file mode 100644
index 0000000..e5e6a8e
--- /dev/null
+++ b/lib/PCK_FIO-1.16/PCK_FIO.vhd
@@ -0,0 +1,916 @@
+---- File: PCK_FIO.vhd
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 1999 Easics NV
+----
+---- This program is free software; you can redistribute it and/or modify
+---- it under the terms of the GNU General Public License as published by
+---- the Free Software Foundation; either version 1, or (at your option)
+---- any later version.
+----
+---- This program is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+---- GNU General Public License for more details.
+----
+---- You should have received a copy of the GNU General Public License
+---- along with this program; if not, write to the Free Software
+---- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+----
+---- Revision history:
+----
+---- $Source: /tmp/cvsroot/VHDL/lib/PCK_FIO-1.16/PCK_FIO.vhd,v $
+---- $Revision: 1.1 $
+---- $Log: not supported by cvs2svn $
+---- Revision 1.16 1999/04/21 08:28:46 jand
+---- Tested with IEEE.numeric_std
+---- Small patch for Leapfrog
+----
+---- Revision 1.14 1997/07/14 10:16:04 jand
+---- prefix/postfix for bits/bitvectors set to empty strings by default
+----
+---- Revision 1.13 1997/07/11 17:42:57 jand
+---- Corrected Easics address
+----
+---- Revision 1.12 1997/07/11 17:38:49 jand
+---- Improved prefix/postfix support
+----
+---- Revision 1.11 1995/11/15 13:46:02 jand
+---- Catched integer'low value in fo for integers
+----
+---- Revision 1.10 1995/08/11 16:42:26 jand
+---- Reimplemented FIO_FormatExpand as a procedure in an attempt to
+---- avoid memory leakage problems in VSS
+----
+---- Revision 1.9 1995/08/09 13:47:51 jand
+---- Removed array of line trick in fprint for less memory, less
+---- CPU time, and more conservatism in general
+---- Rearranged FIO_PrintValue call so that fprint remains concise
+----
+---- Revision 1.8 1995/08/09 10:32:27 jand
+---- Removed fprint_flat to have a single call level
+---- Added explicit deallocators of line variables (has strong influence
+---- on memory usage in VSS - and possibly CPU time)
+---- Redefined 'fo' for type time to make it more portable
+----
+---- Revision 1.7 1995/08/07 08:56:04 jand
+---- Improved conciseness of fprint argument handling through array of line type
+----
+---- Revision 1.6 1995/08/04 18:19:13 jand
+---- Increase # arguments from 16 to 32
+---- Corrected bug within fprint 's call to Arg16
+---- Added support for bit format specifier 'b'
+----
+---- Revision 1.5 1995/08/02 10:22:37 jand
+---- Release 1.1 under GNU
+----
+---- Revision 1.4 1995/08/01 11:15:52 jand
+---- Added escaping during iteration string read
+----
+---- Revision 1.3 1995/08/01 08:23:47 jand
+---- Many improvements in robustness, conciseness and coding style
+----
+---- Revision 1.2 1995/07/30 16:15:43 jand
+---- Improved robustness for release to the world
+----
+---- Revision 1.1 1995/07/30 14:21:30 jand
+---- Initial revision
+----
+
+use STD.TEXTIO.all;
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- signed/unsigned definition: use either std_logic_arith or numeric_std
+use IEEE.std_logic_arith.all; -- the Synopsys one
+-- use IEEE.numeric_std.all;
+
+package PCK_FIO is
+
+ -- prefix string for hex output
+ -- VHDL style: "X"""
+ -- Verilog style: "h'"
+ -- C style: "0x"
+ constant FIO_h_PRE: string := "0x";
+
+ -- postfix string for hex output
+ -- VHDL style: """"
+ constant FIO_h_POST: string := "";
+
+ -- prefix string for bit vector output
+ -- VHDL style: "B"""
+ -- Verilog style: "b'"
+ constant FIO_bv_PRE: string := "";
+
+ -- postfix string for bit vector output
+ -- VHDL style: """"
+ constant FIO_bv_POST: string := "";
+
+ -- prefix string for bit output
+ -- VHDL style: "'"
+ -- Verilog style: "b'"
+ constant FIO_b_PRE: string := "";
+
+ -- postfix string for bit output
+ -- VHDL style: "'"
+ constant FIO_b_POST: string := "";
+
+ -- digit width for the string representation of integers
+ constant FIO_d_WIDTH: integer := 10;
+
+ -- bit width for the string representation of integers
+ constant FIO_b_WIDTH: integer := 32;
+
+ -- definition of the NIL string (default value for fprint arguments)
+ -- fprint stops consuming arguments at the first NIL argument
+ constant FIO_NIL: string := "\";
+
+ procedure fprint
+ (F: out text;
+ L: inout line;
+ Format: in string;
+ A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 : in string := FIO_NIL;
+ A9 , A10, A11, A12, A13, A14, A15, A16: in string := FIO_NIL;
+ A17, A18, A19, A20, A21, A22, A23, A24: in string := FIO_NIL;
+ A25, A26, A27, A28, A29, A30, A31, A32: in string := FIO_NIL
+ );
+
+ function fo (Arg: unsigned) return string;
+ function fo (Arg: signed) return string;
+ function fo (Arg: std_logic_vector) return string;
+ function fo (Arg: std_ulogic_vector) return string;
+ function fo (Arg: bit_vector) return string;
+ function fo (Arg: integer) return string;
+ function fo (Arg: std_ulogic) return string;
+ function fo (Arg: bit) return string;
+ function fo (Arg: boolean) return string;
+ function fo (Arg: character) return string;
+ function fo (Arg: string) return string;
+ function fo (Arg: time) return string;
+
+ procedure FIO_FormatExpand (FMT: inout line;
+ Format: in string;
+ StartPointer: in positive);
+
+end PCK_FIO;
+
+
+package body PCK_FIO is
+
+
+ --------------------------
+ -- FIO Warnings support --
+ --------------------------
+
+ procedure FIO_Warning_Fsbla (F: out text;
+ L: inout line;
+ Format: in string;
+ Pointer: in positive) is
+ begin
+ fprint (F, L, "\n** Warning: FIO_PrintLastValue: " &
+ "Format specifier beyond last argument\n");
+ fprint (F, L, "** in format string: ""%s""\n", Format);
+ fprint (F, L, "** ");
+ for i in 1 to Pointer-1 loop
+ fprint (F, L, "-");
+ end loop;
+ fprint (F, L, "^\n");
+ end FIO_Warning_Fsbla;
+
+ procedure FIO_Warning_Ufs (F: out text;
+ L: inout line;
+ Format: in string;
+ Pointer: in positive;
+ Char: in character) is
+ begin
+ fprint (F, L, "\n** Warning: FIO_PrintArg: " &
+ "Unexpected format specifier '%r'\n",
+ fo(Char));
+ fprint (F, L, "** in format string: ""%s""\n", Format) ;
+ fprint (F, L, "** ");
+ for i in 1 to Pointer-1 loop
+ fprint (F, L, "-");
+ end loop;
+ fprint (F, L, "^\n** Assuming 'q' to proceed: ");
+ end FIO_Warning_Ufs;
+
+
+ ----------------------------------
+ -- bit conversion support --
+ ----------------------------------
+
+ type T_bit_map is array(bit) of character;
+
+ constant C_BIT_MAP: T_bit_map
+ := ('0', '1');
+
+ ----------------------------------
+ -- std_logic conversion support --
+ ----------------------------------
+
+ type T_std_logic_map is array(std_ulogic) of character;
+
+ constant C_STD_LOGIC_MAP: T_std_logic_map
+ := ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-');
+
+ ------------------------------
+ -- Digit conversion support --
+ ------------------------------
+
+ -- types & constants
+
+ subtype S_digit_chars is character range '0' to '9';
+ subtype S_digits is integer range 0 to 9 ;
+
+ type T_digit_chars_map is array(S_digit_chars) of S_digits;
+
+ constant C_DIGIT_CHARS_MAP: T_digit_chars_map
+ := (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
+
+ type T_digits_map is array(S_digits) of S_digit_chars;
+
+ constant C_DIGITS_MAP: T_digits_map
+ := ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
+
+
+ --------------------------------
+ -- Decimal conversion support --
+ --------------------------------
+
+ function U_To_d (Arg: string) return integer is
+ constant Argument: string(Arg'length downto 1) := Arg;
+ variable Result: integer := 0;
+ begin
+ for i in Argument'range loop
+ case Argument(i) is when '1' => Result := 2**(i-1) + Result;
+ when '0' => null;
+ when others => return(-1);
+ end case;
+ end loop;
+ return (Result);
+ end U_To_d;
+
+ function S_To_d (Arg: string) return integer is
+ constant Argument: string(Arg'length downto 1) := Arg;
+ variable Result: integer := 0;
+ begin
+ case Argument(Argument'left) is
+ when '1' => Result := - 2**(Argument'left-1);
+ when '0' => Result := 0;
+ when others => return (integer'low);
+ end case;
+ for i in Argument'left-1 downto 1 loop
+ case Argument(i) is when '1' => Result := 2**(i-1) + Result;
+ when '0' => null;
+ when others => return(integer'low);
+ end case;
+ end loop;
+ return (Result);
+ end S_To_d;
+
+ function I_To_d (Arg: string(1 to FIO_d_WIDTH+1)) return integer is
+ constant Sign: character := Arg(1);
+ constant Value: string(Arg'length-1 downto 1) := Arg(2 to Arg'length);
+ variable Char: character;
+ variable Result: integer := 0;
+ begin
+ Result := 0;
+ for i in Value'range loop
+ Result := Result * 10;
+ Char := Value(i);
+ if (Char /= ' ') then
+ Result := Result + C_DIGIT_CHARS_MAP(Char);
+ end if;
+ end loop;
+ case Sign is when '-' => return(-Result);
+ when others => return(Result);
+ end case;
+ end I_To_d;
+
+ function B_To_d (Arg: string(1 to 1)) return integer is
+ begin
+ case Arg is when "1" => return(1);
+ when "0" => return(0);
+ when others => return(-1);
+ end case;
+ end B_To_d;
+
+ function L_To_d (Arg: string(1 to 1)) return integer is
+ begin
+ case Arg is when "T" => return(1);
+ when others => return(0);
+ end case;
+ end L_To_d;
+
+
+
+ ----------------------------
+ -- Hex conversion support --
+ ----------------------------
+
+ -- Constants & types
+
+ constant C_HEX_CHARS: string(1 to 17) := "0123456789ABCDEF?";
+
+ -- Function to return Hex index of a nibble
+
+ function U_To_h_Index(Arg: string(4 downto 1)) return integer is
+ variable Index: integer := 0;
+ begin
+ for i in Arg'range loop
+ case Arg(i) is when '1' => Index := 2**(i-1) + Index;
+ when '0' => null;
+ when others => return (17);
+ end case;
+ end loop;
+ return (Index+1);
+ end U_To_h_Index;
+
+ -- Hex conversion
+
+ function U_To_h (Arg: string) return string is
+ variable Result: string((Arg'length-1)/4 +1 downto 1);
+ variable ExtArg: string(Result'length*4 downto 1) := (others => '0');
+ begin
+ ExtArg(Arg'length downto 1) := Arg;
+ for i in Result'range loop
+ Result(i) := C_HEX_CHARS(U_To_h_Index( ExtArg(i*4 downto i*4 -3) ));
+ end loop;
+ return (FIO_h_PRE & Result & FIO_h_POST);
+ end U_To_h;
+
+
+
+ ----------------------------
+ -- Bit conversion support --
+ ----------------------------
+
+ function L_To_b (Arg: string(1 to 1)) return string is
+ variable Result: string(1 to 1);
+ begin
+ case Arg is when "T" => Result := "1";
+ when others => Result := "0";
+ end case;
+ return(FIO_b_PRE & Result & FIO_b_POST);
+ end L_To_b;
+
+
+ function I_To_b (Arg: string(1 to FIO_d_WIDTH+1);
+ Justified: side;
+ Width: integer) return string is
+
+ variable IntValue: integer := I_To_d(Arg);
+ variable BitValue: string(1 to FIO_b_WIDTH) := (others => ' ');
+ variable Sign: character := ' ';
+ constant Blanks: string(1 to FIO_b_WIDTH) := (others => ' ');
+ variable BitWidth: integer range 0 to FIO_b_WIDTH;
+ variable MsPos: integer range 1 to BitValue'length;
+ variable BitValueExtended: string(1 to 2*FIO_b_WIDTH);
+
+ begin
+
+ if (IntValue < 0) then
+ Sign := '-';
+ IntValue := -IntValue;
+ end if;
+
+ for i in BitValue'reverse_range loop
+ BitValue(i) := C_DIGITS_MAP(IntValue mod 2);
+ IntValue := IntValue / 2;
+ exit when (IntValue = 0);
+ end loop;
+
+ BitValueExtended := BitValue & Blanks;
+
+ if (Width = 0) or (Width > FIO_b_WIDTH+1) then
+ BitWidth := FIO_b_WIDTH;
+ else
+ BitWidth := Width-1;
+ end if;
+
+ if (Justified = RIGHT) then
+ return (FIO_bv_PRE &
+ Sign & BitValue(BitValue'length-BitWidth+1 to BitValue'length) &
+ FIO_bv_POST);
+ else
+ for i in BitValue'range loop
+ if BitValue(i) /= ' ' then
+ MSPos := i;
+ exit;
+ end if;
+ end loop;
+ return (FIO_bv_PRE &
+ Sign & BitValueExtended(MSPos to MSPos+BitWidth-1) &
+ FIO_bv_POST);
+ end if;
+
+ end I_To_b;
+
+
+ -----------------------------------
+ -- Reasonable conversion support --
+ -----------------------------------
+
+ function I_To_r (Arg: string(1 to FIO_d_WIDTH+1);
+ Justified: side;
+ Width: integer) return string is
+ constant Value: string(1 to FIO_d_WIDTH) := Arg(2 to FIO_d_WIDTH+1);
+ constant Sign: character := Arg(1);
+ constant Blanks: string(1 to FIO_d_WIDTH) := (others => ' ');
+ variable IntWidth: integer range 0 to FIO_d_WIDTH;
+ variable MsPos: integer range 1 to Value'length;
+ variable ValueExtended: string(1 to 2*FIO_d_WIDTH) := Value & Blanks;
+ begin
+ if (Width = 0) or (Width > FIO_d_WIDTH+1) then
+ IntWidth := FIO_d_WIDTH;
+ else
+ IntWidth := Width-1;
+ end if;
+ if (Justified = RIGHT) then
+ return (Sign & Value(Value'length-IntWidth+1 to Value'length));
+ else
+ for i in Value'range loop
+ if Value(i) /= ' ' then
+ MSPos := i;
+ exit;
+ end if;
+ end loop;
+ return (Sign & ValueExtended(MSPos to MSPos+IntWidth-1));
+ end if;
+ end I_To_r;
+
+
+ -------------------------------------------
+ -- Reasonable output conversion function --
+ -------------------------------------------
+
+ function ReasonableOutput (Arg: string;
+ Justified: side;
+ Width: integer) return string is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:" | "S:" | "V:" =>
+ return U_To_h(Value);
+ when "I:" =>
+ return I_To_r(Value, Justified, Width);
+ when "B:" | "L:" | "C:" =>
+ return Value;
+ when others =>
+ return Argument;
+ end case;
+
+ end ReasonableOutput;
+
+
+ ------------------------------------
+ -- Bit output conversion function --
+ ------------------------------------
+
+ function BitOutput (Arg: string;
+ Justified: side;
+ Width: integer) return string is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:" | "S:" | "V:" =>
+ return (FIO_bv_PRE & Value & FIO_bv_POST);
+ when "B:" =>
+ -- Value(1 to 1) instead of Value for LeapFrog
+ return (FIO_b_PRE & Value(1 to 1) & FIO_b_POST);
+ when "I:" =>
+ return I_To_b(Value, Justified, Width);
+ when "L:" =>
+ -- Value(1 to 1) instead of Value for LeapFrog
+ return L_To_b(Value(1 to 1));
+ when others =>
+ return Argument;
+ end case;
+
+ end BitOutput;
+
+
+ -------------------------------------------
+ -- Decimal output conversion function --
+ -------------------------------------------
+
+ function DecimalOutput (Arg: string) return integer is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:"| "V:" =>
+ return U_To_d(Value);
+ when "S:" =>
+ return S_To_d(Value);
+ when "I:" =>
+ return I_To_d(Value);
+ when "B:" =>
+ return B_To_d(Value);
+ when "L:" =>
+ return L_To_d(Value);
+ when others =>
+ return integer'low;
+ end case;
+
+ end DecimalOutput;
+
+
+ ----------------------------
+ -- Atomic print functions --
+ ----------------------------
+
+ function FIO_EOS (Format: in string;
+ Pointer: in integer)
+ return boolean is
+ begin
+ return (Pointer > Format'length);
+ end FIO_EOS;
+
+
+ -- Atomic value print function
+
+ procedure FIO_PrintValue (F: out text;
+ L: inout line;
+ Format: in string;
+ Pointer: inout integer;
+ Last: in boolean := FALSE) is
+ variable Char: character;
+ begin
+ while (not FIO_EOS(Format, Pointer)) loop
+ Char := Format(Pointer);
+ case Char is
+ when '\' =>
+ Pointer := Pointer + 1;
+ exit when (FIO_EOS(Format, Pointer));
+ Char := Format(Pointer);
+ case Char is when 'n' => writeline(F, L);
+ when others => write(L, Char);
+ end case;
+ when '%' =>
+ if Last then
+ FIO_Warning_Fsbla(F, L, Format, Pointer);
+ end if;
+ Pointer := Pointer + 1;
+ exit;
+ when others =>
+ write(L, char);
+ end case;
+ Pointer := Pointer + 1;
+ end loop;
+ end FIO_PrintValue;
+
+
+ ---- Atomic argument print function
+
+ procedure FIO_PrintArg (F: out text;
+ L: inout line;
+ Format: in string;
+ Pointer: inout integer;
+ Arg: in string) is
+ variable Char: character;
+ variable Justified: side;
+ variable Width: integer;
+ begin
+
+ FIO_PrintValue(F, L, Format, Pointer);
+
+ Justified := RIGHT;
+ Width := 0;
+ while (not FIO_EOS(Format, Pointer)) loop
+ Char := Format(Pointer);
+ case Char is
+ when '-' =>
+ Justified := LEFT;
+ Pointer := Pointer + 1;
+ when '0' to '9' =>
+ Width := Width*10 + C_DIGIT_CHARS_MAP(Char);
+ Pointer := Pointer + 1;
+ when 'r' =>
+ write(L, ReasonableOutput(Arg, Justified, Width), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'b' =>
+ write(L, BitOutput(Arg, Justified, Width), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'd' =>
+ write(L, DecimalOutput(Arg), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'q' | 's' =>
+ write(L, Arg, Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when others =>
+ FIO_Warning_Ufs(F, L, Format, Pointer, Char);
+ write(L, Arg, Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ end case;
+ end loop;
+ end FIO_PrintArg;
+
+
+ -----------------------------------------------------
+ -- The format string iteration expansion procedure --
+ -----------------------------------------------------
+
+ procedure FIO_FormatExpand (FMT: inout line;
+ Format: in string;
+ StartPointer: in positive) is
+
+ variable Pointer: positive := StartPointer;
+ variable TokenStart: positive;
+ variable IterStringStart: positive;
+ variable IterStringEnd: positive;
+ variable IterCount: natural;
+ variable OpenBrackets: natural;
+ variable L: line;
+
+ begin
+
+ FORMAT_SEARCH: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+
+ -- look for format specifier
+ when '%' =>
+
+ -- initialize iteration token search
+ TokenStart := Pointer;
+ IterCount := 0;
+ Pointer := Pointer + 1;
+
+ -- start iteration token search
+ TOKEN_READ: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+
+ -- read iteration counter
+ when '0' to '9' =>
+ IterCount := IterCount*10 + C_DIGIT_CHARS_MAP(Format(Pointer));
+ Pointer := Pointer + 1;
+
+ -- expect open bracket
+ when '{' =>
+
+ -- initialize iteration string read
+ OpenBrackets := 1;
+ IterStringStart := Pointer + 1;
+ Pointer := Pointer + 1;
+ -- quit prematurely when iteration count is 0
+ next FORMAT_SEARCH when (IterCount = 0);
+
+ -- start iteration string read
+ ITER_STRING_READ: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+ -- keep track of open brackets
+ when '{' =>
+ OpenBrackets := OpenBrackets + 1;
+ Pointer := Pointer + 1;
+ -- when closing bracket is found, process iteration string
+ when '}' =>
+ OpenBrackets := OpenBrackets - 1;
+ if (OpenBrackets = 0) then
+ IterStringEnd := Pointer-1;
+ if (TokenStart /= 1) then
+ write(L, Format(1 to TokenStart-1));
+ end if;
+ for i in 1 to IterCount loop
+ write(L, Format(IterStringStart to IterStringEnd));
+ end loop;
+ if (IterStringEnd /= Format'length) then
+ write(L, Format(IterStringEnd+2 to Format'length));
+ end if;
+ -- call expansion procedure recursively on expanded format
+ FIO_FormatExpand(FMT, L.all, TokenStart);
+ deallocate(L);
+ return;
+ end if;
+ Pointer := Pointer + 1;
+ -- skip escaped characters
+ when '\' =>
+ Pointer := Pointer + 2;
+ -- read iteration string
+ when others =>
+ Pointer := Pointer + 1;
+
+ end case;
+
+ end loop ITER_STRING_READ;
+
+ -- stop iteration token search when no opening bracket found
+ when others =>
+ Pointer := Pointer + 1;
+ next FORMAT_SEARCH;
+
+ end case;
+
+ end loop TOKEN_READ;
+
+ -- skip escaped characters
+ when '\' =>
+ Pointer := Pointer + 2;
+
+ -- read other characters
+ when others =>
+ Pointer := Pointer + 1;
+
+ end case;
+
+ end loop FORMAT_SEARCH;
+
+ write(FMT, Format);
+ deallocate(L);
+
+ end FIO_FormatExpand;
+
+
+
+ --------------------------
+ -- The fprint procedure --
+ --------------------------
+
+ procedure fprint
+ (F: out text;
+ L: inout line;
+ Format: in string;
+ A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 : in string := FIO_NIL;
+ A9 , A10, A11, A12, A13, A14, A15, A16: in string := FIO_NIL;
+ A17, A18, A19, A20, A21, A22, A23, A24: in string := FIO_NIL;
+ A25, A26, A27, A28, A29, A30, A31, A32: in string := FIO_NIL
+ ) is
+
+ variable Pointer: integer;
+ variable FMT: line;
+
+ begin
+
+ Pointer := 1;
+
+ FIO_FormatExpand (FMT, Format, Format'low);
+
+ if (A1 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A1 );
+ if (A2 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A2 );
+ if (A3 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A3 );
+ if (A4 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A4 );
+ if (A5 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A5 );
+ if (A6 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A6 );
+ if (A7 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A7 );
+ if (A8 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A8 );
+ if (A9 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A9 );
+ if (A10 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A10);
+ if (A11 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A11);
+ if (A12 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A12);
+ if (A13 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A13);
+ if (A14 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A14);
+ if (A15 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A15);
+ if (A16 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A16);
+ if (A17 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A17);
+ if (A18 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A18);
+ if (A19 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A19);
+ if (A20 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A20);
+ if (A21 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A21);
+ if (A22 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A22);
+ if (A23 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A23);
+ if (A24 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A24);
+ if (A25 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A25);
+ if (A26 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A26);
+ if (A27 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A27);
+ if (A28 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A28);
+ if (A29 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A29);
+ if (A30 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A30);
+ if (A31 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A31);
+ if (A32 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A32);
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+
+ FIO_PrintValue(F, L, FMT.all, Pointer, Last => TRUE);
+
+ deallocate(FMT);
+
+ end fprint;
+
+
+ -------------------------------------------
+ -- Formatted output conversion functions --
+ -------------------------------------------
+
+ function fo (Arg: unsigned) return string is
+ constant Argument: unsigned(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("U:" & Result);
+ end fo;
+
+ function fo (Arg: signed) return string is
+ constant Argument: signed(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("S:" & Result);
+ end fo;
+
+ function fo (Arg: std_logic_vector) return string is
+ constant Argument: std_logic_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: std_ulogic_vector) return string is
+ constant Argument: std_ulogic_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: bit_vector) return string is
+ constant Argument: bit_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_BIT_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: integer) return string is
+ variable Argument: integer := Arg;
+ variable Result: string(1 to FIO_d_WIDTH) := (others => ' ');
+ variable Sign: character := ' ';
+ begin
+ if (Argument < 0) and (Argument /= integer'low) then
+ Sign := '-';
+ Argument := -Argument;
+ end if;
+ for i in Result'reverse_range loop
+ Result(i) := C_DIGITS_MAP(Argument mod 10);
+ Argument := Argument / 10;
+ exit when (Argument = 0);
+ end loop;
+ return ("I:" & Sign & Result);
+ end fo;
+
+ function fo (Arg: std_ulogic) return string is
+ begin
+ return ("B:" & C_STD_LOGIC_MAP(Arg));
+ end fo;
+
+ function fo (Arg: bit) return string is
+ begin
+ return ("B:" & C_BIT_MAP(Arg));
+ end fo;
+
+ function fo (Arg: boolean) return string is
+ begin
+ if (ARG = TRUE) then
+ return ("L:T");
+ else
+ return ("L:F");
+ end if;
+ end fo;
+
+ function fo (Arg: character) return string is
+ begin
+ return ("C:" & Arg);
+ end fo;
+
+ function fo (Arg: string) return string is
+ begin
+ return Arg;
+ end fo;
+
+ function fo (Arg: time) return string is
+ begin
+ return fo (integer (Arg / 1 ns));
+ end fo;
+
+end PCK_FIO;
diff --git a/lib/PCK_FIO-1.16/README b/lib/PCK_FIO-1.16/README
new file mode 100644
index 0000000..4af4c99
--- /dev/null
+++ b/lib/PCK_FIO-1.16/README
@@ -0,0 +1,72 @@
+# $Id: README,v 1.1 2008-08-23 08:20:28 Jens Exp $
+# $Log: not supported by cvs2svn $
+# Revision 1.3 1999/04/21 08:08:35 jand
+# Tested with IEEE.numeric_std
+# Small patch for Leapfrog
+#
+#
+
+ PCK_FIO, Version 1.16
+ Copyright (C) 1995, 1999 Easics NV
+
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 1999 Easics NV
+----
+---- This program is free software; you can redistribute it and/or modify
+---- it under the terms of the GNU General Public License as published by
+---- the Free Software Foundation; either version 1, or (at your option)
+---- any later version.
+----
+---- This program is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+---- GNU General Public License for more details.
+----
+---- You should have received a copy of the GNU General Public License
+---- along with this program; if not, write to the Free Software
+---- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+Contents
+--------
+
+This distribution contains the following files:
+
+ PCK_FIO.vhd: VHDL source of the PCK_FIO package
+ TB_PCK_FIO.vhd: VHDL source of the testbench for package PCK_FIO
+ PCK_FIO.out.gold: Certified test bench output
+ PCK_FIO.html: Manual for PCK_FIO in html format
+ README: This file
+
+
+Installation
+------------
+
+To install PCK_FIO, define a VHDL library called EASICS_PACKAGES, and
+analyze the VHDL file PCK_FIO.vhd into this library.
+
+To install the test bench, analyze TB_PCK_FIO.vhd into the same library.
+
+If you want to use IEEE.numeric_std instead of IEEE.std_logic_arith, you need
+to edit the source code of the package and the test bench and replace the
+package use clause. PCK_FIO works with either of these packages.
+
+To install the documentation, point your web browser to the file PCK_FIO.html
+and bookmark it.
+
+
+Installation check
+------------------
+
+After installing the test bench, you should run it. The corresponding VHDL
+design unit is EASICS_PACKAGES.TBE_PCK_FIO(TB).
+
+Simulating the test bench should create a file called PCK_FIO.out. This file
+should be identical to PCK_FIO.out.gold. Any difference indicates a portability
+issue or a simulator non-compliance or bug.
diff --git a/lib/PCK_FIO-1.16/TB_PCK_FIO.vhd b/lib/PCK_FIO-1.16/TB_PCK_FIO.vhd
new file mode 100644
index 0000000..c64d045
--- /dev/null
+++ b/lib/PCK_FIO-1.16/TB_PCK_FIO.vhd
@@ -0,0 +1,504 @@
+---- File: TB_PCK_FIO.vhd
+----
+---- TBC_PCK_FIO: a test bench for the PCK_FIO package.
+---- Copyright (C) 1995, 1999 Easics NV
+----
+---- This program is free software; you can redistribute it and/or modify
+---- it under the terms of the GNU General Public License as published by
+---- the Free Software Foundation; either version 1, or (at your option)
+---- any later version.
+----
+---- This program is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+---- GNU General Public License for more details.
+----
+---- You should have received a copy of the GNU General Public License
+---- along with this program; if not, write to the Free Software
+---- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 396 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+----
+---- $Source: /tmp/cvsroot/VHDL/lib/PCK_FIO-1.16/TB_PCK_FIO.vhd,v $
+---- $Revision: 1.1 $
+---- $Log: not supported by cvs2svn $
+---- Revision 1.7 1999/04/21 08:23:53 jand
+---- Tested with IEEE.numeric_std
+---- Small patch for Leapfrog
+----
+---- Revision 1.3 1998/09/29 10:09:44 vhdl
+---- to EASICS_PACKAGES
+----
+---- Revision 1.2 1998/09/29 09:17:51 vhdl
+---- library EASICS_PACKAGES;
+----
+---- Revision 1.1 1998/09/29 09:15:44 vhdl
+---- Initial revision
+----
+
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- signed/unsigned definition: use either std_logic_arith or numeric_std
+use IEEE.std_logic_arith.all; -- the Synopsys one
+-- use IEEE.numeric_std.all;
+
+use STD.TEXTIO.all;
+
+library EASICS_PACKAGES;
+use EASICS_PACKAGES.PCK_FIO.all;
+
+entity TBE_PCK_FIO is
+
+end TBE_PCK_FIO;
+
+architecture TB of TBE_PCK_FIO is
+
+begin
+
+USAGE: process
+
+ file RESULT: text is out "PCK_FIO.out";
+ variable L: line;
+ variable Pointer: integer;
+ variable BoolTrue: boolean := TRUE;
+ variable BoolFalse: boolean := FALSE;
+ variable IntPos: integer := 5678;
+ variable BigIntPos: integer := 12345678;
+ variable IntNeg: integer := -8765;
+ variable BigIntNeg: integer := -87654321;
+ variable Uns: unsigned(6 downto 0) := unsigned'("1010010");
+ variable Unk: unsigned(6 downto 0) := unsigned'("1X10Z10");
+ variable Std: std_logic_vector(6 downto 0) := std_logic_vector'("0010010");
+ variable SigPos: signed(6 downto 0) := signed'("0010010");
+ variable SigNeg: signed(6 downto 0) := signed'("1010010");
+ variable BitX: std_logic := 'X';
+ variable Bit1: std_logic := '1';
+ variable Bit0: std_logic := '0';
+
+ variable parameter_1: integer := 1234;
+ variable parameter_2: integer := 2345;
+ variable parameter_3: integer := 4567;
+
+
+begin
+
+fprint(RESULT, L,
+ "PCK_FIO.out: TESTBENCH OUTPUT FOR PCK_FIO\n" &
+ "-----------------------------------------\n\n" &
+ "This is the result of running the PCK_FIO testbench.\n" &
+ "This file should be compared with PCK_FIO.out.gold, which is\n" &
+ "the reference output. Any difference indicates a portability\n" &
+ "issue or a simulator non-compliance or bug.\n\n"
+ );
+
+
+fprint(RESULT, L,
+ "\n--------------------\n" &
+ "-- Basic features --\n" &
+ "--------------------\n\n"
+ );
+
+fprint(RESULT, L,
+ "-- First some auxiliary declarations\n"
+ );
+
+fprint(RESULT, L,
+ "> file RESULT: text is out ""PCK_FIO.out"";\n" &
+ "> variable L: line;\n" &
+ "> variable BoolTrue: boolean := TRUE;\n" &
+ "> variable BoolFalse: boolean := FALSE;\n" &
+ "> variable IntPos: integer := 5678;\n" &
+ "> variable BigIntPos: integer := 12345678;\n" &
+ "> variable IntNeg: integer := -8765;\n" &
+ "> variable BigIntNeg: integer := -87654321;\n" &
+ "> variable Uns: unsigned(6 downto 0) := unsigned'(""1010010"");\n" &
+ "> variable Unk: unsigned(6 downto 0) := unsigned'(""1X10Z10"");\n" &
+ "> variable Std: std_logic_vector(6 downto 0) := std_logic_vector'(""0010010"");\n" &
+ "> variable SigPos: signed(6 downto 0) := signed'(""0010010"");\n" &
+ "> variable SigNeg: signed(6 downto 0) := signed'(""1010010"");\n" &
+ "> variable BitX: std_logic := 'X';\n" &
+ "> variable Bit1: std_logic := '1';\n" &
+ "> variable Bit0: std_logic := '0';\n"
+);
+
+
+fprint(RESULT, L,
+ "\n\n-- fprint call with no arguments\n" &
+ "> fprint(RESULT, L, ""No arguments.\\n);""\n"
+ );
+fprint(RESULT, L, "No arguments.\n");
+
+
+fprint(RESULT, L,
+ "\n-- Special characters need to be escaped\n" &
+ "> fprint(RESULT, L, ""Special characters: \\\% \\\\ "" \\n"");\n"
+ );
+
+fprint(RESULT, L, "Special characters: \% \\ "" \n");
+
+
+fprint(RESULT, L,
+ "\n-- Various format specifiers interprete the same object differently\n" &
+ "> fprint(RESULT, L, ""Format specifiers: \%r \%d \%b \%q\\n);""\n" &
+ "> fo(Uns), fo(Uns), fo(Uns), fo(Uns)\n" &
+ "> );\n"
+ );
+
+fprint(RESULT, L, "Format specifiers: %r %d %b %q\n",
+ fo(Uns), fo(Uns), fo(Uns), fo(Uns)
+ );
+
+fprint(RESULT, L,
+ "\n-- Format string can be shortened by using the iteration specifier\n" &
+ "> fprint(RESULT, L, ""Iteration specifier: \%4{\%r }\\n);""\n" &
+ "> fo(Uns), fo(SigPos), fo(SigNeg), fo(Std)\n" &
+ "> );\n"
+ );
+
+fprint(RESULT, L, "Iteration specifier: %4{%r }\n",
+ fo(Uns), fo(SigPos), fo(SigNeg), fo(Std)
+ );
+
+
+fprint(RESULT, L,
+ "\n------------------------------------\n" &
+ "-- Support for bit-oriented types --\n" &
+ "------------------------------------\n"
+ );
+
+fprint (RESULT, L, "\n-- Reasonable format\n" &
+ "> fprint(RESULT, L, ""Reasonable format: \%9{\%r }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Reasonable format: %9{%r }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint (RESULT, L, "\n-- Decimal format\n" &
+ "> fprint(RESULT, L, ""Decimal format: \%7{\%d }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Decimal format: %9{%d }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint (RESULT, L, "\n-- Bit format\n" &
+ "> fprint(RESULT, L, ""Bit format: \%7{\%b }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Bit format: %9{%b }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint(RESULT, L,
+ "\n\n" &
+ "-- Alignment\n-- Template of the call: ( stands for the format specifier)\n"
+ );
+
+
+fprint(RESULT, L, "\n" &
+ "> fprint(RESULT, L, ""Bitvectors with : \%4{|}\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg)\n" &
+
+ "> );\n"
+ );
+
+fprint(RESULT, L,
+ "\n" &
+ "-- Results of the call with various format specifiers\n\n"
+ );
+
+fprint(RESULT, L, "Bitvectors with \%1r: %4{%1r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%2r: %4{%2r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%3r: %4{%3r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%4r: %4{%4r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%5r: %4{%5r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%6r: %4{%6r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%7r: %4{%7r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%8r: %4{%8r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%9r: %4{%9r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%-1r: %4{%-1r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-2r: %4{%-2r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-3r: %4{%-3r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-4r: %4{%-4r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-5r: %4{%-5r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-6r: %4{%-6r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-7r: %4{%-7r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-8r: %4{%-8r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-9r: %4{%-9r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%1d: %4{%1d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%2d: %4{%2d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%3d: %4{%3d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%4d: %4{%4d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%5d: %4{%5d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%6d: %4{%6d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%7d: %4{%7d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%8d: %4{%8d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%9d: %4{%9d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%-1d: %4{%-1d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-2d: %4{%-2d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-3d: %4{%-3d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-4d: %4{%-4d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-5d: %4{%-5d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-6d: %4{%-6d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-7d: %4{%-7d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-8d: %4{%-8d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-9d: %4{%-9d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+
+
+
+fprint(RESULT, L,
+ "\n-------------------------------\n" &
+ "-- Support for integer types --\n" &
+ "-------------------------------\n"
+ );
+
+fprint(RESULT, L,
+ "\n\n" &
+ "-- Template of the call: ( stands for the format specifier)\n"
+ );
+
+
+fprint(RESULT, L, "\n" &
+ "> fprint(RESULT, L, ""Integers with : \%4{|}\\n"",\n" &
+ "> fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)\n" &
+
+ "> );\n"
+ );
+
+fprint(RESULT, L,
+ "\n" &
+ "-- Results of the call with various format specifiers\n\n"
+ );
+
+
+fprint(RESULT, L, "Integers with \%5d: %4{%5d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%6d: %4{%6d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%7d: %4{%7d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%8d: %4{%8d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%9d: %4{%9d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%10d: %4{%10d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%-5d: %4{%-5d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-6d: %4{%-6d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-7d: %4{%-7d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-8d: %4{%-8d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-9d: %4{%-9d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-10d: %4{%-10d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%5r: %4{%5r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%6r: %4{%6r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%7r: %4{%7r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%8r: %4{%8r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%9r: %4{%9r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%10r: %4{%10r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%-5r: %4{%-5r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-6r: %4{%-6r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-7r: %4{%-7r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-8r: %4{%-8r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-9r: %4{%-9r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-10r: %4{%-10r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+
+
+fprint(RESULT, L,
+ "\n----------------------\n" &
+ "-- Support for time --\n" &
+ "----------------------\n"
+ );
+
+fprint (RESULT, L, "-- For portability reasons, time is converted \n" &
+ "-- into an integer value (of nanoseconds)\n"
+ );
+fprint (RESULT, L, "> wait for 648 ns\n");
+fprint (RESULT, L, "> fprint (RESULT, L, ""The time is now \%d ns\\n"", fo(now));\n");
+
+wait for 648 ns;
+
+fprint (RESULT, L, "The time is now %d ns\n", fo(now));
+
+
+fprint(RESULT, L,
+ "\n----------------------------------------\n" &
+ "-- Erroneous calls and error messages --\n" &
+ "----------------------------------------\n"
+ );
+
+fprint(RESULT, L, "\n-- Less arguments than formats specifiers\n" &
+ "> fprint(RESULT, L, ""\%d \%d \%d \%d \\n"", fo(Uns), fo(Std));\n"
+ );
+
+fprint(RESULT, L, "%d %d %d %d \n", fo(Uns), fo(Std));
+
+fprint(RESULT, L, "\n");
+
+fprint(RESULT, L, "-- Unsupported format specifier\n" &
+ "> fprint(RESULT, L, ""\%r \%v \%r \%r\\n"", " &
+ "fo(Uns), fo(Std), fo(Uns), fo(Std));\n"
+ );
+
+fprint(RESULT, L, "%r %v %r %r\n", fo(Uns), fo(Std), fo(Uns), fo(Std));
+
+fprint(RESULT, L, "\n");
+
+fprint(RESULT, L,
+ "\n----------------------------------------\n" &
+ "-- Things you wouldn't expect to work --\n" &
+ "----------------------------------------\n"
+ );
+
+fprint(RESULT, L, "\n-- Nested iteration\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%3{<<\%3{_END_}>>}\\n"");\n");
+fprint(RESULT, L, "%3{<<%3{_END_}>>}\n");
+
+wait;
+
+end process USAGE;
+
+end TB;
diff --git a/lib/PCK_FIO-2002.7/CHANGES b/lib/PCK_FIO-2002.7/CHANGES
new file mode 100644
index 0000000..b755a56
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/CHANGES
@@ -0,0 +1,86 @@
+---- $Id: CHANGES,v 1.1 2008-08-23 08:20:28 Jens Exp $
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 2001 Easics NV
+----
+---- This library is free software; you can redistribute it and/or
+---- modify it under the terms of the GNU Lesser General Public
+---- License as published by the Free Software Foundation; either
+---- version 2.1 of the License, or (at your option) any later version.
+----
+---- This library is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+---- Lesser General Public License for more details.
+----
+---- You should have received a copy of the GNU Lesser General Public
+---- License along with this library; if not, write to the Free Software
+---- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- http://www.easics.com
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+
+Changes from version 1.16 to version 2002.07
+============================================
+
+PCK_FIO is now distributed under the GNU Lesser General Public Licencse
+instead of the ordinary GPL, to better reflect intended usage.
+
+Cosmetic changes in source code to correct some typos in the testbench output.
+A new testbench is also supplied.
+
+The package now uses IEEE.numeric_std as default.
+
+URL http://www.easics.com has been made part of address.
+
+Changed syntax in the PCK_FIO package and its testbench to support VHDL-1993.
+Because of backwards-incompatibility, it has been necessary to supply
+different sets of files for 1987 and 1993.
+
+Split the packages into a separate file for the header and a
+separate file for the body (in compliance with Easics' guidelines).
+
+These changes resulted in the files:
+
+Files for VHDL-1993:
+--------------------
+ PCK_FIO_1993.vhd : the source code of the header file for the package
+ PCK_FIO_1993_BODY.vhd: the source code of the body of the package
+ TB_PCK_FIO_1993.vhd: the testbench for the package
+
+Files for VHDL-1987:
+--------------------
+ PCK_FIO_1987.vhd: the source code of the header file for the package
+ PCK_FIO_1987_BODY.vhd: the source code of the body of the package
+ TB_PCK_FIO_1987.vhd: the testbench for the package
+
+Updated README and PCK_FIO.html to support these changes.
+
+Adapted package files to support NUL termination of strings.
+fo(Arg: string) now prints the string until the first NUL.
+Several examples of its use are demonstrated in the supplied testbenches.
+
+Made cosmetic changes to code to improve readability.
+
+Acknowledgment
+--------------
+These changes have been implemented by Peter Geens.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/PCK_FIO-2002.7/PCK_FIO.html b/lib/PCK_FIO-2002.7/PCK_FIO.html
new file mode 100644
index 0000000..6b5fc72
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/PCK_FIO.html
@@ -0,0 +1,339 @@
+
+
+
+
+
+ VHDL package for formatted file output
+
+
+
+
+
+
+Name
+PCK_FIO - VHDL package for formatted file output
+
+
+
+Contents
+Usage
+
The file output function 'fo'
+
Format specifiers
+
Special characters
+
Things to watch out for
+
Methodology notes
+
Parametrization
+
Test bench
+
Known limitations and problems
+
Author
+
+
+
+Usage
+PCK_FIO is a VHDL package that defines fprint, a function
+for formatted file output.
+After installing the package you can call fprint as follows:
+
fprint(F, L, Format, fo(Expr_1), fo(Expr_2), ... fo(Expr_n));
+where F is the filehandle and L is the line variable.
+The argument Format is the format string, which consists of ``normal''
+substrings which are copied verbatim, and format specifiers, starting with
+'%'.
+A typical format string looks as follows:
+
"Arg1 = %6r, Arg2 = %10d, Arg3 = %-5r\n"
+The remaining arguments are the expressions whose results you want to write
+to the file, embedded in fo function calls. There can be 0 to
+32 of such arguments. The expressions can be of any type for which an fo
+function exists. String expressions can also be called directly.
+
+
+
+The file output function 'fo'
+The fo (file output) functions do the trick. They
+return a tagged string representation that is meaningful to format specifiers.
+Here are some examples:
+ fo (signed'("1100")) returns "S:1100"
+ fo (unsigned'("1100")) returns "U:1100"
+ fo (TRUE) returns "L:T"
+ fo (127) returns "I:127"
+The internal behavior of fo is irrelevant to the typical user.
+
+The fo function is currently overloaded as follows:
+
+ function fo (Arg: unsigned) return string;
+ function fo (Arg: signed) return string;
+ function fo (Arg: std_logic_vector) return string;
+ function fo (Arg: std_ulogic_vector) return string;
+ function fo (Arg: bit_vector) return string;
+ function fo (Arg: integer) return string;
+ function fo (Arg: std_ulogic) return string;
+ function fo (Arg: bit) return string;
+ function fo (Arg: boolean) return string;
+ function fo (Arg: character) return string;
+ function fo (Arg: string) return string;
+ function fo (Arg: time) return string;
+
+
To support null-terminated strings, the function fo(Arg:
+string) processes Arg up to the first NUL character,
+if any. If you want the whole string to be outputted you can just enter
+the string as a direct argument in fprint. See also the
+examples in the testbench.
+
+
+
+
+Format specifiers
+The general format of a format specifier is:
+ %[-][n]c
+The optional - sign specifies left justified output; default is
+right justified.
+The optional number n specifies a field-width. If it is not specified,
+fprint
+does something reasonable.
+
c is the conversion specifier. Currently the following conversion
+specifiers are supported:
+
+-
+r
+
+-
+reasonable output format (inspired by Synopsys VSS)
+
+Prints the ``most reasonable'' representation e.g. hex for
+unsigned, signed and other bit-like vectors (not preferred for integers)
+
+-
+b
+
+-
+bit-oriented output
+
+-
+d
+
+-
+decimal output
+
+-
+s
+
+-
+string output (e.g. in combination with 'IMAGE for enum types)
+
+-
+q
+
+-
+``qualified'' string output (shows internal representation from fo)
+
+-
+{}
+
+-
+Iteration operator, used as follows:
+
+-
+%n{<format-string>}
+
+
In this case, n is the iteration count and is mandatory. Iteration
+can be nested.
+
+
+
+Special characters
+To print a double quote, use '""' in the format string (VHDL
+convention). To print the special characters, '\', and '%',
+escape them with '\'. To prevent '{' and '}'
+from being interpreted as opening and closing brackets in iteration strings,
+escape them with '\'.
+A newline is specified in the format string by '\n'.
+
+
+
+Things to notice
+The fprint function expands into VHDL write and writeline
+commands. As in plain VHDL, nothing will be written to the output file
+until a writeline is given. Therefore, don't forget to include
+'\n'
+commands in the format string, or it ``will not work''.
+The preferred format specifier for integers is, naturally, %d.
+This calls the VHDL write for integers. If you specify a field
+width that is too small, the field will automatically be expanded. If you
+use %r for integers, the field is not expanded automatically, which
+means that some digits are simply thrown away. This may sometimes be useful
+but it is also dangerous. Look at the test bench output for differences
+between %d and %r output.
+
When using the %d format specifier, the VHDL constraints for
+the allowed integer range apply.
+
In VHDL, signed/unsigned types have been standardized only relatively
+recently, in the package IEEE.numeric_std. The lack of a standard
+has caused (and is causing) portability issues. The most popular non-standard
+package that defines signed/unsigned is IEEE.std_logic_arith from
+Synopsys. PCK_FIO works with both packages, but refers to the standard
+package IEEE.numeric_std by default. To use IEEE.std_logic_arith
+instead, replace the reference to IEEE.numeric_std in the source
+code. This needs to be done consistently in a design database (e.g.
+in the PCK_FIO test bench as well).
+
+
+
+Methodology notes
+The obvious application for fprint is in test benches, to produce
+output files that trace the simulation behavior.
+Another interesting application for fprint is to produce info,
+warning and error messages in your models. As it can take arguments, fprint
+is much better suited for this task than VHDL's assert or report
+statements. Actually fprint produces its own (few) warning messages.
+
An advanced usage is the generation of test vectors in a specific format.
+Instead of using the fo functions, you can write your own set
+of functions that return the symbols of a specific test format in a way
+that is understandable to the fprint format specifiers. As an
+example, when a high output value should be represented using the symbol
+'H' it suffices to write a conversion function that returns "B:H" and call
+it in combination with the %b format specifier.
+
+
+
+Parametrization
+Prefix and postfix strings for bit-oriented and hex-oriented output are
+parameterizable in the packages to accommodate different output styles.
+The settings in the distribution are such that hex output is indicated
+by the prefix '0x', while bit output prefix and postfix are empty
+strings.
+You can adapt the output style by modifying the following constants
+in the package header:
+
-- prefix string for hex output
+
-- VHDL style: "X"""
+
-- Verilog style: "h'"
+
-- C style: "0x"
+
constant FIO_h_PRE: string := "0x";
+
-- postfix string for hex output
+
-- VHDL style: """"
+
constant FIO_h_POST: string := "";
+
-- prefix string for bit vector output
+
-- VHDL style: "B"""
+
-- Verilog style: "b'"
+
constant FIO_bv_PRE: string := "";
+
-- postfix string for bit vector output
+
-- VHDL style: """"
+
constant FIO_bv_POST: string := "";
+
-- prefix string for bit output
+
-- VHDL style: "'"
+
-- Verilog style: "b'"
+
constant FIO_b_PRE: string := "";
+
-- postfix string for bit output
+
-- VHDL style: "'"
+
constant FIO_b_POST: string := "";
+
+
+
+Test bench
+Included in the distribution are the files TB_PCK_FIO_1987.vhd and
+TB_PCK_FIO_1993 with a test bench,depending on the standard you're
+running, for the PCK_FIO package. The file PCK_FIO.out.gold contains
+the expected output. If you run the test bench it should produce the file
+PCK_FIO.out
+that should be identical to PCK_FIO.out.gold. The source files
+should be analyzed in a VHDL library EASICS_PACKAGES.
+A good way to understand fprint is to inspect the test bench
+and what it produces.
+
+
+
+Known limitations and problems
+This VHDL package is an implementation of a flexible concept. It is likely
+to be extended and modified in the future. Backward compatibility is not
+guaranteed. Therefore, it is not recommended to give this package the status
+of a company wide standard package (or even worse, a VHDL standard package).
+Rather, it should be linked with a particular project (and it can be regarded
+as a standard package within that project).
+PCK_FIO is available in either standard VHDL Std1076-1987 or standard
+VHDL Std1076-1993. Nevertheless, some simulators/versions have problems
+with the package. The following is an overview of currently known issues:
+
+
+PCK_FIO_1987 and various simulators/versions
+
+
+| Simulator |
+
+PCK_FIO_1987 |
+
+
+
+| Synopsys VSS 3.5 and earlier |
+
+Incorrect (all zero) output in compiled mode |
+
+
+
+| Synopsys VSS 97.01 |
+
+OK |
+
+
+
+| Synopsys VSS/Scirocco 2000.02 |
+
+Incorrect output in compiled mode, interpreted mode works |
+
+
+
+| Mentor quickhdl |
+
+OK |
+
+
+
+| Modeltech modelsim |
+
+OK |
+
+
+
+| Cadence Leapfrog |
+
+Should work with 4.4.1
+ Mysterious problems have been reported - please run the test bench
+and report problems |
+
+
+
+
+
+PCK_FIO_1993 and various simulators/versions
+
+
+| Simulator |
+
+PCK_FIO_1993 |
+
+
+
+| Synopsys VSS/Scirocco 2000.02 |
+
+Compile errors due to improper handling of files by Synopsys |
+
+
+
+| Synopsys VSS/Scirocco 2000.06 |
+
+works fine |
+
+
+
+| Modeltech modelsim 5.4c and higher |
+
+OK |
+
+
+
+Although the package name suggests file IO, it only does file output.
+
+
+
+Author
+Jan Decaluwe
+
+
+
+
diff --git a/lib/PCK_FIO-2002.7/PCK_FIO.out.gold b/lib/PCK_FIO-2002.7/PCK_FIO.out.gold
new file mode 100644
index 0000000..3fcfe4c
Binary files /dev/null and b/lib/PCK_FIO-2002.7/PCK_FIO.out.gold differ
diff --git a/lib/PCK_FIO-2002.7/PCK_FIO_1987.vhd b/lib/PCK_FIO-2002.7/PCK_FIO_1987.vhd
new file mode 100644
index 0000000..d4cf8e6
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/PCK_FIO_1987.vhd
@@ -0,0 +1,105 @@
+---- $Id: PCK_FIO_1987.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 2001 Easics NV
+----
+---- This library is free software; you can redistribute it and/or
+---- modify it under the terms of the GNU Lesser General Public
+---- License as published by the Free Software Foundation; either
+---- version 2.1 of the License, or (at your option) any later version.
+----
+---- This library is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+---- Lesser General Public License for more details.
+----
+---- You should have received a copy of the GNU Lesser General Public
+---- License along with this library; if not, write to the Free Software
+---- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- http://www.easics.com
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+use STD.TEXTIO.all;
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- signed/unsigned definition: use either std_logic_arith or numeric_std
+-- use IEEE.std_logic_arith.all; -- the Synopsys one
+use IEEE.numeric_std.all;
+
+package PCK_FIO is
+
+ -- prefix string for hex output
+ -- VHDL style: "X"""
+ -- Verilog style: "h'"
+ -- C style: "0x"
+ constant FIO_h_PRE: string := "0x";
+
+ -- postfix string for hex output
+ -- VHDL style: """"
+ constant FIO_h_POST: string := "";
+
+ -- prefix string for bit vector output
+ -- VHDL style: "B"""
+ -- Verilog style: "b'"
+ constant FIO_bv_PRE: string := "";
+
+ -- postfix string for bit vector output
+ -- VHDL style: """"
+ constant FIO_bv_POST: string := "";
+
+ -- prefix string for bit output
+ -- VHDL style: "'"
+ -- Verilog style: "b'"
+ constant FIO_b_PRE: string := "";
+
+ -- postfix string for bit output
+ -- VHDL style: "'"
+ constant FIO_b_POST: string := "";
+
+ -- digit width for the string representation of integers
+ constant FIO_d_WIDTH: integer := 10;
+
+ -- bit width for the string representation of integers
+ constant FIO_b_WIDTH: integer := 32;
+
+ -- definition of the NIL string (default value for fprint arguments)
+ -- fprint stops consuming arguments at the first NIL argument
+ constant FIO_NIL: string := "\";
+
+
+ procedure fprint
+ (F: out text;
+ L: inout line;
+ Format: in string;
+ A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 : in string := FIO_NIL;
+ A9 , A10, A11, A12, A13, A14, A15, A16: in string := FIO_NIL;
+ A17, A18, A19, A20, A21, A22, A23, A24: in string := FIO_NIL;
+ A25, A26, A27, A28, A29, A30, A31, A32: in string := FIO_NIL
+ );
+
+ function fo (Arg: unsigned) return string;
+ function fo (Arg: signed) return string;
+ function fo (Arg: std_logic_vector) return string;
+ function fo (Arg: std_ulogic_vector) return string;
+ function fo (Arg: bit_vector) return string;
+ function fo (Arg: integer) return string;
+ function fo (Arg: std_ulogic) return string;
+ function fo (Arg: bit) return string;
+ function fo (Arg: boolean) return string;
+ function fo (Arg: character) return string;
+ function fo (Arg: string) return string;
+ function fo (Arg: time) return string;
+
+ procedure FIO_FormatExpand (FMT: inout line;
+ Format: in string;
+ StartPointer: in positive);
+
+end PCK_FIO;
+
diff --git a/lib/PCK_FIO-2002.7/PCK_FIO_1987_BODY.vhd b/lib/PCK_FIO-2002.7/PCK_FIO_1987_BODY.vhd
new file mode 100644
index 0000000..44e42cf
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/PCK_FIO_1987_BODY.vhd
@@ -0,0 +1,821 @@
+---- $Id: PCK_FIO_1987_BODY.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 2001 Easics NV
+----
+---- This library is free software; you can redistribute it and/or
+---- modify it under the terms of the GNU Lesser General Public
+---- License as published by the Free Software Foundation; either
+---- version 2.1 of the License, or (at your option) any later version.
+----
+---- This library is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+---- Lesser General Public License for more details.
+----
+---- You should have received a copy of the GNU Lesser General Public
+---- License along with this library; if not, write to the Free Software
+---- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- http://www.easics.com
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+
+package body PCK_FIO is
+
+ --------------------------
+ -- FIO Warnings support --
+ --------------------------
+
+ procedure FIO_Warning_Fsbla (F: out text;
+ L: inout line;
+ Format: in string;
+ Pointer: in positive) is
+ begin
+ fprint (F, L, "\n** Warning: FIO_PrintLastValue: " &
+ "Format specifier beyond last argument\n");
+ fprint (F, L, "** in format string: ""%s""\n", Format);
+ fprint (F, L, "** ");
+ for i in 1 to Pointer-1 loop
+ fprint (F, L, "-");
+ end loop;
+ fprint (F, L, "^\n");
+ end FIO_Warning_Fsbla;
+
+ procedure FIO_Warning_Ufs (F: out text;
+ L: inout line;
+ Format: in string;
+ Pointer: in positive;
+ Char: in character) is
+ begin
+ fprint (F, L, "\n** Warning: FIO_PrintArg: " &
+ "Unexpected format specifier '%r'\n",
+ fo(Char));
+ fprint (F, L, "** in format string: ""%s""\n", Format) ;
+ fprint (F, L, "** ");
+ for i in 1 to Pointer-1 loop
+ fprint (F, L, "-");
+ end loop;
+ fprint (F, L, "^\n** Assuming 'q' to proceed: ");
+ end FIO_Warning_Ufs;
+
+
+ ----------------------------------
+ -- bit conversion support --
+ ----------------------------------
+
+ type T_bit_map is array(bit) of character;
+
+ constant C_BIT_MAP: T_bit_map
+ := ('0', '1');
+
+ ----------------------------------
+ -- std_logic conversion support --
+ ----------------------------------
+
+ type T_std_logic_map is array(std_ulogic) of character;
+
+ constant C_STD_LOGIC_MAP: T_std_logic_map
+ := ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-');
+
+ ------------------------------
+ -- Digit conversion support --
+ ------------------------------
+
+ -- types & constants
+
+ subtype S_digit_chars is character range '0' to '9';
+ subtype S_digits is integer range 0 to 9 ;
+
+ type T_digit_chars_map is array(S_digit_chars) of S_digits;
+
+ constant C_DIGIT_CHARS_MAP: T_digit_chars_map
+ := (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
+
+ type T_digits_map is array(S_digits) of S_digit_chars;
+
+ constant C_DIGITS_MAP: T_digits_map
+ := ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
+
+
+ --------------------------------
+ -- Decimal conversion support --
+ --------------------------------
+
+ -- unsigned to decimal
+
+ function U_To_d (Arg: string) return integer is
+ constant Argument: string(Arg'length downto 1) := Arg;
+ variable Result: integer := 0;
+ begin
+ for i in Argument'range loop
+ case Argument(i) is when '1' => Result := 2**(i-1) + Result;
+ when '0' => null;
+ when others => return(-1);
+ end case;
+ end loop;
+ return (Result);
+ end U_To_d;
+
+ -- signed to decimal
+
+ function S_To_d (Arg: string) return integer is
+ constant Argument: string(Arg'length downto 1) := Arg;
+ variable Result: integer := 0;
+ begin
+ case Argument(Argument'left) is
+ when '1' => Result := - 2**(Argument'left-1);
+ when '0' => Result := 0;
+ when others => return (integer'low);
+ end case;
+ for i in Argument'left-1 downto 1 loop
+ case Argument(i) is when '1' => Result := 2**(i-1) + Result;
+ when '0' => null;
+ when others => return(integer'low);
+ end case;
+ end loop;
+ return (Result);
+ end S_To_d;
+
+ -- string to decimal
+
+ function I_To_d (Arg: string(1 to FIO_d_WIDTH+1)) return integer is
+ constant Sign: character := Arg(1);
+ constant Value: string(Arg'length-1 downto 1) := Arg(2 to Arg'length);
+ variable Char: character;
+ variable Result: integer := 0;
+ begin
+ Result := 0;
+ for i in Value'range loop
+ Result := Result * 10;
+ Char := Value(i);
+ if (Char /= ' ') then
+ Result := Result + C_DIGIT_CHARS_MAP(Char);
+ end if;
+ end loop;
+ case Sign is when '-' => return(-Result);
+ when others => return(Result);
+ end case;
+ end I_To_d;
+
+ -- boolean (0,1) to decimal
+
+ function B_To_d (Arg: string(1 to 1)) return integer is
+ begin
+ case Arg is when "1" => return(1);
+ when "0" => return(0);
+ when others => return(-1);
+ end case;
+ end B_To_d;
+
+ -- boolean (T,F) to decimal
+
+ function L_To_d (Arg: string(1 to 1)) return integer is
+ begin
+ case Arg is when "T" => return(1);
+ when others => return(0);
+ end case;
+ end L_To_d;
+
+
+
+ ----------------------------
+ -- Hex conversion support --
+ ----------------------------
+
+ -- Constants & types
+
+ constant C_HEX_CHARS: string(1 to 17) := "0123456789ABCDEF?";
+
+ -- Function to return Hex index of a nibble
+
+ function U_To_h_Index(Arg: string(4 downto 1)) return integer is
+ variable Index: integer := 0;
+ begin
+ for i in Arg'range loop
+ case Arg(i) is when '1' => Index := 2**(i-1) + Index;
+ when '0' => null;
+ when others => return (17);
+ end case;
+ end loop;
+ return (Index+1);
+ end U_To_h_Index;
+
+ -- Hex conversion
+
+ function U_To_h (Arg: string) return string is
+ variable Result: string((Arg'length-1)/4 +1 downto 1);
+ variable ExtArg: string(Result'length*4 downto 1) := (others => '0');
+ begin
+ ExtArg(Arg'length downto 1) := Arg;
+ for i in Result'range loop
+ Result(i) := C_HEX_CHARS(U_To_h_Index( ExtArg(i*4 downto i*4 -3) ));
+ end loop;
+ return (FIO_h_PRE & Result & FIO_h_POST);
+ end U_To_h;
+
+
+
+ ----------------------------
+ -- Bit conversion support --
+ ----------------------------
+
+ function L_To_b (Arg: string(1 to 1)) return string is
+ variable Result: string(1 to 1);
+ begin
+ case Arg is when "T" => Result := "1";
+ when others => Result := "0";
+ end case;
+ return(FIO_b_PRE & Result & FIO_b_POST);
+ end L_To_b;
+
+
+ function I_To_b (Arg: string(1 to FIO_d_WIDTH+1);
+ Justified: side;
+ Width: integer) return string is
+
+ variable IntValue: integer := I_To_d(Arg);
+ variable BitValue: string(1 to FIO_b_WIDTH) := (others => ' ');
+ variable Sign: character := ' ';
+ constant Blanks: string(1 to FIO_b_WIDTH) := (others => ' ');
+ variable BitWidth: integer range 0 to FIO_b_WIDTH;
+ variable MsPos: integer range 1 to BitValue'length;
+ variable BitValueExtended: string(1 to 2*FIO_b_WIDTH);
+
+ begin
+
+ if (IntValue < 0) then
+ Sign := '-';
+ IntValue := -IntValue;
+ end if;
+
+ for i in BitValue'reverse_range loop
+ BitValue(i) := C_DIGITS_MAP(IntValue mod 2);
+ IntValue := IntValue / 2;
+ exit when (IntValue = 0);
+ end loop;
+
+ BitValueExtended := BitValue & Blanks;
+
+ if (Width = 0) or (Width > FIO_b_WIDTH+1) then
+ BitWidth := FIO_b_WIDTH;
+ else
+ BitWidth := Width-1;
+ end if;
+
+ if (Justified = RIGHT) then
+ return (FIO_bv_PRE &
+ Sign & BitValue(BitValue'length-BitWidth+1 to BitValue'length) &
+ FIO_bv_POST);
+ else
+ for i in BitValue'range loop
+ if BitValue(i) /= ' ' then
+ MSPos := i;
+ exit;
+ end if;
+ end loop;
+ return (FIO_bv_PRE &
+ Sign & BitValueExtended(MSPos to MSPos+BitWidth-1) &
+ FIO_bv_POST);
+ end if;
+
+ end I_To_b;
+
+
+ -----------------------------------
+ -- Reasonable conversion support --
+ -----------------------------------
+
+ function I_To_r (Arg: string(1 to FIO_d_WIDTH+1);
+ Justified: side;
+ Width: integer) return string is
+ constant Value: string(1 to FIO_d_WIDTH) := Arg(2 to FIO_d_WIDTH+1);
+ constant Sign: character := Arg(1);
+ constant Blanks: string(1 to FIO_d_WIDTH) := (others => ' ');
+ variable IntWidth: integer range 0 to FIO_d_WIDTH;
+ variable MsPos: integer range 1 to Value'length;
+ variable ValueExtended: string(1 to 2*FIO_d_WIDTH) := Value & Blanks;
+ begin
+ if (Width = 0) or (Width > FIO_d_WIDTH+1) then
+ IntWidth := FIO_d_WIDTH;
+ else
+ IntWidth := Width-1;
+ end if;
+ if (Justified = RIGHT) then
+ return (Sign & Value(Value'length-IntWidth+1 to Value'length));
+ else
+ for i in Value'range loop
+ if Value(i) /= ' ' then
+ MSPos := i;
+ exit;
+ end if;
+ end loop;
+ return (Sign & ValueExtended(MSPos to MSPos+IntWidth-1));
+ end if;
+ end I_To_r;
+
+
+ -------------------------------------------
+ -- Reasonable output conversion function --
+ -------------------------------------------
+
+ function ReasonableOutput (Arg: string;
+ Justified: side;
+ Width: integer) return string is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:" | "S:" | "V:" =>
+ return U_To_h(Value);
+ when "I:" =>
+ return I_To_r(Value, Justified, Width);
+ when "B:" | "L:" | "C:" =>
+ return Value;
+ when others =>
+ return Argument;
+ end case;
+
+ end ReasonableOutput;
+
+
+ ------------------------------------
+ -- Bit output conversion function --
+ ------------------------------------
+
+ function BitOutput (Arg: string;
+ Justified: side;
+ Width: integer) return string is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:" | "S:" | "V:" =>
+ return (FIO_bv_PRE & Value & FIO_bv_POST);
+ when "B:" =>
+ -- Value(1 to 1) instead of Value for LeapFrog
+ return (FIO_b_PRE & Value(1 to 1) & FIO_b_POST);
+ when "I:" =>
+ return I_To_b(Value, Justified, Width);
+ when "L:" =>
+ -- Value(1 to 1) instead of Value for LeapFrog
+ return L_To_b(Value(1 to 1));
+ when others =>
+ return Argument;
+ end case;
+
+ end BitOutput;
+
+
+ -------------------------------------------
+ -- Decimal output conversion function --
+ -------------------------------------------
+
+ function DecimalOutput (Arg: string) return integer is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:"| "V:" =>
+ return U_To_d(Value);
+ when "S:" =>
+ return S_To_d(Value);
+ when "I:" =>
+ return I_To_d(Value);
+ when "B:" =>
+ return B_To_d(Value);
+ when "L:" =>
+ return L_To_d(Value);
+ when others =>
+ return integer'low;
+ end case;
+
+ end DecimalOutput;
+
+
+ ----------------------------
+ -- Atomic print functions --
+ ----------------------------
+
+ -- test for end of format string
+
+ function FIO_EOS (Format: in string;
+ Pointer: in integer)
+ return boolean is
+ begin
+ return (Pointer > Format'length);
+ end FIO_EOS;
+
+
+ -- Atomic value print function
+
+ procedure FIO_PrintValue (F: out text;
+ L: inout line;
+ Format: in string;
+ Pointer: inout integer;
+ Last: in boolean := FALSE) is
+ variable Char: character;
+ begin
+ while (not FIO_EOS(Format, Pointer)) loop
+ Char := Format(Pointer);
+ case Char is
+ when '\' =>
+ Pointer := Pointer + 1;
+ exit when (FIO_EOS(Format, Pointer));
+ Char := Format(Pointer);
+ case Char is when 'n' => writeline(F, L);
+ when others => write(L, Char);
+ end case;
+ when '%' =>
+ if Last then
+ FIO_Warning_Fsbla(F, L, Format, Pointer);
+ end if;
+ Pointer := Pointer + 1;
+ exit;
+ when others =>
+ write(L, char);
+ end case;
+ Pointer := Pointer + 1;
+ end loop;
+ end FIO_PrintValue;
+
+
+ ---- Atomic argument print function
+
+ procedure FIO_PrintArg (F: out text;
+ L: inout line;
+ Format: in string;
+ Pointer: inout integer;
+ Arg: in string) is
+ variable Char: character;
+ variable Justified: side;
+ variable Width: integer;
+ begin
+
+ FIO_PrintValue(F, L, Format, Pointer);
+
+ Justified := RIGHT;
+ Width := 0;
+ while (not FIO_EOS(Format, Pointer)) loop
+ Char := Format(Pointer);
+ case Char is
+ when '-' =>
+ Justified := LEFT;
+ Pointer := Pointer + 1;
+ when '0' to '9' =>
+ Width := Width*10 + C_DIGIT_CHARS_MAP(Char);
+ Pointer := Pointer + 1;
+ when 'r' =>
+ write(L, ReasonableOutput(Arg, Justified, Width), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'b' =>
+ write(L, BitOutput(Arg, Justified, Width), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'd' =>
+ write(L, DecimalOutput(Arg), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'q' | 's' =>
+ write(L, Arg, Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when others =>
+ FIO_Warning_Ufs(F, L, Format, Pointer, Char);
+ write(L, Arg, Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ end case;
+ end loop;
+ end FIO_PrintArg;
+
+
+ -----------------------------------------------------
+ -- The format string iteration expansion procedure --
+ -----------------------------------------------------
+
+ procedure FIO_FormatExpand (FMT: inout line;
+ Format: in string;
+ StartPointer: in positive) is
+
+ variable Pointer: positive := StartPointer;
+ variable TokenStart: positive;
+ variable IterStringStart: positive;
+ variable IterStringEnd: positive;
+ variable IterCount: natural;
+ variable OpenBrackets: natural;
+ variable L: line;
+
+ begin
+
+ FORMAT_SEARCH: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+
+ -- look for format specifier
+ when '%' =>
+
+ -- initialize iteration token search
+ TokenStart := Pointer;
+ IterCount := 0;
+ Pointer := Pointer + 1;
+
+ -- start iteration token search
+ TOKEN_READ: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+
+ -- read iteration counter
+ when '0' to '9' =>
+ IterCount := IterCount*10 + C_DIGIT_CHARS_MAP(Format(Pointer));
+ Pointer := Pointer + 1;
+
+ -- expect open bracket
+ when '{' =>
+
+ -- initialize iteration string read
+ OpenBrackets := 1;
+ IterStringStart := Pointer + 1;
+ Pointer := Pointer + 1;
+ -- quit prematurely when iteration count is 0
+ next FORMAT_SEARCH when (IterCount = 0);
+
+ -- start iteration string read
+ ITER_STRING_READ: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+ -- keep track of open brackets
+ when '{' =>
+ OpenBrackets := OpenBrackets + 1;
+ Pointer := Pointer + 1;
+ -- when closing bracket is found, process iteration string
+ when '}' =>
+ OpenBrackets := OpenBrackets - 1;
+ if (OpenBrackets = 0) then
+ IterStringEnd := Pointer-1;
+ if (TokenStart /= 1) then
+ write(L, Format(1 to TokenStart-1));
+ end if;
+ for i in 1 to IterCount loop
+ write(L, Format(IterStringStart to IterStringEnd));
+ end loop;
+ if (IterStringEnd /= Format'length) then
+ write(L, Format(IterStringEnd+2 to Format'length));
+ end if;
+ -- call expansion procedure recursively on expanded format
+ FIO_FormatExpand(FMT, L.all, TokenStart);
+ deallocate(L);
+ return;
+ end if;
+ Pointer := Pointer + 1;
+ -- skip escaped characters
+ when '\' =>
+ Pointer := Pointer + 2;
+ -- read iteration string
+ when others =>
+ Pointer := Pointer + 1;
+
+ end case;
+
+ end loop ITER_STRING_READ;
+
+ -- stop iteration token search when no opening bracket found
+ when others =>
+ Pointer := Pointer + 1;
+ next FORMAT_SEARCH;
+
+ end case;
+
+ end loop TOKEN_READ;
+
+ -- skip escaped characters
+ when '\' =>
+ Pointer := Pointer + 2;
+
+ -- read other characters
+ when others =>
+ Pointer := Pointer + 1;
+
+ end case;
+
+ end loop FORMAT_SEARCH;
+
+ write(FMT, Format);
+ deallocate(L);
+
+ end FIO_FormatExpand;
+
+
+
+ --------------------------
+ -- The fprint procedure --
+ --------------------------
+
+ procedure fprint
+ (F: out text;
+ L: inout line;
+ Format: in string;
+ A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 : in string := FIO_NIL;
+ A9 , A10, A11, A12, A13, A14, A15, A16: in string := FIO_NIL;
+ A17, A18, A19, A20, A21, A22, A23, A24: in string := FIO_NIL;
+ A25, A26, A27, A28, A29, A30, A31, A32: in string := FIO_NIL
+ ) is
+
+ variable Pointer: integer;
+ variable FMT: line;
+
+ begin
+
+ Pointer := 1;
+
+ FIO_FormatExpand (FMT, Format, Format'low);
+
+ if (A1 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A1 );
+ if (A2 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A2 );
+ if (A3 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A3 );
+ if (A4 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A4 );
+ if (A5 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A5 );
+ if (A6 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A6 );
+ if (A7 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A7 );
+ if (A8 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A8 );
+ if (A9 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A9 );
+ if (A10 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A10);
+ if (A11 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A11);
+ if (A12 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A12);
+ if (A13 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A13);
+ if (A14 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A14);
+ if (A15 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A15);
+ if (A16 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A16);
+ if (A17 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A17);
+ if (A18 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A18);
+ if (A19 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A19);
+ if (A20 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A20);
+ if (A21 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A21);
+ if (A22 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A22);
+ if (A23 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A23);
+ if (A24 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A24);
+ if (A25 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A25);
+ if (A26 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A26);
+ if (A27 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A27);
+ if (A28 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A28);
+ if (A29 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A29);
+ if (A30 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A30);
+ if (A31 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A31);
+ if (A32 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A32);
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+
+ FIO_PrintValue(F, L, FMT.all, Pointer, Last => TRUE);
+
+ deallocate(FMT);
+
+ end fprint;
+
+
+ -------------------------------------------
+ -- Formatted output conversion functions --
+ -------------------------------------------
+
+ function fo (Arg: unsigned) return string is
+ constant Argument: unsigned(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("U:" & Result);
+ end fo;
+
+ function fo (Arg: signed) return string is
+ constant Argument: signed(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("S:" & Result);
+ end fo;
+
+ function fo (Arg: std_logic_vector) return string is
+ constant Argument: std_logic_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: std_ulogic_vector) return string is
+ constant Argument: std_ulogic_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: bit_vector) return string is
+ constant Argument: bit_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_BIT_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: integer) return string is
+ variable Argument: integer := Arg;
+ variable Result: string(1 to FIO_d_WIDTH) := (others => ' ');
+ variable Sign: character := ' ';
+ begin
+ if (Argument < 0) and (Argument /= integer'low) then
+ Sign := '-';
+ Argument := -Argument;
+ end if;
+ for i in Result'reverse_range loop
+ Result(i) := C_DIGITS_MAP(Argument mod 10);
+ Argument := Argument / 10;
+ exit when (Argument = 0);
+ end loop;
+ return ("I:" & Sign & Result);
+ end fo;
+
+ function fo (Arg: std_ulogic) return string is
+ begin
+ return ("B:" & C_STD_LOGIC_MAP(Arg));
+ end fo;
+
+ function fo (Arg: bit) return string is
+ begin
+ return ("B:" & C_BIT_MAP(Arg));
+ end fo;
+
+ function fo (Arg: boolean) return string is
+ begin
+ if (ARG = TRUE) then
+ return ("L:T");
+ else
+ return ("L:F");
+ end if;
+ end fo;
+
+ function fo (Arg: character) return string is
+ begin
+ return ("C:" & Arg);
+ end fo;
+
+ -- auxilary function fgets(Arg: string)
+ -- gives index until first NUL
+ -- reads string from 1 to Arg'length
+ function fgets (Arg: string) return integer is
+ variable index: integer := Arg'length;
+ begin
+ for i in 1 to Arg'length loop
+ if Arg(i) = NUL then
+ index := i - 1;
+ exit;
+ else
+ null;
+ end if;
+ end loop;
+ return index;
+ end fgets;
+
+ function fo (Arg: string) return string is
+ begin
+ return Arg(1 to fgets(Arg));
+ end fo;
+
+ function fo (Arg: time) return string is
+ begin
+ return fo (integer (Arg / 1 ns));
+ end fo;
+
+end PCK_FIO;
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd b/lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd
new file mode 100644
index 0000000..9df893e
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd
@@ -0,0 +1,108 @@
+---- $Id: PCK_FIO_1993.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 2001 Easics NV
+----
+---- This library is free software; you can redistribute it and/or
+---- modify it under the terms of the GNU Lesser General Public
+---- License as published by the Free Software Foundation; either
+---- version 2.1 of the License, or (at your option) any later version.
+----
+---- This library is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+---- Lesser General Public License for more details.
+----
+---- You should have received a copy of the GNU Lesser General Public
+---- License along with this library; if not, write to the Free Software
+---- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- http://www.easics.com
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+
+use STD.TEXTIO.all;
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- signed/unsigned definition: use either std_logic_arith or numeric_std
+-- use IEEE.std_logic_arith.all; -- the Synopsys one
+use IEEE.numeric_std.all;
+
+package PCK_FIO is
+
+
+ -- prefix string for hex output
+ -- VHDL style: "X"""
+ -- Verilog style: "h'"
+ -- C style: "0x"
+ constant FIO_h_PRE: string := "0x";
+
+ -- postfix string for hex output
+ -- VHDL style: """"
+ constant FIO_h_POST: string := "";
+
+ -- prefix string for bit vector output
+ -- VHDL style: "B"""
+ -- Verilog style: "b'"
+ constant FIO_bv_PRE: string := "";
+
+ -- postfix string for bit vector output
+ -- VHDL style: """"
+ constant FIO_bv_POST: string := "";
+
+ -- prefix string for bit output
+ -- VHDL style: "'"
+ -- Verilog style: "b'"
+ constant FIO_b_PRE: string := "";
+
+ -- postfix string for bit output
+ -- VHDL style: "'"
+ constant FIO_b_POST: string := "";
+
+ -- digit width for the string representation of integers
+ constant FIO_d_WIDTH: integer := 10;
+
+ -- bit width for the string representation of integers
+ constant FIO_b_WIDTH: integer := 32;
+
+ -- definition of the NIL string (default value for fprint arguments)
+ -- fprint stops consuming arguments at the first NIL argument
+ constant FIO_NIL: string := "\";
+
+ procedure fprint
+ (file F: text;
+ L: inout line;
+ Format: in string;
+ A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 : in string := FIO_NIL;
+ A9 , A10, A11, A12, A13, A14, A15, A16: in string := FIO_NIL;
+ A17, A18, A19, A20, A21, A22, A23, A24: in string := FIO_NIL;
+ A25, A26, A27, A28, A29, A30, A31, A32: in string := FIO_NIL
+ );
+
+ function fo (Arg: unsigned) return string;
+ function fo (Arg: signed) return string;
+ function fo (Arg: std_logic_vector) return string;
+ function fo (Arg: std_ulogic_vector) return string;
+ function fo (Arg: bit_vector) return string;
+ function fo (Arg: integer) return string;
+ function fo (Arg: std_ulogic) return string;
+ function fo (Arg: bit) return string;
+ function fo (Arg: boolean) return string;
+ function fo (Arg: character) return string;
+ function fo (Arg: string) return string;
+ function fo (Arg: time) return string;
+
+ procedure FIO_FormatExpand (FMT: inout line;
+ Format: in string;
+ StartPointer: in positive);
+
+end PCK_FIO;
+
+
+
diff --git a/lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd b/lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd
new file mode 100644
index 0000000..3d123f0
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd
@@ -0,0 +1,814 @@
+---- $Id: PCK_FIO_1993_BODY.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 2001 Easics NV
+----
+---- This library is free software; you can redistribute it and/or
+---- modify it under the terms of the GNU Lesser General Public
+---- License as published by the Free Software Foundation; either
+---- version 2.1 of the License, or (at your option) any later version.
+----
+---- This library is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+---- Lesser General Public License for more details.
+----
+---- You should have received a copy of the GNU Lesser General Public
+---- License along with this library; if not, write to the Free Software
+---- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- http://www.easics.com
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+
+ package body PCK_FIO is
+
+ --------------------------
+ -- FIO Warnings support --
+ --------------------------
+
+ procedure FIO_Warning_Fsbla (file F: text;
+ L: inout line;
+ Format: in string;
+ Pointer: in positive) is
+ begin
+ fprint (F, L, "\n** Warning: FIO_PrintLastValue: " &
+ "Format specifier beyond last argument\n");
+ fprint (F, L, "** in format string: ""%s""\n", Format);
+ fprint (F, L, "** ");
+ for i in 1 to Pointer-1 loop
+ fprint (F, L, "-");
+ end loop;
+ fprint (F, L, "^\n");
+ end FIO_Warning_Fsbla;
+
+ procedure FIO_Warning_Ufs (file F: text;
+ L: inout line;
+ Format: in string;
+ Pointer: in positive;
+ Char: in character) is
+ begin
+ fprint (F, L, "\n** Warning: FIO_PrintArg: " &
+ "Unexpected format specifier '%r'\n",
+ fo(Char));
+ fprint (F, L, "** in format string: ""%s""\n", Format) ;
+ fprint (F, L, "** ");
+ for i in 1 to Pointer-1 loop
+ fprint (F, L, "-");
+ end loop;
+ fprint (F, L, "^\n** Assuming 'q' to proceed: ");
+ end FIO_Warning_Ufs;
+
+
+ ----------------------------------
+ -- bit conversion support --
+ ----------------------------------
+
+ type T_bit_map is array(bit) of character;
+
+ constant C_BIT_MAP: T_bit_map
+ := ('0', '1');
+
+ ----------------------------------
+ -- std_logic conversion support --
+ ----------------------------------
+
+ type T_std_logic_map is array(std_ulogic) of character;
+
+ constant C_STD_LOGIC_MAP: T_std_logic_map
+ := ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-');
+
+ ------------------------------
+ -- Digit conversion support --
+ ------------------------------
+
+ -- types & constants
+
+ subtype S_digit_chars is character range '0' to '9';
+ subtype S_digits is integer range 0 to 9 ;
+
+ type T_digit_chars_map is array(S_digit_chars) of S_digits;
+
+ constant C_DIGIT_CHARS_MAP: T_digit_chars_map
+ := (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
+
+ type T_digits_map is array(S_digits) of S_digit_chars;
+
+ constant C_DIGITS_MAP: T_digits_map
+ := ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
+
+
+ --------------------------------
+ -- Decimal conversion support --
+ --------------------------------
+
+ -- unsigned to decimal
+
+ function U_To_d (Arg: string) return integer is
+ constant Argument: string(Arg'length downto 1) := Arg;
+ variable Result: integer := 0;
+ begin
+ for i in Argument'range loop
+ case Argument(i) is when '1' => Result := 2**(i-1) + Result;
+ when '0' => null;
+ when others => return(-1);
+ end case;
+ end loop;
+ return (Result);
+ end U_To_d;
+
+ -- signed to decimal
+
+ function S_To_d (Arg: string) return integer is
+ constant Argument: string(Arg'length downto 1) := Arg;
+ variable Result: integer := 0;
+ begin
+ case Argument(Argument'left) is
+ when '1' => Result := - 2**(Argument'left-1);
+ when '0' => Result := 0;
+ when others => return (integer'low);
+ end case;
+ for i in Argument'left-1 downto 1 loop
+ case Argument(i) is when '1' => Result := 2**(i-1) + Result;
+ when '0' => null;
+ when others => return(integer'low);
+ end case;
+ end loop;
+ return (Result);
+ end S_To_d;
+
+ -- string to decimal
+
+ function I_To_d (Arg: string(1 to FIO_d_WIDTH+1)) return integer is
+ constant Sign: character := Arg(1);
+ constant Value: string(Arg'length-1 downto 1) := Arg(2 to Arg'length);
+ variable Char: character;
+ variable Result: integer := 0;
+ begin
+ Result := 0;
+ for i in Value'range loop
+ Result := Result * 10;
+ Char := Value(i);
+ if (Char /= ' ') then
+ Result := Result + C_DIGIT_CHARS_MAP(Char);
+ end if;
+ end loop;
+ case Sign is when '-' => return(-Result);
+ when others => return(Result);
+ end case;
+ end I_To_d;
+
+ -- boolean (0,1) to decimal
+
+ function B_To_d (Arg: string(1 to 1)) return integer is
+ begin
+ case Arg is when "1" => return(1);
+ when "0" => return(0);
+ when others => return(-1);
+ end case;
+ end B_To_d;
+
+ -- boolean (T,F) to decimal
+
+ function L_To_d (Arg: string(1 to 1)) return integer is
+ begin
+ case Arg is when "T" => return(1);
+ when others => return(0);
+ end case;
+ end L_To_d;
+
+
+
+ ----------------------------
+ -- Hex conversion support --
+ ----------------------------
+
+ -- Constants & types
+
+ constant C_HEX_CHARS: string(1 to 17) := "0123456789ABCDEF?";
+
+ -- Function to return Hex index of a nibble
+
+ function U_To_h_Index(Arg: string(4 downto 1)) return integer is
+ variable Index: integer := 0;
+ begin
+ for i in Arg'range loop
+ case Arg(i) is when '1' => Index := 2**(i-1) + Index;
+ when '0' => null;
+ when others => return (17);
+ end case;
+ end loop;
+ return (Index+1);
+ end U_To_h_Index;
+
+ -- Hex conversion
+
+ function U_To_h (Arg: string) return string is
+ variable Result: string((Arg'length-1)/4 +1 downto 1);
+ variable ExtArg: string(Result'length*4 downto 1) := (others => '0');
+ begin
+ ExtArg(Arg'length downto 1) := Arg;
+ for i in Result'range loop
+ Result(i) := C_HEX_CHARS(U_To_h_Index( ExtArg(i*4 downto i*4 -3) ));
+ end loop;
+ return (FIO_h_PRE & Result & FIO_h_POST);
+ end U_To_h;
+
+
+
+ ----------------------------
+ -- Bit conversion support --
+ ----------------------------
+
+ function L_To_b (Arg: string(1 to 1)) return string is
+ variable Result: string(1 to 1);
+ begin
+ case Arg is when "T" => Result := "1";
+ when others => Result := "0";
+ end case;
+ return(FIO_b_PRE & Result & FIO_b_POST);
+ end L_To_b;
+
+
+ function I_To_b (Arg: string(1 to FIO_d_WIDTH+1);
+ Justified: side;
+ Width: integer) return string is
+
+ variable IntValue: integer := I_To_d(Arg);
+ variable BitValue: string(1 to FIO_b_WIDTH) := (others => ' ');
+ variable Sign: character := ' ';
+ constant Blanks: string(1 to FIO_b_WIDTH) := (others => ' ');
+ variable BitWidth: integer range 0 to FIO_b_WIDTH;
+ variable MsPos: integer range 1 to BitValue'length;
+ variable BitValueExtended: string(1 to 2*FIO_b_WIDTH);
+
+ begin
+
+ if (IntValue < 0) then
+ Sign := '-';
+ IntValue := -IntValue;
+ end if;
+
+ for i in BitValue'reverse_range loop
+ BitValue(i) := C_DIGITS_MAP(IntValue mod 2);
+ IntValue := IntValue / 2;
+ exit when (IntValue = 0);
+ end loop;
+
+ BitValueExtended := BitValue & Blanks;
+
+ if (Width = 0) or (Width > FIO_b_WIDTH+1) then
+ BitWidth := FIO_b_WIDTH;
+ else
+ BitWidth := Width-1;
+ end if;
+
+ if (Justified = RIGHT) then
+ return (FIO_bv_PRE &
+ Sign & BitValue(BitValue'length-BitWidth+1 to BitValue'length) &
+ FIO_bv_POST);
+ else
+ for i in BitValue'range loop
+ if BitValue(i) /= ' ' then
+ MSPos := i;
+ exit;
+ end if;
+ end loop;
+ return (FIO_bv_PRE &
+ Sign & BitValueExtended(MSPos to MSPos+BitWidth-1) &
+ FIO_bv_POST);
+ end if;
+
+ end I_To_b;
+
+
+ -----------------------------------
+ -- Reasonable conversion support --
+ -----------------------------------
+
+ function I_To_r (Arg: string(1 to FIO_d_WIDTH+1);
+ Justified: side;
+ Width: integer) return string is
+ constant Value: string(1 to FIO_d_WIDTH) := Arg(2 to FIO_d_WIDTH+1);
+ constant Sign: character := Arg(1);
+ constant Blanks: string(1 to FIO_d_WIDTH) := (others => ' ');
+ variable IntWidth: integer range 0 to FIO_d_WIDTH;
+ variable MsPos: integer range 1 to Value'length;
+ variable ValueExtended: string(1 to 2*FIO_d_WIDTH) := Value & Blanks;
+ begin
+ if (Width = 0) or (Width > FIO_d_WIDTH+1) then
+ IntWidth := FIO_d_WIDTH;
+ else
+ IntWidth := Width-1;
+ end if;
+ if (Justified = RIGHT) then
+ return (Sign & Value(Value'length-IntWidth+1 to Value'length));
+ else
+ for i in Value'range loop
+ if Value(i) /= ' ' then
+ MSPos := i;
+ exit;
+ end if;
+ end loop;
+ return (Sign & ValueExtended(MSPos to MSPos+IntWidth-1));
+ end if;
+ end I_To_r;
+
+
+ -------------------------------------------
+ -- Reasonable output conversion function --
+ -------------------------------------------
+
+ function ReasonableOutput (Arg: string;
+ Justified: side;
+ Width: integer) return string is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:" | "S:" | "V:" =>
+ return U_To_h(Value);
+ when "I:" =>
+ return I_To_r(Value, Justified, Width);
+ when "B:" | "L:" | "C:" =>
+ return Value;
+ when others =>
+ return Argument;
+ end case;
+
+ end ReasonableOutput;
+
+
+ ------------------------------------
+ -- Bit output conversion function --
+ ------------------------------------
+
+ function BitOutput (Arg: string;
+ Justified: side;
+ Width: integer) return string is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:" | "S:" | "V:" =>
+ return (FIO_bv_PRE & Value & FIO_bv_POST);
+ when "B:" =>
+ -- Value(1 to 1) instead of Value for LeapFrog
+ return (FIO_b_PRE & Value(1 to 1) & FIO_b_POST);
+ when "I:" =>
+ return I_To_b(Value, Justified, Width);
+ when "L:" =>
+ -- Value(1 to 1) instead of Value for LeapFrog
+ return L_To_b(Value(1 to 1));
+ when others =>
+ return Argument;
+ end case;
+
+ end BitOutput;
+
+
+ -------------------------------------------
+ -- Decimal output conversion function --
+ -------------------------------------------
+
+ function DecimalOutput (Arg: string) return integer is
+ constant Argument: string(1 to Arg'length) := Arg;
+ constant TypeSpec: string (1 to 2) := Argument(1 to 2);
+ constant Value: string(1 to Arg'length-2) := Argument(3 to Arg'length);
+ begin
+ case TypeSpec is
+ when "U:"| "V:" =>
+ return U_To_d(Value);
+ when "S:" =>
+ return S_To_d(Value);
+ when "I:" =>
+ return I_To_d(Value);
+ when "B:" =>
+ return B_To_d(Value);
+ when "L:" =>
+ return L_To_d(Value);
+ when others =>
+ return integer'low;
+ end case;
+
+ end DecimalOutput;
+
+
+ ----------------------------
+ -- Atomic print functions --
+ ----------------------------
+
+ -- test for end of format string
+
+ function FIO_EOS (Format: in string;
+ Pointer: in integer)
+ return boolean is
+ begin
+ return (Pointer > Format'length);
+ end FIO_EOS;
+
+
+ -- Atomic value print function
+
+ procedure FIO_PrintValue (file F: text;
+ L: inout line;
+ Format: in string;
+ Pointer: inout integer;
+ Last: in boolean := FALSE) is
+ variable Char: character;
+ begin
+ while (not FIO_EOS(Format, Pointer)) loop
+ Char := Format(Pointer);
+ case Char is
+ when '\' =>
+ Pointer := Pointer + 1;
+ exit when (FIO_EOS(Format, Pointer));
+ Char := Format(Pointer);
+ case Char is when 'n' => writeline(F, L);
+ when others => write(L, Char);
+ end case;
+ when '%' =>
+ if Last then
+ FIO_Warning_Fsbla(F, L, Format, Pointer);
+ end if;
+ Pointer := Pointer + 1;
+ exit;
+ when others =>
+ write(L, char);
+ end case;
+ Pointer := Pointer + 1;
+ end loop;
+ end FIO_PrintValue;
+
+
+ ---- Atomic argument print function
+
+ procedure FIO_PrintArg (file F: text;
+ L: inout line;
+ Format: in string;
+ Pointer: inout integer;
+ Arg: in string) is
+ variable Char: character;
+ variable Justified: side;
+ variable Width: integer;
+
+ begin
+
+ FIO_PrintValue(F, L, Format, Pointer);
+
+ Justified := RIGHT;
+ Width := 0;
+ while (not FIO_EOS(Format, Pointer)) loop
+ Char := Format(Pointer);
+ case Char is
+ when '-' =>
+ Justified := LEFT;
+ Pointer := Pointer + 1;
+ when '0' to '9' =>
+ Width := Width*10 + C_DIGIT_CHARS_MAP(Char);
+ Pointer := Pointer + 1;
+ when 'r' =>
+ write(L, ReasonableOutput(Arg, Justified, Width), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'b' =>
+ write(L, BitOutput(Arg, Justified, Width), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'd' =>
+ write(L, DecimalOutput(Arg), Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when 'q' | 's' =>
+ write(L, Arg, Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ when others =>
+ FIO_Warning_Ufs(F, L, Format, Pointer, Char);
+ write(L, Arg, Justified, Width);
+ Pointer := Pointer + 1;
+ exit;
+ end case;
+ end loop;
+ end FIO_PrintArg;
+
+
+ -----------------------------------------------------
+ -- The format string iteration expansion procedure --
+ -----------------------------------------------------
+
+ procedure FIO_FormatExpand (FMT: inout line;
+ Format: in string;
+ StartPointer: in positive) is
+
+ variable Pointer: positive := StartPointer;
+ variable TokenStart: positive;
+ variable IterStringStart: positive;
+ variable IterStringEnd: positive;
+ variable IterCount: natural;
+ variable OpenBrackets: natural;
+ variable L: line;
+
+ begin
+
+ FORMAT_SEARCH: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+
+ -- look for format specifier
+ when '%' =>
+
+ -- initialize iteration token search
+ TokenStart := Pointer;
+ IterCount := 0;
+ Pointer := Pointer + 1;
+
+ -- start iteration token search
+ TOKEN_READ: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+
+ -- read iteration counter
+ when '0' to '9' =>
+ IterCount := IterCount*10 + C_DIGIT_CHARS_MAP(Format(Pointer));
+ Pointer := Pointer + 1;
+
+ -- expect open bracket
+ when '{' =>
+
+ -- initialize iteration string read
+ OpenBrackets := 1;
+ IterStringStart := Pointer + 1;
+ Pointer := Pointer + 1;
+ -- quit prematurely when iteration count is 0
+ next FORMAT_SEARCH when (IterCount = 0);
+
+ -- start iteration string read
+ ITER_STRING_READ: while not FIO_EOS(Format, Pointer) loop
+
+ case Format(Pointer) is
+ -- keep track of open brackets
+ when '{' =>
+ OpenBrackets := OpenBrackets + 1;
+ Pointer := Pointer + 1;
+ -- when closing bracket is found, process iteration string
+ when '}' =>
+ OpenBrackets := OpenBrackets - 1;
+ if (OpenBrackets = 0) then
+ IterStringEnd := Pointer-1;
+ if (TokenStart /= 1) then
+ write(L, Format(1 to TokenStart-1));
+ end if;
+ for i in 1 to IterCount loop
+ write(L, Format(IterStringStart to IterStringEnd));
+ end loop;
+ if (IterStringEnd /= Format'length) then
+ write(L, Format(IterStringEnd+2 to Format'length));
+ end if;
+ -- call expansion procedure recursively on expanded format
+ FIO_FormatExpand(FMT, L.all, TokenStart);
+ deallocate(L);
+ return;
+ end if;
+ Pointer := Pointer + 1;
+ -- skip escaped characters
+ when '\' =>
+ Pointer := Pointer + 2;
+ -- read iteration string
+ when others =>
+ Pointer := Pointer + 1;
+
+ end case;
+
+ end loop ITER_STRING_READ;
+
+ -- stop iteration token search when no opening bracket found
+ when others =>
+ Pointer := Pointer + 1;
+ next FORMAT_SEARCH;
+
+ end case;
+
+ end loop TOKEN_READ;
+
+ -- skip escaped characters
+ when '\' =>
+ Pointer := Pointer + 2;
+
+ -- read other characters
+ when others =>
+ Pointer := Pointer + 1;
+
+ end case;
+
+ end loop FORMAT_SEARCH;
+
+ write(FMT, Format);
+ deallocate(L);
+
+ end FIO_FormatExpand;
+
+
+
+ --------------------------
+ -- The fprint procedure --
+ --------------------------
+
+ procedure fprint
+ (file F: text;
+ L: inout line;
+ Format: in string;
+ A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 : in string := FIO_NIL;
+ A9 , A10, A11, A12, A13, A14, A15, A16: in string := FIO_NIL;
+ A17, A18, A19, A20, A21, A22, A23, A24: in string := FIO_NIL;
+ A25, A26, A27, A28, A29, A30, A31, A32: in string := FIO_NIL
+ ) is
+
+ variable Pointer: integer;
+ variable FMT: line;
+
+ begin
+
+ Pointer := 1;
+
+ FIO_FormatExpand (FMT, Format, Format'low);
+
+ if (A1 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A1 );
+ if (A2 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A2 );
+ if (A3 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A3 );
+ if (A4 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A4 );
+ if (A5 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A5 );
+ if (A6 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A6 );
+ if (A7 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A7 );
+ if (A8 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A8 );
+ if (A9 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A9 );
+ if (A10 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A10);
+ if (A11 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A11);
+ if (A12 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A12);
+ if (A13 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A13);
+ if (A14 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A14);
+ if (A15 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A15);
+ if (A16 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A16);
+ if (A17 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A17);
+ if (A18 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A18);
+ if (A19 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A19);
+ if (A20 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A20);
+ if (A21 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A21);
+ if (A22 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A22);
+ if (A23 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A23);
+ if (A24 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A24);
+ if (A25 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A25);
+ if (A26 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A26);
+ if (A27 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A27);
+ if (A28 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A28);
+ if (A29 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A29);
+ if (A30 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A30);
+ if (A31 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A31);
+ if (A32 /= FIO_NIL) then FIO_PrintArg(F, L, FMT.all, Pointer, A32);
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+ end if; end if; end if; end if; end if; end if; end if; end if;
+
+ FIO_PrintValue(F, L, FMT.all, Pointer, Last => TRUE);
+
+ deallocate(FMT);
+
+ end fprint;
+
+
+ -------------------------------------------
+ -- Formatted output conversion functions --
+ -------------------------------------------
+
+ function fo (Arg: unsigned) return string is
+ constant Argument: unsigned(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("U:" & Result);
+ end fo;
+
+ function fo (Arg: signed) return string is
+ constant Argument: signed(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("S:" & Result);
+ end fo;
+
+ function fo (Arg: std_logic_vector) return string is
+ constant Argument: std_logic_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: std_ulogic_vector) return string is
+ constant Argument: std_ulogic_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_STD_LOGIC_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: bit_vector) return string is
+ constant Argument: bit_vector(1 to Arg'length) := Arg;
+ variable Result: string(1 to Arg'length);
+ begin
+ for i in Argument'range loop
+ Result(i) := C_BIT_MAP(Argument(i));
+ end loop;
+ return ("V:" & Result);
+ end fo;
+
+ function fo (Arg: integer) return string is
+ variable Argument: integer := Arg;
+ variable Result: string(1 to FIO_d_WIDTH) := (others => ' ');
+ variable Sign: character := ' ';
+ begin
+ if (Argument < 0) and (Argument /= integer'low) then
+ Sign := '-';
+ Argument := -Argument;
+ end if;
+ for i in Result'reverse_range loop
+ Result(i) := C_DIGITS_MAP(Argument mod 10);
+ Argument := Argument / 10;
+ exit when (Argument = 0);
+ end loop;
+ return ("I:" & Sign & Result);
+ end fo;
+
+ function fo (Arg: std_ulogic) return string is
+ begin
+ return ("B:" & C_STD_LOGIC_MAP(Arg));
+ end fo;
+
+ function fo (Arg: bit) return string is
+ begin
+ return ("B:" & C_BIT_MAP(Arg));
+ end fo;
+
+ function fo (Arg: boolean) return string is
+ begin
+ if (ARG = TRUE) then
+ return ("L:T");
+ else
+ return ("L:F");
+ end if;
+ end fo;
+
+ function fo (Arg: character) return string is
+ begin
+ return ("C:" & Arg);
+ end fo;
+
+ -- auxilary function fgets(Arg :string)
+ -- returns index of first NUL in Arg or if no NUL is present just Arg'length
+ -- goes through Arg from 1 to Arg'length
+ function fgets (Arg: string) return integer is
+ variable index: integer := Arg'length;
+ begin
+ for i in 1 to Arg'length loop
+ if Arg(i) = NUL then
+ index := i - 1;
+ exit;
+ else
+ null;
+ end if;
+ end loop;
+ return index;
+ end fgets;
+
+ -- returns the Arg string until the first NUL was encountered
+ -- if fo is used on a string with NUL in it it will stop reading the rest
+ -- of the string, even if a larger field width has been supplied. fo will
+ -- then just pad the remaining characters with blanco's
+ function fo (Arg: string) return string is
+ begin
+ return Arg(1 to fgets(Arg));
+ end fo;
+
+ function fo (Arg: time) return string is
+ begin
+ return fo (integer (Arg / 1 ns));
+ end fo;
+
+end PCK_FIO;
+
diff --git a/lib/PCK_FIO-2002.7/README b/lib/PCK_FIO-2002.7/README
new file mode 100644
index 0000000..b16c6c5
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/README
@@ -0,0 +1,88 @@
+---- $Id: README,v 1.1 2008-08-23 08:20:28 Jens Exp $
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 2001 Easics NV
+----
+---- This library is free software; you can redistribute it and/or
+---- modify it under the terms of the GNU Lesser General Public
+---- License as published by the Free Software Foundation; either
+---- version 2.1 of the License, or (at your option) any later version.
+----
+---- This library is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+---- Lesser General Public License for more details.
+----
+---- You should have received a copy of the GNU Lesser General Public
+---- License along with this library; if not, write to the Free Software
+---- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- http://www.easics.com
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+Version 2002.07
+===============
+
+Contents
+========
+
+This distribution contains the following files:
+
+ PCK_FIO_1987.vhd: VHDL-87 source of the header of the PCK_FIO package
+ PCK_FIO_1987_BODY.vhd: VHDL-87 source of the body of the PCK_FIO package
+ PCK_FIO_1993.vhd: VHDL-93 source of the header of the PCK_FIO package
+ PCK_FIO_1993_BODY.vhd: VHDL-93 source of the body of the PCK_FIO package
+ TB_PCK_FIO_1987.vhd: VHDL-87 source of the testbench for package PCK_FIO
+ TB_PCK_FIO_1993.vhd: VHDL-93 source of the testbench for package PCK_FIO
+ PCK_FIO.out.gold: Certified test bench output
+ PCK_FIO.html: Manual for PCK_FIO in html format
+ README: This file
+
+
+Installation
+============
+
+VHDL-1987
+---------
+To install PCK_FIO, define a VHDL library called EASICS_PACKAGES, and
+analyze the VHDL file PCK_FIO_1987.vhd and PCK_FIO_1987_BODY.vhd into this library.
+
+To install the test bench, analyze TB_PCK_FIO_1987.vhd into the same library.
+
+VHDL-1993
+---------
+To install PCK_FIO, define a VHDL library called EASICS_PACKAGES, and
+analyze the VHDL file PCK_FIO_1993.vhd and PCK_FIO_1993_BODY.vhd into this library.
+
+To install the test bench, analyze TB_PCK_FIO_1993.vhd into the same library.
+
+Numeric packages
+----------------
+If you want to use IEEE.std_logic_arith instead of IEEE.numeric_std, you need
+to edit the source code of the package, both header and body, and the test bench
+and replace the package use clause. PCK_FIO works with either of these packages.
+
+Documentation
+-------------
+To install the documentation, put the file point PCK_FIO.html in a path of
+your choosing, point your web browser to it, and bookmark it.
+
+
+Installation check
+==================
+
+After installing the test bench, you should run it. The corresponding VHDL
+design unit is EASICS_PACKAGES.TBE_PCK_FIO(TB).
+
+Simulating the test bench should create a file called PCK_FIO.out. This file
+should be identical to PCK_FIO.out.gold. Any difference indicates a portability
+issue or a simulator non-compliance or bug.
+
+
+
+
diff --git a/lib/PCK_FIO-2002.7/TB_PCK_FIO_1987.vhd b/lib/PCK_FIO-2002.7/TB_PCK_FIO_1987.vhd
new file mode 100644
index 0000000..2e18ff4
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/TB_PCK_FIO_1987.vhd
@@ -0,0 +1,531 @@
+---- $Id: TB_PCK_FIO_1987.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 2001 Easics NV
+----
+---- This library is free software; you can redistribute it and/or
+---- modify it under the terms of the GNU Lesser General Public
+---- License as published by the Free Software Foundation; either
+---- version 2.1 of the License, or (at your option) any later version.
+----
+---- This library is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+---- Lesser General Public License for more details.
+----
+---- You should have received a copy of the GNU Lesser General Public
+---- License along with this library; if not, write to the Free Software
+---- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- http://www.easics.com
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- signed/unsigned definition: use either std_logic_arith or numeric_std
+-- use IEEE.std_logic_arith.all; -- the Synopsys one
+ use IEEE.numeric_std.all;
+
+use STD.TEXTIO.all;
+
+library EASICS_PACKAGES;
+use EASICS_PACKAGES.PCK_FIO.all;
+
+entity TBE_PCK_FIO is
+
+end TBE_PCK_FIO;
+
+architecture TB of TBE_PCK_FIO is
+
+begin
+
+USAGE: process
+
+ file RESULT: text is out "PCK_FIO.out";
+ variable L: line;
+ variable Pointer: integer;
+ variable BoolTrue: boolean := TRUE;
+ variable BoolFalse: boolean := FALSE;
+ variable IntPos: integer := 5678;
+ variable BigIntPos: integer := 12345678;
+ variable IntNeg: integer := -8765;
+ variable BigIntNeg: integer := -87654321;
+ variable Uns: unsigned(6 downto 0) := unsigned'("1010010");
+ variable Unk: unsigned(6 downto 0) := unsigned'("1X10Z10");
+ variable Std: std_logic_vector(6 downto 0) := std_logic_vector'("0010010");
+ variable SigPos: signed(6 downto 0) := signed'("0010010");
+ variable SigNeg: signed(6 downto 0) := signed'("1010010");
+ variable BitX: std_logic := 'X';
+ variable Bit1: std_logic := '1';
+ variable Bit0: std_logic := '0';
+
+ variable parameter_1: integer := 1234;
+ variable parameter_2: integer := 2345;
+ variable parameter_3: integer := 4567;
+
+ constant TempString: string :="ABC" & NUL & "DEF";
+begin
+
+fprint(RESULT, L,
+ "PCK_FIO.out: TESTBENCH OUTPUT FOR PCK_FIO\n" &
+ "-----------------------------------------\n\n" &
+ "This is the result of running the PCK_FIO testbench.\n" &
+ "This file should be compared with PCK_FIO.out.gold, which is\n" &
+ "the reference output. Any difference indicates a portability\n" &
+ "issue or a simulator non-compliance or bug.\n\n"
+ );
+
+
+fprint(RESULT, L,
+ "\n--------------------\n" &
+ "-- Basic features --\n" &
+ "--------------------\n\n"
+ );
+
+fprint(RESULT, L,
+ "-- First some auxiliary declarations\n"
+ );
+
+fprint(RESULT, L,
+ "> file RESULT: text is out ""PCK_FIO.out"";\n" &
+ "> variable L: line;\n" &
+ "> variable BoolTrue: boolean := TRUE;\n" &
+ "> variable BoolFalse: boolean := FALSE;\n" &
+ "> variable IntPos: integer := 5678;\n" &
+ "> variable BigIntPos: integer := 12345678;\n" &
+ "> variable IntNeg: integer := -8765;\n" &
+ "> variable BigIntNeg: integer := -87654321;\n" &
+ "> variable Uns: unsigned(6 downto 0) := unsigned'(""1010010"");\n" &
+ "> variable Unk: unsigned(6 downto 0) := unsigned'(""1X10Z10"");\n" &
+ "> variable Std: std_logic_vector(6 downto 0) := std_logic_vector'(""0010010"");\n" &
+ "> variable SigPos: signed(6 downto 0) := signed'(""0010010"");\n" &
+ "> variable SigNeg: signed(6 downto 0) := signed'(""1010010"");\n" &
+ "> variable BitX: std_logic := 'X';\n" &
+ "> variable Bit1: std_logic := '1';\n" &
+ "> variable Bit0: std_logic := '0';\n" &
+ "> constant TempString: string := ""ABC"" & NUL & ""DEF"";\n"
+);
+
+
+fprint(RESULT, L,
+ "\n\n-- fprint call with no arguments\n" &
+ "> fprint(RESULT, L, ""No arguments.\\n"");\n"
+ );
+fprint(RESULT, L, "No arguments.\n");
+
+
+fprint(RESULT, L,
+ "\n-- Special characters need to be escaped\n" &
+ "> fprint(RESULT, L, ""Special characters: \\\% \\\\ "" \\n"");\n"
+ );
+
+fprint(RESULT, L, "Special characters: \% \\ "" \n");
+
+
+fprint(RESULT, L,
+ "\n-- Various format specifiers interprete the same object differently\n" &
+ "> fprint(RESULT, L, ""Format specifiers: \%r \%d \%b \%q\\n"",\n" &
+ "> fo(Uns), fo(Uns), fo(Uns), fo(Uns)\n" &
+ "> );\n"
+ );
+
+fprint(RESULT, L, "Format specifiers: %r %d %b %q\n",
+ fo(Uns), fo(Uns), fo(Uns), fo(Uns)
+ );
+
+fprint(RESULT, L,
+ "\n-- Format string can be shortened by using the iteration specifier\n" &
+ "> fprint(RESULT, L, ""Iteration specifier: \%4{\%r }\\n"",\n" &
+ "> fo(Uns), fo(SigPos), fo(SigNeg), fo(Std)\n" &
+ "> );\n"
+ );
+
+fprint(RESULT, L, "Iteration specifier: %4{%r }\n",
+ fo(Uns), fo(SigPos), fo(SigNeg), fo(Std)
+ );
+fprint(RESULT, L,
+ "\n-------------------------------\n"&
+ "--Testing string manipulation--\n"&
+ "-------------------------------\n");
+fprint(RESULT, L, "--testing done using the string TempString : " & """ABC"""
+ & " & NUL & ""DEF""\n");
+-- temp_string: string:="ABC"&NUL&"DEF"
+-- test for detecting NUL in string
+fprint(RESULT, L, "\n--test for NUL ending in strings\n");
+fprint(RESULT, L, "> fprint(RESULT, L, fo(TempString));\n");
+fprint(RESULT, L, fo(TempString));
+
+-- direct inclusion of string in fprint should give whole string
+fprint(RESULT, L, "\n--same without fo,so without NUL testing\n");
+fprint(RESULT, L, "> fprint(RESULT, L, TempString);\n");
+fprint(RESULT, L, TempString & "\n");
+
+-- influence of given width
+
+fprint(RESULT, L, "\n--if there are less characters in the given string then"
+ & " in the width fo will\n"&
+ "-- pad the remaining with blanco's according to the given justification\n");
+fprint(RESULT, L, "\n--with specified width, justified right,using fo\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%5s"", fo(TempString));\n");
+fprint(RESULT, L, "%5s", fo(TempString));
+fprint(RESULT, L, "\n--with specified width, justified left, using fo\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%-5s"", fo(TempString));\n");
+fprint(RESULT, L, "%-5s",fo(TempString));
+fprint(RESULT, L, "\n--with specified width without fo\n");
+fprint(RESUlT, L, "> fprint(RESULT, L, ""\%9s"", TempString);\n");
+fprint(RESULT, L, "%9s", TempString);
+fprint(RESULT, L, "\n\n-- if the width is smaller then the number" &
+ " of characters in the string fprint\n" &
+ "-- will output the string with the minimum of characters needed\n");
+fprint(RESULT, L, "\n--with specified width,using fo\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%2s"", fo(TempString));\n");
+fprint(RESULT, L, "%2s",fo(TempString));
+fprint(RESULT, L, "\n--with specified width without fo\n");
+fprint(RESUlT, L, "> fprint(RESULT, L, ""\%4s"", TempString);\n");
+fprint(RESULT, L, "%4s", TempString);
+
+
+fprint(RESULT, L,
+ "\n\n------------------------------------\n" &
+ "-- Support for bit-oriented types --\n" &
+ "------------------------------------\n"
+ );
+
+fprint (RESULT, L, "\n-- Reasonable format\n" &
+ "> fprint(RESULT, L, ""Reasonable format: \%9{\%r }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Reasonable format: %9{%r }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint (RESULT, L, "\n-- Decimal format\n" &
+ "> fprint(RESULT, L, ""Decimal format: \%7{\%d }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Decimal format: %9{%d }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint (RESULT, L, "\n-- Bit format\n" &
+ "> fprint(RESULT, L, ""Bit format: \%7{\%b }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Bit format: %9{%b }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint(RESULT, L,
+ "\n\n" &
+ "-- Alignment\n-- Template of the call: ( stands for the format specifier)\n"
+ );
+
+
+fprint(RESULT, L, "\n" &
+ "> fprint(RESULT, L, ""Bitvectors with : \%4{|}\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg)\n" &
+
+ "> );\n"
+ );
+
+fprint(RESULT, L,
+ "\n" &
+ "-- Results of the call with various format specifiers\n\n"
+ );
+
+fprint(RESULT, L, "Bitvectors with \%1r: %4{%1r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%2r: %4{%2r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%3r: %4{%3r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%4r: %4{%4r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%5r: %4{%5r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%6r: %4{%6r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%7r: %4{%7r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%8r: %4{%8r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%9r: %4{%9r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%-1r: %4{%-1r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-2r: %4{%-2r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-3r: %4{%-3r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-4r: %4{%-4r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-5r: %4{%-5r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-6r: %4{%-6r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-7r: %4{%-7r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-8r: %4{%-8r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-9r: %4{%-9r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%1d: %4{%1d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%2d: %4{%2d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%3d: %4{%3d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%4d: %4{%4d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%5d: %4{%5d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%6d: %4{%6d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%7d: %4{%7d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%8d: %4{%8d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%9d: %4{%9d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%-1d: %4{%-1d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-2d: %4{%-2d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-3d: %4{%-3d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-4d: %4{%-4d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-5d: %4{%-5d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-6d: %4{%-6d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-7d: %4{%-7d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-8d: %4{%-8d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-9d: %4{%-9d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+
+
+
+fprint(RESULT, L,
+ "\n-------------------------------\n" &
+ "-- Support for integer types --\n" &
+ "-------------------------------\n"
+ );
+
+fprint(RESULT, L,
+ "\n\n" &
+ "-- Template of the call: ( stands for the format specifier)\n"
+ );
+
+
+fprint(RESULT, L, "\n" &
+ "> fprint(RESULT, L, ""Integers with : \%4{|}\\n"",\n" &
+ "> fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)\n" &
+
+ "> );\n"
+ );
+
+fprint(RESULT, L,
+ "\n" &
+ "-- Results of the call with various format specifiers\n\n"
+ );
+
+
+fprint(RESULT, L, "Integers with \%5d: %4{%5d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%6d: %4{%6d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%7d: %4{%7d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%8d: %4{%8d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%9d: %4{%9d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%10d: %4{%10d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%-5d: %4{%-5d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-6d: %4{%-6d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-7d: %4{%-7d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-8d: %4{%-8d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-9d: %4{%-9d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-10d: %4{%-10d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%5r: %4{%5r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%6r: %4{%6r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%7r: %4{%7r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%8r: %4{%8r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%9r: %4{%9r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%10r: %4{%10r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%-5r: %4{%-5r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-6r: %4{%-6r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-7r: %4{%-7r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-8r: %4{%-8r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-9r: %4{%-9r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-10r: %4{%-10r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+
+
+fprint(RESULT, L,
+ "\n----------------------\n" &
+ "-- Support for time --\n" &
+ "----------------------\n"
+ );
+
+fprint (RESULT, L, "-- For portability reasons, time is converted \n" &
+ "-- into an integer value (of nanoseconds)\n"
+ );
+fprint (RESULT, L, "> wait for 648 ns\n");
+fprint (RESULT, L, "> fprint (RESULT, L, ""The time is now \%d ns\\n"", fo(now));\n");
+
+wait for 648 ns;
+
+fprint (RESULT, L, "The time is now %d ns\n", fo(now));
+
+
+fprint(RESULT, L,
+ "\n----------------------------------------\n" &
+ "-- Erroneous calls and error messages --\n" &
+ "----------------------------------------\n"
+ );
+
+fprint(RESULT, L, "\n-- Less arguments than formats specifiers\n" &
+ "> fprint(RESULT, L, ""\%d \%d \%d \%d \\n"", fo(Uns), fo(Std));\n"
+ );
+
+fprint(RESULT, L, "%d %d %d %d \n", fo(Uns), fo(Std));
+
+fprint(RESULT, L, "\n");
+
+fprint(RESULT, L, "-- Unsupported format specifier\n" &
+ "> fprint(RESULT, L, ""\%r \%v \%r \%r\\n"", " &
+ "fo(Uns), fo(Std), fo(Uns), fo(Std));\n"
+ );
+
+fprint(RESULT, L, "%r %v %r %r\n", fo(Uns), fo(Std), fo(Uns), fo(Std));
+
+fprint(RESULT, L, "\n");
+
+fprint(RESULT, L,
+ "\n----------------------------------------\n" &
+ "-- Things you wouldn't expect to work --\n" &
+ "----------------------------------------\n"
+ );
+
+fprint(RESULT, L, "\n-- Nested iteration\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%3{<<\%3{_END_}>>}\\n"");\n");
+fprint(RESULT, L, "%3{<<%3{_END_}>>}\n");
+
+wait;
+
+end process USAGE;
+
+end TB;
+
+
diff --git a/lib/PCK_FIO-2002.7/TB_PCK_FIO_1993.vhd b/lib/PCK_FIO-2002.7/TB_PCK_FIO_1993.vhd
new file mode 100644
index 0000000..0386a11
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/TB_PCK_FIO_1993.vhd
@@ -0,0 +1,536 @@
+---- $Id: TB_PCK_FIO_1993.vhd,v 1.1 2008-08-23 08:20:28 Jens Exp $
+----
+---- PCK_FIO: a VHDL package for C-style formatted file output
+---- Copyright (C) 1995, 2001 Easics NV
+----
+---- This library is free software; you can redistribute it and/or
+---- modify it under the terms of the GNU Lesser General Public
+---- License as published by the Free Software Foundation; either
+---- version 2.1 of the License, or (at your option) any later version.
+----
+---- This library is distributed in the hope that it will be useful,
+---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+---- Lesser General Public License for more details.
+----
+---- You should have received a copy of the GNU Lesser General Public
+---- License along with this library; if not, write to the Free Software
+---- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+----
+---- For suggestions, bug reports, enhancement requests, and info about
+---- our design services, you can contact us at the following address:
+---- http://www.easics.com
+---- Easics NV, Interleuvenlaan 86, B-3001 Leuven, Belgium
+---- tel.: +32 16 395 600 fax : +32 16 395 619
+---- e-mail: jand@easics.be (Jan Decaluwe)
+----
+
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+-- signed/unsigned definition: use either std_logic_arith or numeric_std
+-- use IEEE.std_logic_arith.all; -- the Synopsys one
+use IEEE.numeric_std.all;
+
+use STD.TEXTIO.all;
+
+library EASICS_PACKAGES;
+use EASICS_PACKAGES.PCK_FIO.all;
+
+entity TBE_PCK_FIO is
+
+end TBE_PCK_FIO;
+
+architecture TB of TBE_PCK_FIO is
+
+begin
+
+USAGE: process
+
+ file RESULT: text open write_mode is "PCK_FIO.out";
+ variable L: line;
+ variable Pointer: integer;
+ variable BoolTrue: boolean := TRUE;
+ variable BoolFalse: boolean := FALSE;
+ variable IntPos: integer := 5678;
+ variable BigIntPos: integer := 12345678;
+ variable IntNeg: integer := -8765;
+ variable BigIntNeg: integer := -87654321;
+ variable Uns: unsigned(6 downto 0) := unsigned'("1010010");
+ variable Unk: unsigned(6 downto 0) := unsigned'("1X10Z10");
+ variable Std: std_logic_vector(6 downto 0) := std_logic_vector'("0010010");
+ variable SigPos: signed(6 downto 0) := signed'("0010010");
+ variable SigNeg: signed(6 downto 0) := signed'("1010010");
+ variable BitX: std_logic := 'X';
+ variable Bit1: std_logic := '1';
+ variable Bit0: std_logic := '0';
+
+ variable parameter_1: integer := 1234;
+ variable parameter_2: integer := 2345;
+ variable parameter_3: integer := 4567;
+
+ constant TempString: string :="ABC" & NUL & "DEF";
+begin
+
+fprint(RESULT, L,
+ "PCK_FIO.out: TESTBENCH OUTPUT FOR PCK_FIO\n" &
+ "-----------------------------------------\n\n" &
+ "This is the result of running the PCK_FIO testbench.\n" &
+ "This file should be compared with PCK_FIO.out.gold, which is\n" &
+ "the reference output. Any difference indicates a portability\n" &
+ "issue or a simulator non-compliance or bug.\n\n"
+ );
+
+
+fprint(RESULT, L,
+ "\n--------------------\n" &
+ "-- Basic features --\n" &
+ "--------------------\n\n"
+ );
+
+fprint(RESULT, L,
+ "-- First some auxiliary declarations\n"
+ );
+
+fprint(RESULT, L,
+ "> file RESULT: text is out ""PCK_FIO.out"";\n" &
+ "> variable L: line;\n" &
+ "> variable BoolTrue: boolean := TRUE;\n" &
+ "> variable BoolFalse: boolean := FALSE;\n" &
+ "> variable IntPos: integer := 5678;\n" &
+ "> variable BigIntPos: integer := 12345678;\n" &
+ "> variable IntNeg: integer := -8765;\n" &
+ "> variable BigIntNeg: integer := -87654321;\n" &
+ "> variable Uns: unsigned(6 downto 0) := unsigned'(""1010010"");\n" &
+ "> variable Unk: unsigned(6 downto 0) := unsigned'(""1X10Z10"");\n" &
+ "> variable Std: std_logic_vector(6 downto 0) := std_logic_vector'(""0010010"");\n" &
+ "> variable SigPos: signed(6 downto 0) := signed'(""0010010"");\n" &
+ "> variable SigNeg: signed(6 downto 0) := signed'(""1010010"");\n" &
+ "> variable BitX: std_logic := 'X';\n" &
+ "> variable Bit1: std_logic := '1';\n" &
+ "> variable Bit0: std_logic := '0';\n" &
+ "> constant TempString: string := ""ABC"" & NUL & ""DEF"";\n"
+);
+
+
+fprint(RESULT, L,
+ "\n\n-- fprint call with no arguments\n" &
+ "> fprint(RESULT, L, ""No arguments.\\n"");\n"
+ );
+fprint(RESULT, L, "No arguments.\n");
+
+
+fprint(RESULT, L,
+ "\n-- Special characters need to be escaped\n" &
+ "> fprint(RESULT, L, ""Special characters: \\\% \\\\ "" \\n"");\n"
+ );
+
+fprint(RESULT, L, "Special characters: \% \\ "" \n");
+
+
+fprint(RESULT, L,
+ "\n-- Various format specifiers interprete the same object differently\n" &
+ "> fprint(RESULT, L, ""Format specifiers: \%r \%d \%b \%q\\n"",\n" &
+ "> fo(Uns), fo(Uns), fo(Uns), fo(Uns)\n" &
+ "> );\n"
+ );
+
+fprint(RESULT, L, "Format specifiers: %r %d %b %q\n",
+ fo(Uns), fo(Uns), fo(Uns), fo(Uns)
+ );
+
+fprint(RESULT, L,
+ "\n-- Format string can be shortened by using the iteration specifier\n" &
+ "> fprint(RESULT, L, ""Iteration specifier: \%4{\%r }\\n"",\n" &
+ "> fo(Uns), fo(SigPos), fo(SigNeg), fo(Std)\n" &
+ "> );\n"
+ );
+
+fprint(RESULT, L, "Iteration specifier: %4{%r }\n",
+ fo(Uns), fo(SigPos), fo(SigNeg), fo(Std)
+ );
+fprint(RESULT, L,
+ "\n-------------------------------\n"&
+ "--Testing string manipulation--\n"&
+ "-------------------------------\n");
+fprint(RESULT, L, "--testing done using the string TempString : " & """ABC"""
+ & " & NUL & ""DEF""\n");
+-- TempString: string:="ABC" & NUL & "DEF"
+-- test for detecting NUL in string
+fprint(RESULT, L ,"\n--test for NUL ending in strings\n");
+fprint(RESULT, L, "> fprint(RESULT, L, fo(TempString));\n");
+fprint(RESULT, L, fo(TempString));
+
+-- direct inclusion of string in fprint should give whole string
+fprint(RESULT, L, "\n--same without fo,so without NUL testing\n");
+fprint(RESULT, L, "> fprint(RESULT, L, TempString);\n");
+fprint(RESULT, L, TempString & "\n");
+
+-- influence of given width
+
+fprint(RESULT, L, "\n--if there are less characters in the given string then in the width fo will\n"&
+ "-- pad the remaining with blanco's according to the given justification\n");
+fprint(RESULT, L, "\n--with specified width, justified right,using fo\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%5s"", fo(TempString));\n");
+fprint(RESULT, L, "%5s", fo(TempString));
+fprint(RESULT, L, "\n--with specified width, justified left, using fo\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%-5s"", fo(TempString));\n");
+fprint(RESULT, L, "%-5s", fo(TempString));
+fprint(RESULT, L, "\n--with specified width without fo\n");
+fprint(RESUlT, L, "> fprint(RESULT, L, ""\%9s"", TempString);\n");
+fprint(RESULT, L, "%9s", TempString);
+fprint(RESULT, L, "\n\n-- if the width is smaller then the number of characters in the string fprint\n"&
+ "-- will output the string with the minimum of characters needed\n");
+fprint(RESULT, L, "\n--with specified width,using fo\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%2s"", fo(TempString));\n");
+fprint(RESULT, L, "%2s", fo(TempString));
+fprint(RESULT, L, "\n--with specified width without fo\n");
+fprint(RESUlT, L, "> fprint(RESULT, L, ""\%4s"", TempString);\n");
+fprint(RESULT, L, "%4s", TempString);
+
+fprint(RESULT, L,
+ "\n\n------------------------------------\n" &
+ "-- Support for bit-oriented types --\n" &
+ "------------------------------------\n"
+ );
+
+fprint (RESULT, L, "\n-- Reasonable format\n" &
+ "> fprint(RESULT, L, ""Reasonable format: \%9{\%r }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Reasonable format: %9{%r }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint (RESULT, L, "\n-- Decimal format\n" &
+ "> fprint(RESULT, L, ""Decimal format: \%7{\%d }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Decimal format: %9{%d }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint (RESULT, L, "\n-- Bit format\n" &
+ "> fprint(RESULT, L, ""Bit format: \%7{\%b }\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),\n" &
+ "> fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse) \n" &
+ "> );\n"
+ );
+
+
+fprint(RESULT, L, "Bit format: %9{%b }\n",
+ fo(Std), fo(Uns), fo(SigPos), fo(SigNeg), fo(Unk),
+ fo(Bit1), fo(BitX), fo(BoolTrue), fo(BoolFalse)
+ );
+
+fprint(RESULT, L,
+ "\n\n" &
+ "-- Alignment\n-- Template of the call: ( stands for the format specifier)\n"
+ );
+
+
+fprint(RESULT, L, "\n" &
+ "> fprint(RESULT, L, ""Bitvectors with : \%4{|}\\n"",\n" &
+ "> fo(Std), fo(Uns), fo(SigPos), fo(SigNeg)\n" &
+ "> );\n"
+ );
+
+fprint(RESULT, L,
+ "\n" &
+ "-- Results of the call with various format specifiers\n\n"
+ );
+
+fprint(RESULT, L, "Bitvectors with \%1r: %4{%1r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%2r: %4{%2r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%3r: %4{%3r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%4r: %4{%4r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%5r: %4{%5r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%6r: %4{%6r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%7r: %4{%7r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%8r: %4{%8r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%9r: %4{%9r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%-1r: %4{%-1r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-2r: %4{%-2r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-3r: %4{%-3r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-4r: %4{%-4r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-5r: %4{%-5r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-6r: %4{%-6r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-7r: %4{%-7r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-8r: %4{%-8r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-9r: %4{%-9r|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%1d: %4{%1d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%2d: %4{%2d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%3d: %4{%3d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%4d: %4{%4d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%5d: %4{%5d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%6d: %4{%6d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%7d: %4{%7d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%8d: %4{%8d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%9d: %4{%9d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Bitvectors with \%-1d: %4{%-1d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-2d: %4{%-2d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-3d: %4{%-3d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-4d: %4{%-4d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-5d: %4{%-5d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-6d: %4{%-6d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-7d: %4{%-7d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-8d: %4{%-8d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "Bitvectors with \%-9d: %4{%-9d|} \n",
+ fo(Uns), fo(Std), fo(SigPos), fo(SigNeg)
+ );
+fprint(RESULT, L, "\n");
+
+
+
+fprint(RESULT, L,
+ "\n-------------------------------\n" &
+ "-- Support for integer types --\n" &
+ "-------------------------------\n"
+ );
+
+fprint(RESULT, L,
+ "\n\n" &
+ "-- Template of the call: ( stands for the format specifier)\n"
+ );
+
+
+fprint(RESULT, L, "\n" &
+ "> fprint(RESULT, L, ""Integers with : \%4{|}\\n"",\n" &
+ "> fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)\n" &
+
+ "> );\n"
+ );
+
+fprint(RESULT, L,
+ "\n" &
+ "-- Results of the call with various format specifiers\n\n"
+ );
+
+
+fprint(RESULT, L, "Integers with \%5d: %4{%5d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%6d: %4{%6d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%7d: %4{%7d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%8d: %4{%8d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%9d: %4{%9d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%10d: %4{%10d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%-5d: %4{%-5d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-6d: %4{%-6d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-7d: %4{%-7d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-8d: %4{%-8d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-9d: %4{%-9d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-10d: %4{%-10d|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%5r: %4{%5r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%6r: %4{%6r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%7r: %4{%7r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%8r: %4{%8r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%9r: %4{%9r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%10r: %4{%10r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+fprint(RESULT, L, "Integers with \%-5r: %4{%-5r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-6r: %4{%-6r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-7r: %4{%-7r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-8r: %4{%-8r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-9r: %4{%-9r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "Integers with \%-10r: %4{%-10r|} \n",
+ fo(IntPos), fo(IntNeg), fo(BigIntPos), fo(BigIntNeg)
+ );
+fprint(RESULT, L, "\n");
+
+
+fprint(RESULT, L,
+ "\n----------------------\n" &
+ "-- Support for time --\n" &
+ "----------------------\n"
+ );
+
+fprint (RESULT, L, "-- For portability reasons, time is converted \n" &
+ "-- into an integer value (of nanoseconds)\n"
+ );
+fprint (RESULT, L, "> wait for 648 ns\n");
+fprint (RESULT, L, "> fprint (RESULT, L, ""The time is now \%d ns\\n"", fo(now));\n");
+
+wait for 648 ns;
+
+fprint (RESULT, L, "The time is now %d ns\n", fo(now));
+
+
+fprint(RESULT, L,
+ "\n----------------------------------------\n" &
+ "-- Erroneous calls and error messages --\n" &
+ "----------------------------------------\n"
+ );
+
+fprint(RESULT, L, "\n-- Less arguments than formats specifiers\n" &
+ "> fprint(RESULT, L, ""\%d \%d \%d \%d \\n"", fo(Uns), fo(Std));\n"
+ );
+
+fprint(RESULT, L, "%d %d %d %d \n", fo(Uns), fo(Std));
+
+fprint(RESULT, L, "\n");
+
+fprint(RESULT, L, "-- Unsupported format specifier\n" &
+ "> fprint(RESULT, L, ""\%r \%v \%r \%r\\n"", " &
+ "fo(Uns), fo(Std), fo(Uns), fo(Std));\n"
+ );
+
+fprint(RESULT, L, "%r %v %r %r\n", fo(Uns), fo(Std), fo(Uns), fo(Std));
+
+fprint(RESULT, L, "\n");
+
+fprint(RESULT, L,
+ "\n----------------------------------------\n" &
+ "-- Things you wouldn't expect to work --\n" &
+ "----------------------------------------\n"
+ );
+
+fprint(RESULT, L, "\n-- Nested iteration\n");
+fprint(RESULT, L, "> fprint(RESULT, L, ""\%3{<<\%3{_END_}>>}\\n"");\n");
+fprint(RESULT, L, "%3{<<%3{_END_}>>}\n");
+
+wait;
+
+end process USAGE;
+
+end TB;
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/PCK_FIO-2002.7/msMakefile.TBE_PCK_FIO_TB.1987 b/lib/PCK_FIO-2002.7/msMakefile.TBE_PCK_FIO_TB.1987
new file mode 100644
index 0000000..c5a4a92
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/msMakefile.TBE_PCK_FIO_TB.1987
@@ -0,0 +1,34 @@
+### msMakefile generated by vma on Thu Oct 4 17:33:56 CEST 2001
+
+ANALYZER = vcom -quiet -nologo
+ANALYZER_C = vcom -quiet -nologo
+all : \
+ bin/tbe_pck_fio/tb.dat \
+ bin/tbe_pck_fio/_primary.dat
+
+# Prerequisites for architecture EASICS_PACKAGES.TBE_PCK_FIO(TB)
+# Prerequisites for entity EASICS_PACKAGES.TBE_PCK_FIO
+
+bin/tbe_pck_fio/tb.dat \
+bin/tbe_pck_fio/_primary.dat : \
+ bin/pck_fio/body.dat \
+ bin/pck_fio/_primary.dat \
+ TB_PCK_FIO_1987.vhd
+ ${ANALYZER_C} -work EASICS_PACKAGES TB_PCK_FIO_1987.vhd
+
+
+# Prerequisites for package body EASICS_PACKAGES.PCK_FIO()
+
+bin/pck_fio/body.dat : \
+ bin/pck_fio/_primary.dat \
+ PCK_FIO_1987_BODY.vhd
+ ${ANALYZER_C} -work EASICS_PACKAGES PCK_FIO_1987_BODY.vhd
+
+
+# Prerequisites for package declaration EASICS_PACKAGES.PCK_FIO
+
+bin/pck_fio/_primary.dat : \
+ PCK_FIO_1987.vhd
+ ${ANALYZER} -work EASICS_PACKAGES PCK_FIO_1987.vhd
+
+
diff --git a/lib/PCK_FIO-2002.7/msMakefile.TBE_PCK_FIO_TB.1993 b/lib/PCK_FIO-2002.7/msMakefile.TBE_PCK_FIO_TB.1993
new file mode 100644
index 0000000..0f9a351
--- /dev/null
+++ b/lib/PCK_FIO-2002.7/msMakefile.TBE_PCK_FIO_TB.1993
@@ -0,0 +1,34 @@
+### msMakefile generated by vma on Thu Oct 4 17:32:23 CEST 2001
+
+ANALYZER = vcom -quiet -nologo -93
+ANALYZER_C = vcom -quiet -nologo -93
+all : \
+ bin/tbe_pck_fio/tb.dat \
+ bin/tbe_pck_fio/_primary.dat
+
+# Prerequisites for architecture EASICS_PACKAGES.TBE_PCK_FIO(TB)
+# Prerequisites for entity EASICS_PACKAGES.TBE_PCK_FIO
+
+bin/tbe_pck_fio/tb.dat \
+bin/tbe_pck_fio/_primary.dat : \
+ bin/pck_fio/body.dat \
+ bin/pck_fio/_primary.dat \
+ TB_PCK_FIO_1993.vhd
+ ${ANALYZER_C} -work EASICS_PACKAGES TB_PCK_FIO_1993.vhd
+
+
+# Prerequisites for package body EASICS_PACKAGES.PCK_FIO()
+
+bin/pck_fio/body.dat : \
+ bin/pck_fio/_primary.dat \
+ PCK_FIO_1993_BODY.vhd
+ ${ANALYZER_C} -work EASICS_PACKAGES PCK_FIO_1993_BODY.vhd
+
+
+# Prerequisites for package declaration EASICS_PACKAGES.PCK_FIO
+
+bin/pck_fio/_primary.dat : \
+ PCK_FIO_1993.vhd
+ ${ANALYZER} -work EASICS_PACKAGES PCK_FIO_1993.vhd
+
+
diff --git a/lib/SDRAM/ddr_sdr_v1_4/ise9/sdram_ctrl_top_vhdl.prj b/lib/SDRAM/ddr_sdr_v1_4/ise9/sdram_ctrl_top_vhdl.prj
new file mode 100644
index 0000000..ba54b14
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/ise9/sdram_ctrl_top_vhdl.prj
@@ -0,0 +1,13 @@
+vhdl work "W:\vhdl\lib\misc\utils_pkg.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\sdram_config.vhd"
+vhdl work "W:\vhdl\lib\FIFO\src\fifo_ctrl_pkg.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\sdram_types.vhd"
+vhdl work "W:\vhdl\lib\FIFO\src\sync_fifo_ctrl.vhd"
+vhdl work "W:\vhdl\lib\FIFO\src\dpram.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\sdram_ctrl.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\sdram_cmd.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\reset_virtex4.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\fifo_sync.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\ddr_phy_virtex4.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\clockgen_virtex4.vhd"
+vhdl work "W:\vhdl\lib\SDRAM\ddr_sdr_v1_4\src\sdram_ctrl_top.vhd"
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/compile_simprim.do b/lib/SDRAM/ddr_sdr_v1_4/sim/compile_simprim.do
new file mode 100644
index 0000000..16b23bb
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/compile_simprim.do
@@ -0,0 +1,6 @@
+vlib simprim
+
+vcom -93 -work simprim F:/Xilinx9/vhdl/src/simprims/simprim_Vcomponents_mti.vhd
+vcom -93 -work simprim F:/Xilinx9/vhdl/src/simprims/simprim_Vpackage_mti.vhd
+vcom -93 -work simprim F:/Xilinx9/vhdl/src/simprims/simprim_SMODEL_mti.vhd
+vcom -93 -work simprim F:/Xilinx9/vhdl/src/simprims/simprim_VITAL_mti.vhd
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/compile_unisim.do b/lib/SDRAM/ddr_sdr_v1_4/sim/compile_unisim.do
new file mode 100644
index 0000000..d35d8c9
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/compile_unisim.do
@@ -0,0 +1,6 @@
+vlib unisim
+
+vcom -93 -work unisim F:/Xilinx9/vhdl/src/unisims/unisim_vpkg.vhd
+vcom -93 -work unisim F:/Xilinx9/vhdl/src/unisims/unisim_vcomp.vhd
+vcom -93 -work unisim F:/Xilinx9/vhdl/src/unisims/unisim_smodel.vhd
+vcom -93 -work unisim F:/Xilinx9/vhdl/src/unisims/unisim_vital.vhd
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl.fdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl.fdo
new file mode 100644
index 0000000..7af84ba
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl.fdo
@@ -0,0 +1,27 @@
+## NOTE: Do not edit this file.
+##
+
+vlib work
+vcom -explicit -93 "../../../FIFO/src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../../../misc/dpram_1w2r.vhd"
+vcom -explicit -93 "../../../FIFO/src/sync_fifo_ctrl.vhd"
+vcom -explicit -93 "../../../misc/utils_pkg.vhd"
+vcom -explicit -93 "../src/fifo_sync.vhd"
+vcom -explicit -93 "../src/sdram_config.vhd"
+vcom -explicit -93 "../src/sdram_types.vhd"
+vcom -explicit -93 "../src/reset_virtex4.vhd"
+vcom -explicit -93 "../src/clockgen_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_cmd.vhd"
+vcom -explicit -93 "../src/sdram_ctrl.vhd"
+vcom -explicit -93 "../src/ddr_phy_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_ctrl_top.vhd"
+vcom -explicit -93 "../src/mt46v16m16.vhd"
+vcom -explicit -93 "../src/tb_sdr_ctrl.vhd"
+
+#restart -force
+vsim -t 1ps -lib work tb_sdr_ctrl
+do {tb_sdr_ctrl.wdo}
+view wave
+view structure
+view signals
+run 800us
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl.wdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl.wdo
new file mode 100644
index 0000000..4a9d3f1
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl.wdo
@@ -0,0 +1,93 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_sdram_ctrl/st_ctrl
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_sdram_cmd/st_sdr
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_sdram_cmd/burst_finished
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/mode_fifo_in
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/mode_fifo_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/col_fifo_in
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/col_fifo_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/cmd_fifo_in
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/cmd_fifo_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/cmd_fifo_empty
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/cmd_fifo_full
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/cmd_fifo_re
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/cmd_fifo_we
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_in
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_fb
+add wave -noupdate -format Analog-Step -height 50 -offset 0.5 -scale 20.0 /tb_sdr_ctrl/efficiency
+add wave -noupdate -format Literal /tb_sdr_ctrl/data_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/cycle_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_we_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cs_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_ras_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cas_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cke
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_zen
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_rst
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_drive
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive270
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_en
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_busy
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_data_vld
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/sys_clk0
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/ref_data
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 4} {14963876 ps} 0}
+configure wave -namecolwidth 184
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {14733925 ps} {15711632 ps}
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_fifo.fdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_fifo.fdo
new file mode 100644
index 0000000..4f1cf1c
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_fifo.fdo
@@ -0,0 +1,27 @@
+## NOTE: Do not edit this file.
+##
+
+vlib work
+vcom -explicit -93 "../../../FIFO/src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../../../misc/dpram_1w2r.vhd"
+vcom -explicit -93 "../../../FIFO/src/sync_fifo_ctrl.vhd"
+vcom -explicit -93 "../../../misc/utils_pkg.vhd"
+vcom -explicit -93 "../src/fifo_sync.vhd"
+vcom -explicit -93 "../src/sdram_config.vhd"
+vcom -explicit -93 "../src/sdram_types.vhd"
+vcom -explicit -93 "../src/reset_virtex4.vhd"
+vcom -explicit -93 "../src/clockgen_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_cmd.vhd"
+vcom -explicit -93 "../src/sdram_ctrl.vhd"
+vcom -explicit -93 "../src/ddr_phy_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_ctrl_top.vhd"
+vcom -explicit -93 "../src/mt46v16m16.vhd"
+vcom -explicit -93 "../src/tb_sdr_ctrl_fifo.vhd"
+
+#restart -force
+vsim -t 1ps -lib work tb_sdr_ctrl_fifo
+do {tb_sdr_ctrl_fifo.wdo}
+view wave
+view structure
+view signals
+run 20us
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_fifo.wdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_fifo.wdo
new file mode 100644
index 0000000..4088038
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_fifo.wdo
@@ -0,0 +1,68 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/clk_out
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/rst_out
+add wave -noupdate -format Literal /tb_sdr_ctrl_fifo/inst_sdram_ctrl/inst_sdram_cmd/st_sdr
+add wave -noupdate -format Literal /tb_sdr_ctrl_fifo/inst_sdram_ctrl/inst_sdram_cmd/cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_sdram_ctrl/inst_sdram_cmd/cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_sdram_ctrl/sd_cas_n
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_sdram_ctrl/sd_cs_n
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_sdram_ctrl/sd_ras_n
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_sdram_ctrl/sd_we_n
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/inst_sdram_ctrl/sd_addr
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/inst_sdram_ctrl/sd_data
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/u_addr
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/u_busy
+add wave -noupdate -format Literal /tb_sdr_ctrl_fifo/u_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/u_cmd_we
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/u_data_r
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/u_data_vld
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/u_data_w
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/u_req_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/u_req_rd
+add wave -noupdate -divider {Read FIFO}
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/read_fifo_empty
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/read_fifo_we
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/read_fifo_re
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/read_fifo_dout
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_read_fifo/inst_sync_fifo_ctrl/was_write
+add wave -noupdate -format Literal -radix unsigned /tb_sdr_ctrl_fifo/inst_read_fifo/inst_sync_fifo_ctrl/pr
+add wave -noupdate -format Literal -radix unsigned /tb_sdr_ctrl_fifo/inst_read_fifo/inst_sync_fifo_ctrl/pr_next
+add wave -noupdate -format Literal -radix unsigned /tb_sdr_ctrl_fifo/inst_read_fifo/inst_sync_fifo_ctrl/pw
+add wave -noupdate -format Literal -radix unsigned /tb_sdr_ctrl_fifo/inst_read_fifo/inst_sync_fifo_ctrl/pw_next
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_read_fifo/inst_sync_fifo_ctrl/fifo_full
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_read_fifo/inst_sync_fifo_ctrl/fifo_empty
+add wave -noupdate -divider {Write FIFO}
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/inst_write_fifo/data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/inst_write_fifo/data_w
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_write_fifo/we
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_write_fifo/re
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_write_fifo/fifo_empty
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_write_fifo/fifo_full
+add wave -noupdate -format Literal -radix unsigned /tb_sdr_ctrl_fifo/inst_write_fifo/inst_sync_fifo_ctrl/pr
+add wave -noupdate -format Literal -radix unsigned /tb_sdr_ctrl_fifo/inst_write_fifo/inst_sync_fifo_ctrl/pr_next
+add wave -noupdate -format Literal -radix unsigned /tb_sdr_ctrl_fifo/inst_write_fifo/inst_sync_fifo_ctrl/pw
+add wave -noupdate -format Literal -radix unsigned /tb_sdr_ctrl_fifo/inst_write_fifo/inst_sync_fifo_ctrl/pw_next
+add wave -noupdate -divider {Command FIFO}
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/inst_command_fifo/data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl_fifo/inst_command_fifo/data_w
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_command_fifo/we
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_command_fifo/re
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_command_fifo/inst_sync_fifo_ctrl/fifo_empty
+add wave -noupdate -format Logic /tb_sdr_ctrl_fifo/inst_command_fifo/inst_sync_fifo_ctrl/fifo_full
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 4} {13893123 ps} 0}
+configure wave -namecolwidth 172
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {13879998 ps} {13928553 ps}
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_r_rand_w.fdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_r_rand_w.fdo
new file mode 100644
index 0000000..eee9b52
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_r_rand_w.fdo
@@ -0,0 +1,27 @@
+## NOTE: Do not edit this file.
+##
+
+vlib work
+vcom -explicit -93 "../../../FIFO/src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../../../misc/dpram_1w2r.vhd"
+vcom -explicit -93 "../../../FIFO/src/sync_fifo_ctrl.vhd"
+vcom -explicit -93 "../../../misc/utils_pkg.vhd"
+vcom -explicit -93 "../src/fifo_sync.vhd"
+vcom -explicit -93 "../src/sdram_config.vhd"
+vcom -explicit -93 "../src/sdram_types.vhd"
+vcom -explicit -93 "../src/reset_virtex4.vhd"
+vcom -explicit -93 "../src/clockgen_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_cmd.vhd"
+vcom -explicit -93 "../src/sdram_ctrl.vhd"
+vcom -explicit -93 "../src/ddr_phy_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_ctrl_top.vhd"
+vcom -explicit -93 "../src/mt46v16m16.vhd"
+vcom -explicit -93 "../src/tb_sdr_ctrl_lin_r_rand_w.vhd"
+
+#restart -force
+vsim -t 1ps -lib work tb_sdr_ctrl
+do {tb_sdr_ctrl_lin_r_rand_w.wdo}
+view wave
+view structure
+view signals
+run 1200us
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_r_rand_w.wdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_r_rand_w.wdo
new file mode 100644
index 0000000..542c24b
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_r_rand_w.wdo
@@ -0,0 +1,87 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_sdram_cmd/burst_finished
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_in
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_rd
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_fb
+add wave -noupdate -format Analog-Step -height 50 -offset 0.5 -scale 20.0 /tb_sdr_ctrl/efficiency
+add wave -noupdate -format Literal /tb_sdr_ctrl/data_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/cycle_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_we_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cs_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_ras_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cas_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cke
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_zen
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_rst
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_drive
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive270
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Logic /tb_sdr_ctrl/rw_null_en
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_in
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_rd
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_wr
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_en
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_busy
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_data_vld
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/sys_clk0
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/ref_data
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 4} {21813900 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {21725359 ps} {22204052 ps}
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_w_rand_r.fdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_w_rand_r.fdo
new file mode 100644
index 0000000..4716a01
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_w_rand_r.fdo
@@ -0,0 +1,27 @@
+## NOTE: Do not edit this file.
+##
+
+vlib work
+vcom -explicit -93 "../../../FIFO/src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../../../misc/dpram_1w2r.vhd"
+vcom -explicit -93 "../../../FIFO/src/sync_fifo_ctrl.vhd"
+vcom -explicit -93 "../../../misc/utils_pkg.vhd"
+vcom -explicit -93 "../src/fifo_sync.vhd"
+vcom -explicit -93 "../src/sdram_config.vhd"
+vcom -explicit -93 "../src/sdram_types.vhd"
+vcom -explicit -93 "../src/reset_virtex4.vhd"
+vcom -explicit -93 "../src/clockgen_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_cmd.vhd"
+vcom -explicit -93 "../src/sdram_ctrl.vhd"
+vcom -explicit -93 "../src/ddr_phy_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_ctrl_top.vhd"
+vcom -explicit -93 "../src/mt46v16m16.vhd"
+vcom -explicit -93 "../src/tb_sdr_ctrl_lin_w_rand_r.vhd"
+
+#restart -force
+vsim -t 1ps -lib work tb_sdr_ctrl
+do {tb_sdr_ctrl_lin_w_rand_r.wdo}
+view wave
+view structure
+view signals
+run 1200us
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_w_rand_r.wdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_w_rand_r.wdo
new file mode 100644
index 0000000..542c24b
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_lin_w_rand_r.wdo
@@ -0,0 +1,87 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_sdram_cmd/burst_finished
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_in
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_rd
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_fb
+add wave -noupdate -format Analog-Step -height 50 -offset 0.5 -scale 20.0 /tb_sdr_ctrl/efficiency
+add wave -noupdate -format Literal /tb_sdr_ctrl/data_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/cycle_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_we_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cs_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_ras_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cas_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cke
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_zen
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_rst
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_drive
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive270
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Logic /tb_sdr_ctrl/rw_null_en
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_in
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_rd
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_wr
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_en
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_busy
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_data_vld
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/sys_clk0
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/ref_data
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 4} {21813900 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {21725359 ps} {22204052 ps}
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_addr.fdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_addr.fdo
new file mode 100644
index 0000000..9be2261
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_addr.fdo
@@ -0,0 +1,27 @@
+## NOTE: Do not edit this file.
+##
+
+vlib work
+vcom -explicit -93 "../../../FIFO/src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../../../misc/dpram_1w2r.vhd"
+vcom -explicit -93 "../../../FIFO/src/sync_fifo_ctrl.vhd"
+vcom -explicit -93 "../../../misc/utils_pkg.vhd"
+vcom -explicit -93 "../src/fifo_sync.vhd"
+vcom -explicit -93 "../src/sdram_config.vhd"
+vcom -explicit -93 "../src/sdram_types.vhd"
+vcom -explicit -93 "../src/reset_virtex4.vhd"
+vcom -explicit -93 "../src/clockgen_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_cmd.vhd"
+vcom -explicit -93 "../src/sdram_ctrl.vhd"
+vcom -explicit -93 "../src/ddr_phy_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_ctrl_top.vhd"
+vcom -explicit -93 "../src/mt46v16m16.vhd"
+vcom -explicit -93 "../src/tb_sdr_ctrl_rand_addr.vhd"
+
+#restart -force
+vsim -t 1ps -lib work tb_sdr_ctrl
+do {tb_sdr_ctrl_rand_rw.wdo}
+view wave
+view structure
+view signals
+run 1000us
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_addr.wdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_addr.wdo
new file mode 100644
index 0000000..eb20b08
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_addr.wdo
@@ -0,0 +1,82 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_sdram_cmd/burst_finished
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_in
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_rd
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_fb
+add wave -noupdate -format Analog-Step -height 50 -offset 0.5 -scale 20.0 /tb_sdr_ctrl/efficiency
+add wave -noupdate -format Literal /tb_sdr_ctrl/data_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/cycle_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_we_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cs_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_ras_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cas_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cke
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_zen
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_rst
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_drive
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive270
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_en
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_busy
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_data_vld
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/sys_clk0
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/ref_data
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 4} {60573747 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {60552548 ps} {60600861 ps}
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_rw.fdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_rw.fdo
new file mode 100644
index 0000000..c868866
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_rw.fdo
@@ -0,0 +1,27 @@
+## NOTE: Do not edit this file.
+##
+
+vlib work
+vcom -explicit -93 "../../../FIFO/src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../../../misc/dpram_1w2r.vhd"
+vcom -explicit -93 "../../../FIFO/src/sync_fifo_ctrl.vhd"
+vcom -explicit -93 "../../../misc/utils_pkg.vhd"
+vcom -explicit -93 "../src/fifo_sync.vhd"
+vcom -explicit -93 "../src/sdram_config.vhd"
+vcom -explicit -93 "../src/sdram_types.vhd"
+vcom -explicit -93 "../src/reset_virtex4.vhd"
+vcom -explicit -93 "../src/clockgen_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_cmd.vhd"
+vcom -explicit -93 "../src/sdram_ctrl.vhd"
+vcom -explicit -93 "../src/ddr_phy_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_ctrl_top.vhd"
+vcom -explicit -93 "../src/mt46v16m16.vhd"
+vcom -explicit -93 "../src/tb_sdr_ctrl_rand_rw.vhd"
+
+#restart -force
+vsim -t 1ps -lib work tb_sdr_ctrl
+do {tb_sdr_ctrl_rand_rw.wdo}
+view wave
+view structure
+view signals
+run 10000us
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_rw.wdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_rw.wdo
new file mode 100644
index 0000000..e3087e6
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdr_ctrl_rand_rw.wdo
@@ -0,0 +1,84 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_sdram_cmd/burst_finished
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_in
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_wr
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_tag_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst
+add wave -noupdate -format Logic /tb_sdr_ctrl/rst_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_fb
+add wave -noupdate -format Analog-Step -height 50 -offset 0.5 -scale 20.0 /tb_sdr_ctrl/efficiency
+add wave -noupdate -format Literal /tb_sdr_ctrl/data_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/cycle_cnt
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_we_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cs_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_ras_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cas_n
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_cke
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_zen
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_rst
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_p
+add wave -noupdate -format Logic /tb_sdr_ctrl/part_clk_n
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dqs
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_addr
+add wave -noupdate -format Literal /tb_sdr_ctrl/part_ba
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/part_data
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/dqs_drive
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/drive270
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -divider {Main controller}
+add wave -noupdate -format Logic /tb_sdr_ctrl/rw_null_en
+add wave -noupdate -format Literal /tb_sdr_ctrl/test_phase
+add wave -noupdate -format Literal /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/sd_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_en
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/read_clk
+add wave -noupdate -format Logic /tb_sdr_ctrl/clk_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal /tb_sdr_ctrl/u_cmd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_cmd_we
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_busy
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_data_vld
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_rd
+add wave -noupdate -format Logic /tb_sdr_ctrl/u_req_wr
+add wave -noupdate -format Logic /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/sys_clk0
+add wave -noupdate -format Literal -expand /tb_sdr_ctrl/inst_sdram_ctrl/phy_ctrl
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/inst_sdram_ctrl/inst_ddr_phy/data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/ref_data
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_data_w
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdr_ctrl/u_addr
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 4} {16004147 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {15914249 ps} {16324366 ps}
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdram_ctrl_frontend.fdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdram_ctrl_frontend.fdo
new file mode 100644
index 0000000..dbf023a
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdram_ctrl_frontend.fdo
@@ -0,0 +1,28 @@
+## NOTE: Do not edit this file.
+##
+
+vlib work
+vcom -explicit -93 "../../../FIFO/src/fifo_ctrl_pkg.vhd"
+vcom -explicit -93 "../../../misc/dpram_1w2r.vhd"
+vcom -explicit -93 "../../../FIFO/src/sync_fifo_ctrl.vhd"
+vcom -explicit -93 "../../../misc/utils_pkg.vhd"
+vcom -explicit -93 "../src/fifo_sync.vhd"
+vcom -explicit -93 "../src/sdram_config.vhd"
+vcom -explicit -93 "../src/sdram_types.vhd"
+vcom -explicit -93 "../src/reset_virtex4.vhd"
+vcom -explicit -93 "../src/clockgen_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_cmd.vhd"
+vcom -explicit -93 "../src/sdram_ctrl.vhd"
+vcom -explicit -93 "../src/ddr_phy_virtex4.vhd"
+vcom -explicit -93 "../src/sdram_ctrl_top.vhd"
+vcom -explicit -93 "../src/sdram_ctrl_frontend.vhd"
+vcom -explicit -93 "../src/mt46v16m16.vhd"
+vcom -explicit -93 "../src/tb_sdram_ctrl_frontend.vhd"
+
+#restart -force
+vsim -t 1ps -lib work tb_sdram_ctrl_frontend
+do {tb_sdram_ctrl_frontend.wdo}
+view wave
+view structure
+view signals
+run 40us
diff --git a/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdram_ctrl_frontend.wdo b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdram_ctrl_frontend.wdo
new file mode 100644
index 0000000..565f89c
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/sim/tb_sdram_ctrl_frontend.wdo
@@ -0,0 +1,45 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdram_ctrl_frontend/addr
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/busy
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/en
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/r_wn
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdram_ctrl_frontend/din
+add wave -noupdate -format Literal /tb_sdram_ctrl_frontend/be
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdram_ctrl_frontend/dout
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/dout_vld
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdram_ctrl_frontend/dout_reg
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/clk_out
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/part_cs_n
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/part_we_n
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/part_ras_n
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/part_cas_n
+add wave -noupdate -format Literal /tb_sdram_ctrl_frontend/part_ba
+add wave -noupdate -format Literal /tb_sdram_ctrl_frontend/part_dm
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdram_ctrl_frontend/part_addr
+add wave -noupdate -format Literal -radix hexadecimal /tb_sdram_ctrl_frontend/part_data
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/inst_sdram_ctrl/inst_sdram_ctrl/u_busy
+add wave -noupdate -format Literal /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/inst_sdram_ctrl/inst_sdram_ctrl/u_cmd
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/inst_sdram_ctrl/inst_sdram_ctrl/u_cmd_we
+add wave -noupdate -format Literal /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/inst_sdram_ctrl/inst_sdram_ctrl/st_ctrl
+add wave -noupdate -format Literal /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/inst_sdram_ctrl/inst_sdram_cmd/st_sdr
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/inst_sdram_ctrl/inst_sdram_ctrl/sdr_cmd_busy
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/cat_fifo_full
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/write_fifo_full
+add wave -noupdate -format Logic /tb_sdram_ctrl_frontend/inst_sdram_ctrl_frontend/read_fifo_full
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 4} {27951315 ps} 0}
+configure wave -namecolwidth 172
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {0 ps} {42 us}
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/clockgen_virtex4.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/clockgen_virtex4.vhd
new file mode 100644
index 0000000..c924c8c
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/clockgen_virtex4.vhd
@@ -0,0 +1,240 @@
+-------------------------------------------------------------------------
+-- Project: SDRAM controller
+-- This file: Clock generator (Virtex-4 specific)
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library ieee, work;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+
+Library UNISIM;
+use UNISIM.vcomponents.all;
+
+entity clockgen is
+ generic
+ (
+ read_phaseshift : integer := 0;
+ frequency_hz : integer := 100E6
+ );
+ port
+ (
+ -- Clocks and Reset
+ rst : in std_logic; -- external async reset, low active
+ clk_in : in std_logic; -- system clock (e.g. 100MHz), from board
+ clk_fb_in : in std_logic; -- feedback clock
+ read_clk0_out : out std_logic; -- Clock for DDR-SDRAM data capture, dcm#1 output 0°
+ read_clk270_out : out std_logic; -- Clock for DDR-SDRAM data capture, dcm#1 output 270°
+ sys_clk0_out : out std_logic; -- System clock, dcm#0 output 0°
+ sys_clk270_out : out std_logic; -- System clock, dcm#0 output 270°
+ locked_out : out std_logic; -- DCM locked status
+ error_out : out std_logic -- indicates DCM Errors
+ );
+
+end;
+
+architecture tech of clockgen is
+
+ constant CLKIN_PER : real := real(1000E6/frequency_hz);
+
+ signal locked : unsigned(1 downto 0);
+ signal dcm_rst : unsigned(1 downto 0);
+ signal read_clk0 : std_logic;
+ signal read_clk270 : std_logic;
+ signal read_clk0_bufg : std_logic;
+ signal read_clk270_bufg : std_logic;
+ signal sys_clk0 : std_logic;
+ signal sys_clk270 : std_logic;
+ signal sys_clk0_bufg : std_logic;
+ signal sys_clk270_bufg : std_logic;
+ signal dcm1_locked, dcm2_locked : unsigned(2 downto 0);
+ signal cnt_q : unsigned(4 downto 0);
+
+ type STATE_TYPE is (s0, s1, s2, s3, s4);
+ signal state_q : STATE_TYPE;
+
+begin
+
+ read_clk0_out <= read_clk0_bufg;
+ read_clk270_out <= read_clk270_bufg;
+ sys_clk0_out <= sys_clk0_bufg;
+ sys_clk270_out <= sys_clk270_bufg;
+
+bufg11: bufg
+ port map
+ (
+ o => sys_clk0_bufg,
+ i => sys_clk0
+ );
+
+bufg12: bufg
+ port map (
+ o => sys_clk270_bufg,
+ i => sys_clk270
+ );
+
+bufg13: bufg
+ port map
+ (
+ o => read_clk0_bufg,
+ i => read_clk0
+ );
+
+bufg14: bufg
+ port map (
+ o => read_clk270_bufg,
+ i => read_clk270
+ );
+
+ -------------------------------------------------------------------------------------------------------
+ -- Clock generation
+ -------------------------------------------------------------------------------------------------------
+
+inst_DCM_BASE_0 : DCM_BASE
+ generic map (
+ CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
+ -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
+ CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32
+ CLKFX_MULTIPLY => 4, -- Can be any integer from 2 to 32
+ CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature
+ CLKIN_PERIOD => CLKIN_PER, -- Specify period of input clock in ns from 1.25 to 1000.00
+ CLKOUT_PHASE_SHIFT => "FIXED", -- Specify phase shift mode of NONE or FIXED
+ CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE or 1X
+ DCM_AUTOCALIBRATION => TRUE, -- DCM calibrartion circuitry TRUE/FALSE
+ DCM_PERFORMANCE_MODE => "MAX_SPEED", -- Can be MAX_SPEED or MAX_RANGE
+ DESKEW_ADJUST => "SOURCE_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
+ -- an integer from 0 to 15
+ DFS_FREQUENCY_MODE => "LOW", -- LOW or HIGH frequency mode for frequency synthesis
+ DLL_FREQUENCY_MODE => "LOW", -- LOW, HIGH, or HIGH_SER frequency mode for DLL
+ DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE
+ FACTORY_JF => X"F0F0", -- FACTORY JF Values Suggested to be set to X"F0F0"
+ PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 1023
+ STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE
+ port map (
+ CLK0 => sys_clk0, -- 0 degree DCM CLK ouptput
+ CLK180 => open, -- 180 degree DCM CLK output
+ CLK270 => sys_clk270, -- 270 degree DCM CLK output
+ CLK2X => open, -- 2X DCM CLK output
+ CLK2X180 => open, -- 2X, 180 degree DCM CLK out
+ CLK90 => open, -- 90 degree DCM CLK output
+ CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE)
+ CLKFX => open, -- DCM CLK synthesis out (M/D)
+ CLKFX180 => open, -- 180 degree CLK synthesis out
+ LOCKED => locked(0), -- DCM LOCK status output
+ CLKFB => clk_fb_in, -- DCM clock feedback
+ CLKIN => clk_in, -- Clock input (from IBUFG, BUFG or DCM)
+ RST => dcm_rst(0) -- DCM asynchronous reset input
+ );
+
+ inst_DCM_BASE_1 : DCM_BASE
+ generic map (
+ CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
+ -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
+ CLKFX_DIVIDE => 1, -- Can be any interger from 1 to 32
+ CLKFX_MULTIPLY => 4, -- Can be any integer from 2 to 32
+ CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature
+ CLKIN_PERIOD => CLKIN_PER, -- Specify period of input clock in ns from 1.25 to 1000.00
+ CLKOUT_PHASE_SHIFT => "FIXED", -- Specify phase shift mode of NONE or FIXED
+ CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE or 1X
+ DCM_AUTOCALIBRATION => TRUE, -- DCM calibrartion circuitry TRUE/FALSE
+ DCM_PERFORMANCE_MODE => "MAX_SPEED", -- Can be MAX_SPEED or MAX_RANGE
+ DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
+ -- an integer from 0 to 15
+ DFS_FREQUENCY_MODE => "LOW", -- LOW or HIGH frequency mode for frequency synthesis
+ DLL_FREQUENCY_MODE => "LOW", -- LOW, HIGH, or HIGH_SER frequency mode for DLL
+ DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE
+ FACTORY_JF => X"F0F0", -- FACTORY JF Values Suggested to be set to X"F0F0"
+ PHASE_SHIFT => read_phaseshift, -- Amount of fixed phase shift from -255 to 1023
+ STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE
+ port map (
+ CLK0 => read_clk0, -- 0 degree DCM CLK ouptput
+ CLK180 => open, -- 180 degree DCM CLK output
+ CLK270 => read_clk270, -- 270 degree DCM CLK output
+ CLK2X => open, -- 2X DCM CLK output
+ CLK2X180 => open, -- 2X, 180 degree DCM CLK out
+ CLK90 => open, -- 90 degree DCM CLK output
+ CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE)
+ CLKFX => open, -- DCM CLK synthesis out (M/D)
+ CLKFX180 => open, -- 180 degree CLK synthesis out
+ LOCKED => locked(1), -- DCM LOCK status output
+ CLKFB => read_clk0_bufg, -- DCM clock feedback
+ CLKIN => clk_fb_in, -- Clock input (from IBUFG, BUFG or DCM)
+ RST => dcm_rst(1) -- DCM asynchronous reset input
+ );
+
+ dcm_rst(1) <= not locked(0);
+
+dcm_fsm:
+ process(rst, clk_in)
+ begin
+ if rst = '1' then
+ state_q <= s0;
+ dcm_rst(0) <= '0';
+ cnt_q <= "11111";
+ error_out <= '0';
+ locked_out <= '0';
+ dcm1_locked <= (others => '0');
+ dcm2_locked <= (others => '0');
+ elsif rising_edge(clk_in) then
+ case state_q is
+ when s0 =>
+ state_q <= s1;
+
+ when s1 =>
+ cnt_q <= cnt_q - 1;
+ if cnt_q = 0 then
+ dcm_rst(0) <= '1';
+ state_q <= s2;
+ end if;
+
+ when s2 =>
+ cnt_q <= cnt_q - 1;
+ if cnt_q = 0 then
+ dcm_rst(0) <= '0';
+ state_q <= s3;
+ end if;
+
+ when s3 =>
+ if dcm1_locked(2)='1' and dcm2_locked(2)='1' then
+ state_q <= s4;
+ error_out <= '0';
+ end if;
+
+ when s4 =>
+ if dcm1_locked(2)='1' and dcm2_locked(2)='1' then
+ locked_out <= '1';
+ else
+ error_out <= '1';
+ end if;
+ end case;
+
+ -- synchronize 'dcm1_locked'
+ dcm1_locked <= dcm1_locked(1 downto 0) & locked(0);
+ dcm2_locked <= dcm2_locked(1 downto 0) & locked(1);
+
+ end if;
+ end process;
+
+end architecture tech;
+
+
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/ddr_phy_virtex4.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/ddr_phy_virtex4.vhd
new file mode 100644
index 0000000..1494c9b
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/ddr_phy_virtex4.vhd
@@ -0,0 +1,370 @@
+-------------------------------------------------------------------------
+-- Project: SDRAM controller
+-- This file: DDR physical layer (Virtex-4 specific)
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+
+Library UNISIM;
+use UNISIM.vcomponents.all;
+
+entity ddr_phy is
+ Port (
+ sys_rst : in STD_LOGIC;
+ sys_clk0 : in STD_LOGIC;
+ sys_clk270 : in STD_LOGIC;
+ u_tag_in : in user_tag_t;
+ u_tag_rd : out user_tag_t;
+ u_tag_wr : out user_tag_t;
+ read_clk : in STD_LOGIC;
+ phy_ctrl : in phy_ctrl_t;
+ part_ctrl : in part_ctrl_t;
+ sdr_data_w : in unsigned(SDR_DATA_WIDTH-1 downto 0);
+ sdr_dm : in unsigned(SDR_DM_WIDTH-1 downto 0);
+ sdr_data_r : out unsigned(SDR_DATA_WIDTH-1 downto 0);
+ sdr_data_vld : out STD_LOGIC;
+ sdr_data_req_w : out STD_LOGIC;
+ sdr_data_req_r : out STD_LOGIC;
+ part_clk_p : out STD_LOGIC;
+ part_clk_n : out STD_LOGIC;
+ part_dm : out unsigned(DDR_DM_WIDTH-1 downto 0);
+ part_dqs : inout unsigned(DDR_DQS_WIDTH-1 downto 0);
+ part_data : inout unsigned(DDR_DATA_WIDTH-1 downto 0);
+ part_ba : out unsigned(DDR_BANK_WIDTH-1 downto 0);
+ part_addr : out unsigned(DDR_ADDR_WIDTH-1 downto 0);
+ part_cs_n : out STD_LOGIC;
+ part_we_n : out STD_LOGIC;
+ part_cas_n : out STD_LOGIC;
+ part_ras_n : out STD_LOGIC;
+ part_cke : out STD_LOGIC
+ );
+end ddr_phy;
+
+architecture tech of ddr_phy is
+
+ signal dqs_drive : std_logic;
+ signal drive : std_logic;
+ signal dqs : unsigned(DDR_DQS_WIDTH-1 downto 0);
+ signal dqs_zen : unsigned(DDR_DQS_WIDTH-1 downto 0);
+ signal dqs_rst : std_logic;
+ signal ddr_data_w : unsigned(DDR_DATA_WIDTH-1 downto 0);
+ signal data_r : unsigned(SDR_DATA_WIDTH-1 downto 0);
+ signal data_reg_r : unsigned(SDR_DATA_WIDTH-1 downto 0);
+ signal drive270 : unsigned(DDR_DATA_WIDTH-1 downto 0);
+ signal part_ctrl_reg : part_ctrl_t;
+ signal we_reg : std_logic;
+ signal read_en : std_logic;
+
+ type u_tag_array_t is array (natural range 0 to 4) of user_tag_t;
+ signal u_tag_pipe : u_tag_array_t;
+
+begin
+
+------------------------------------------------------------------------------------------------------------------------------------------------
+utag_pipe:
+ process(sys_rst, sys_clk0)
+ begin
+ if rising_edge(sys_clk0) then
+ for i in u_tag_pipe'length-1 downto 1 loop
+ u_tag_pipe(i) <= u_tag_pipe(i-1);
+ end loop;
+ if phy_ctrl.utag_we = '1' then
+ u_tag_pipe(0) <= u_tag_in;
+ end if;
+ end if;
+ end process;
+
+WE_REGISTER:
+ process(sys_rst, sys_clk0)
+ begin
+ if sys_rst = '1' then
+ we_reg <= '0';
+ elsif rising_edge(sys_clk0) then
+ we_reg <= phy_ctrl.we;
+ end if;
+ end process;
+
+DATA_DRIVE_GEN:
+ process(sys_clk0)
+ begin
+ if falling_edge(sys_clk0) then
+ dqs_rst <= not we_reg;
+ drive <= we_reg;
+ end if;
+ end process;
+
+DQS_DRIVE_GEN:
+ process(sys_clk0)
+ variable p : unsigned(1 downto 0);
+ begin
+ if rising_edge(sys_clk0) then
+ if phy_ctrl.drive_en = '1' then
+ p := (others => '1');
+ else
+ p := p(p'left-1 downto 0) & '0';
+ end if;
+ end if;
+ dqs_drive <= p(p'left);
+ end process;
+
+------------------------------------------------------------------------------------------------------------------------------------------------
+-- SDRAM Clock
+ODDR_clk_p : ODDR
+ generic map
+ (
+ DDR_CLK_EDGE => "OPPOSITE_EDGE", -- "OPPOSITE_EDGE" or "SAME_EDGE"
+ INIT => '0', -- Initial value for Q port ('1' or '0')
+ SRTYPE => "SYNC" -- Reset Type ("ASYNC" or "SYNC")
+ )
+ port map (
+ Q => part_clk_p, -- 1-bit DDR output
+ C => sys_clk0, -- 1-bit clock input
+ CE => '1', -- 1-bit clock enable input
+ D1 => '1', -- 1-bit data input (positive edge)
+ D2 => '0', -- 1-bit data input (negative edge)
+ R => '0', -- 1-bit reset input
+ S => '0' -- 1-bit set input
+ );
+
+ODDR_clk_n : ODDR
+ generic map
+ (
+ DDR_CLK_EDGE => "OPPOSITE_EDGE", -- "OPPOSITE_EDGE" or "SAME_EDGE"
+ INIT => '0', -- Initial value for Q port ('1' or '0')
+ SRTYPE => "SYNC" -- Reset Type ("ASYNC" or "SYNC")
+ )
+ port map (
+ Q => part_clk_n, -- 1-bit DDR output
+ C => sys_clk0, -- 1-bit clock input
+ CE => '1', -- 1-bit clock enable input
+ D1 => '0', -- 1-bit data input (positive edge)
+ D2 => '1', -- 1-bit data input (negative edge)
+ R => '0', -- 1-bit reset input
+ S => '0' -- 1-bit set input
+ );
+
+------------------------------------------------------------------------------------------------------------------------------------------------
+-- Data OUT DDR-FFs
+gen_ddr_data_out:
+ for n in 0 to DDR_DATA_WIDTH-1 generate
+ begin
+ ODDR_data : ODDR
+ generic map
+ (
+ DDR_CLK_EDGE => "SAME_EDGE", -- "OPPOSITE_EDGE" or "SAME_EDGE"
+ INIT => '0', -- Initial value for Q port ('1' or '0')
+ SRTYPE => "SYNC" -- Reset Type ("ASYNC" or "SYNC")
+ )
+ port map (
+ Q => ddr_data_w(n), -- 1-bit DDR output
+ C => sys_clk270, -- 1-bit clock input
+ CE => '1', -- 1-bit clock enable input
+ D1 => sdr_data_w(n + DDR_DATA_WIDTH), -- 1-bit data input (positive edge)
+ D2 => sdr_data_w(n), -- 1-bit data input (negative edge)
+ R => '0', -- 1-bit reset input
+ S => '0' -- 1-bit set input
+ );
+ end generate gen_ddr_data_out;
+
+-- Sample tristate on clock90
+ process (sys_clk270)
+ begin
+ if rising_edge(sys_clk270) then
+ for n in 0 to DDR_DATA_WIDTH-1 loop
+ drive270(n) <= drive;
+ end loop;
+ end if;
+ end process;
+
+-- Output mux
+out_mux_data:
+ for n in 0 to DDR_DATA_WIDTH-1 generate
+ part_data(n) <= ddr_data_w(n) when drive270(n) = '1' else 'Z';
+ end generate;
+
+------------------------------------------------------------------------------------------------------------------------------------------------
+-- Data-mask OUT DDR-FFs
+gen_ddr_dm_out:
+ for n in 0 to DDR_DM_WIDTH-1 generate
+ begin
+ ODDR_dm : ODDR
+ generic map
+ (
+ DDR_CLK_EDGE => "SAME_EDGE", -- "OPPOSITE_EDGE" or "SAME_EDGE"
+ INIT => '0', -- Initial value for Q port ('1' or '0')
+ SRTYPE => "SYNC" -- Reset Type ("ASYNC" or "SYNC")
+ )
+ port map (
+ Q => part_dm(n), -- 1-bit DDR output
+ C => sys_clk270, -- 1-bit clock input
+ CE => '1', -- 1-bit clock enable input
+ D1 => sdr_dm(n + DDR_DM_WIDTH), -- 1-bit data input (positive edge)
+ D2 => sdr_dm(n), -- 1-bit data input (negative edge)
+ R => '0', -- 1-bit reset input
+ S => '0' -- 1-bit set input
+ );
+ end generate gen_ddr_dm_out;
+
+------------------------------------------------------------------------------------------------------------------------------------------------
+-- DQS OUT DDR-FFs
+gen_dqs_out:
+ for n in 0 to DDR_DQS_WIDTH-1 generate
+ begin
+ ODDR_dqs : ODDR
+ generic map
+ (
+ DDR_CLK_EDGE => "OPPOSITE_EDGE", -- "OPPOSITE_EDGE" or "SAME_EDGE"
+ INIT => '0', -- Initial value for Q port ('1' or '0')
+ SRTYPE => "SYNC" -- Reset Type ("ASYNC" or "SYNC")
+ )
+ port map (
+ Q => dqs(n), -- 1-bit DDR output
+ C => sys_clk0, -- 1-bit clock input
+ CE => '1', -- 1-bit clock enable input
+ D2 => '0', -- 1-bit data input (positive edge)
+ D1 => '1', -- 1-bit data input (negative edge)
+ R => dqs_rst, -- 1-bit reset input
+ S => '0' -- 1-bit set input
+ );
+ end generate gen_dqs_out;
+
+-- Tristate-Control fuer dqs
+ process (sys_clk0) is
+ variable zctrl : boolean;
+ begin
+ if rising_edge(sys_clk0) then
+ if dqs_drive = '1' then
+ zctrl := false;
+ else
+ zctrl := true;
+ end if;
+ if zctrl then
+ dqs_zen <= (others => '1');
+ else
+ dqs_zen <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+-- Tristate-Buffer fuer dqs
+gen_out_mux_dqs:
+ for n in 0 to DDR_DQS_WIDTH-1 generate
+ part_dqs(n) <= 'Z' when dqs_zen(n)='1' else dqs(n);
+ end generate gen_out_mux_dqs;
+
+------------------------------------------------------------------------------------------------------------------------------------------------
+ process (sys_rst, sys_clk0) is
+ begin
+ if sys_rst = '1' then
+ part_ctrl_reg.cmd <= COMMAND(SD_DESELECT);
+ part_ctrl_reg.ba <= (others=>'0');
+ part_ctrl_reg.addr <= (others=>'0');
+ part_ctrl_reg.cke <= '0';
+ elsif rising_edge(sys_clk0) then
+ part_ctrl_reg <= part_ctrl;
+ end if;
+ end process;
+
+ process (sys_clk0) is
+ begin
+ if falling_edge(sys_clk0) then
+ part_ras_n <= part_ctrl_reg.cmd.ras_n;
+ part_cas_n <= part_ctrl_reg.cmd.cas_n;
+ part_we_n <= part_ctrl_reg.cmd.we_n;
+ part_cs_n <= part_ctrl_reg.cmd.cs_n;
+ part_ba <= part_ctrl_reg.ba;
+ part_addr <= part_ctrl_reg.addr;
+ part_cke <= part_ctrl_reg.cke;
+ end if;
+ end process;
+
+-----------------------------------------------------------------
+-- READ DATA Processing
+-----------------------------------------------------------------
+gen_ddr_data_in:
+ for n in 0 to DDR_DATA_WIDTH-1 generate
+ begin
+ IDDR_data : IDDR
+ generic map
+ (
+ DDR_CLK_EDGE => "SAME_EDGE", -- "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
+ INIT_Q1 => '0', -- Initial value of Q1: '0' or '1'
+ INIT_Q2 => '0', -- Initial value of Q2: '0' or '1'
+ SRTYPE => "SYNC" -- Set/Reset type: "SYNC" or "ASYNC"
+ )
+ port map
+ (
+ Q1 => data_r(n), -- 1-bit output for positive edge of clock
+ Q2 => data_r(n + DDR_DATA_WIDTH), -- 1-bit output for negative edge of clock
+ C => read_clk, -- 1-bit clock input
+ CE => read_en, -- 1-bit clock enable input
+ D => part_data(n), -- 1-bit DDR data input
+ R => '0', -- 1-bit reset
+ S => '0' -- 1-bit set
+ );
+ end generate;
+
+
+data_sample_stage:
+ process (sys_clk0)
+ begin
+ if falling_edge(sys_clk0) then
+ data_reg_r <= data_r;
+ end if;
+ end process;
+
+misc_flags_and_data_out:
+ process (sys_rst, sys_clk0)
+ variable p : unsigned(3 downto 0);
+ begin
+ if sys_rst = '1' then
+ p := (others => '0');
+ read_en <= '0';
+ sdr_data_vld <= '0';
+ sdr_data_req_w <= '0';
+ sdr_data_req_r <= '0';
+ elsif rising_edge(sys_clk0) then
+ sdr_data_r <= data_reg_r;
+ if p(3) = '1' then
+ u_tag_rd <= u_tag_pipe(4);
+ end if;
+ if phy_ctrl.we = '1' then
+ u_tag_wr <= u_tag_pipe(0);
+ end if;
+ sdr_data_req_w <= phy_ctrl.we;
+ sdr_data_req_r <= phy_ctrl.re;
+ sdr_data_vld <= p(3);
+ read_en <= p(1);
+ if phy_ctrl.re = '1' then
+ p := p(p'left-1 downto 0) & '1';
+ else
+ p := p(p'left-1 downto 0) & '0';
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+end tech;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/fifo_sync.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/fifo_sync.vhd
new file mode 100644
index 0000000..79ce51f
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/fifo_sync.vhd
@@ -0,0 +1,111 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: Dual-ported register file with asynchrous read
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+use work.fifo_ctrl_pkg.all;
+
+entity fifo_sync is
+ Generic (
+ addr_width : natural := 4;
+ data_width : natural := 8;
+ almost_full_thresh : integer := 12;
+ almost_empty_thresh : integer := 4
+ );
+ Port
+ (
+ rst : in STD_LOGIC;
+ clk : in STD_LOGIC;
+ we : in STD_LOGIC;
+ re : in STD_LOGIC;
+ fifo_full : out STD_LOGIC;
+ fifo_empty : out STD_LOGIC;
+ fifo_afull : out STD_LOGIC;
+ fifo_aempty : out STD_LOGIC;
+ data_w : in unsigned (data_width-1 downto 0);
+ data_r : out unsigned (data_width-1 downto 0)
+ );
+end fifo_sync;
+
+architecture Behavioral of fifo_sync is
+
+ signal mem_we : STD_LOGIC;
+ signal ptr_w : unsigned (addr_width-1 downto 0);
+ signal ptr_r : unsigned (addr_width-1 downto 0);
+ signal full : STD_LOGIC;
+ signal empty : STD_LOGIC;
+ signal almost_full : STD_LOGIC;
+ signal almost_empty : STD_LOGIC;
+
+begin
+
+ mem_we <= we;
+ fifo_full <= full;
+ fifo_empty <= empty;
+ fifo_afull <= almost_full;
+ fifo_aempty <= almost_empty;
+
+ inst_sync_fifo_ctrl: entity work.sync_fifo_ctrl
+ GENERIC MAP
+ (
+ addr_width => addr_width,
+ almost_full_thresh => almost_full_thresh,
+ almost_empty_thresh => almost_empty_thresh
+ )
+ PORT MAP
+ (
+ rst => rst,
+ clk => clk,
+ we => we,
+ re => re,
+ ptr_w => ptr_w,
+ ptr_r => ptr_r,
+ fifo_full => full,
+ fifo_empty => empty,
+ fifo_afull => almost_full,
+ fifo_aempty => almost_empty
+
+ );
+
+ inst_dpram_1w1r: entity work.dpram_1w1r_dist
+ GENERIC MAP (
+ addr_width => addr_width,
+ data_width => data_width
+ )
+ PORT MAP(
+ clka => clk,
+ clkb => clk,
+ en_a => '1',
+ en_b => '1',
+ we_a => mem_we,
+ addr_a => ptr_w,
+ addr_b => ptr_r,
+ din_a => data_w,
+ dout_b => data_r
+ );
+
+end Behavioral;
+
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/mt46v16m16.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/mt46v16m16.vhd
new file mode 100644
index 0000000..356bb28
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/mt46v16m16.vhd
@@ -0,0 +1,1320 @@
+-----------------------------------------------------------------------------------------
+--
+-- File Name: MT46V16M16.VHD
+-- Version: 2.1
+-- Date: January 14th, 2002
+-- Model: Behavioral
+-- Simulator: NCDesktop - http://www.cadence.com
+-- ModelSim PE - http://www.model.com
+--
+-- Dependencies: None
+--
+-- Author: Son P. Huynh
+-- Email: sphuynh@micron.com
+-- Phone: (208) 368-3825
+-- Company: Micron Technology, Inc.
+-- Part Number: MT46V16M16 (4 Mb x 16 x 4 Banks)
+--
+-- Description: Micron 256 Mb SDRAM DDR (Double Data Rate)
+--
+-- Limitation: Doesn't model internal refresh counter
+--
+-- Note:
+--
+-- Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY
+-- WHATSOEVER AND MICRON SPECIFICALLY DISCLAIMS ANY
+-- IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
+-- A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT.
+--
+-- Copyright (c) 1998 Micron Semiconductor Products, Inc.
+-- All rights researved
+--
+-- Rev Author Date Changes
+-- --- ---------------------------- ---------- -------------------------------------
+-- 2.1 Son P. Huynh 01/14/2002 - Fix Burst_counter
+-- Micron Technology, Inc.
+--
+-- 2.0 Son P. Huynh 11/08/2001 - Second release
+-- Micron Technology, Inc. - Rewrote and remove SHARED VARIABLE
+--
+-----------------------------------------------------------------------------------------
+
+LIBRARY IEEE;
+ USE IEEE.STD_LOGIC_1164.ALL;
+ USE IEEE.STD_LOGIC_UNSIGNED.ALL;
+ USE IEEE.STD_LOGIC_ARITH.ALL;
+
+ENTITY MT46V16M16 IS
+ GENERIC ( -- Timing for -75Z CL2
+ tCK : TIME := 7.500 ns;
+ tCH : TIME := 3.375 ns; -- 0.45*tCK
+ tCL : TIME := 3.375 ns; -- 0.45*tCK
+ tDH : TIME := 0.500 ns;
+ tDS : TIME := 0.500 ns;
+ tIH : TIME := 0.900 ns;
+ tIS : TIME := 0.900 ns;
+ tMRD : TIME := 15.000 ns;
+ tRAS : TIME := 40.000 ns;
+ tRAP : TIME := 20.000 ns;
+ tRC : TIME := 65.000 ns;
+ tRFC : TIME := 75.000 ns;
+ tRCD : TIME := 20.000 ns;
+ tRP : TIME := 20.000 ns;
+ tRRD : TIME := 15.000 ns;
+ tWR : TIME := 15.000 ns;
+ addr_bits : INTEGER := 13;
+ data_bits : INTEGER := 16;
+ cols_bits : INTEGER := 9
+ );
+ PORT (
+ Dq : INOUT STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');
+ Dqs : INOUT STD_LOGIC_VECTOR (1 DOWNTO 0) := "ZZ";
+ Addr : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ Ba : IN STD_LOGIC_VECTOR (1 DOWNTO 0);
+ Clk : IN STD_LOGIC;
+ Clk_n : IN STD_LOGIC;
+ Cke : IN STD_LOGIC;
+ Cs_n : IN STD_LOGIC;
+ Ras_n : IN STD_LOGIC;
+ Cas_n : IN STD_LOGIC;
+ We_n : IN STD_LOGIC;
+ Dm : IN STD_LOGIC_VECTOR (1 DOWNTO 0)
+ );
+END MT46V16M16;
+
+ARCHITECTURE behave OF MT46V16M16 IS
+ -- Array for Read pipeline
+ TYPE Array_Read_cmnd IS ARRAY (8 DOWNTO 0) OF STD_LOGIC;
+ TYPE Array_Read_bank IS ARRAY (8 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0);
+ TYPE Array_Read_cols IS ARRAY (8 DOWNTO 0) OF STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0);
+
+ -- Array for Write pipeline
+ TYPE Array_Write_cmnd IS ARRAY (2 DOWNTO 0) OF STD_LOGIC;
+ TYPE Array_Write_bank IS ARRAY (2 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0);
+ TYPE Array_Write_cols IS ARRAY (2 DOWNTO 0) OF STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0);
+
+ -- Array for Auto Precharge
+ TYPE Array_Read_precharge IS ARRAY (3 DOWNTO 0) OF STD_LOGIC;
+ TYPE Array_Write_precharge IS ARRAY (3 DOWNTO 0) OF STD_LOGIC;
+ TYPE Array_Count_precharge IS ARRAY (3 DOWNTO 0) OF INTEGER;
+
+ -- Array for Manual Precharge
+ TYPE Array_A10_precharge IS ARRAY (8 DOWNTO 0) OF STD_LOGIC;
+ TYPE Array_Bank_precharge IS ARRAY (8 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0);
+ TYPE Array_Cmnd_precharge IS ARRAY (8 DOWNTO 0) OF STD_LOGIC;
+
+ -- Array for Burst Terminate
+ TYPE Array_Cmnd_bst IS ARRAY (8 DOWNTO 0) OF STD_LOGIC;
+
+ -- Array for Memory Access
+ TYPE Array_ram_type IS ARRAY (2**cols_bits - 1 DOWNTO 0) OF STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0);
+ TYPE Array_ram_pntr IS ACCESS Array_ram_type;
+ TYPE Array_ram_stor IS ARRAY (2**addr_bits - 1 DOWNTO 0) OF Array_ram_pntr;
+
+ -- Data pair
+ SIGNAL Dq_pair : STD_LOGIC_VECTOR (2 * data_bits - 1 DOWNTO 0);
+ SIGNAL Dm_pair : STD_LOGIC_VECTOR (3 DOWNTO 0);
+
+ -- Mode Register
+ SIGNAL Mode_reg : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0');
+
+ -- Command Decode Variables
+ SIGNAL Active_enable, Aref_enable, Burst_term, Ext_mode_enable : STD_LOGIC := '0';
+ SIGNAL Mode_reg_enable, Prech_enable, Read_enable, Write_enable : STD_LOGIC := '0';
+
+ -- Burst Length Decode Variables
+ SIGNAL Burst_length_2, Burst_length_4, Burst_length_8, Burst_length_f : STD_LOGIC := '0';
+
+ -- Cas Latency Decode Variables
+ SIGNAL Cas_latency_15, Cas_latency_2, Cas_latency_25, Cas_latency_3, Cas_latency_4 : STD_LOGIC := '0';
+
+ -- Internal Control Signals
+ SIGNAL Cs_in, Ras_in, Cas_in, We_in : STD_LOGIC := '0';
+
+ -- System Clock
+ SIGNAL Sys_clk : STD_LOGIC := '0';
+
+ -- Dqs buffer
+ SIGNAL Dqs_out : STD_LOGIC_VECTOR (1 DOWNTO 0) := "ZZ";
+
+BEGIN
+ -- Strip the strength
+ Cs_in <= To_X01 (Cs_n);
+ Ras_in <= To_X01 (Ras_n);
+ Cas_in <= To_X01 (Cas_n);
+ We_in <= To_X01 (We_n);
+
+ -- Commands Decode
+ Active_enable <= NOT(Cs_in) AND NOT(Ras_in) AND Cas_in AND We_in;
+ Aref_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND We_in;
+ Burst_term <= NOT(Cs_in) AND Ras_in AND Cas_in AND NOT(We_in);
+ Ext_mode_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND NOT(We_in) AND Ba(0) AND NOT(Ba(1));
+ Mode_reg_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND NOT(We_in) AND NOT(Ba(0)) AND NOT(Ba(1));
+ Prech_enable <= NOT(Cs_in) AND NOT(Ras_in) AND Cas_in AND NOT(We_in);
+ Read_enable <= NOT(Cs_in) AND Ras_in AND NOT(Cas_in) AND We_in;
+ Write_enable <= NOT(Cs_in) AND Ras_in AND NOT(Cas_in) AND NOT(We_in);
+
+ -- Burst Length Decode
+ Burst_length_2 <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND Mode_reg(0);
+ Burst_length_4 <= NOT(Mode_reg(2)) AND Mode_reg(1) AND NOT(Mode_reg(0));
+ Burst_length_8 <= NOT(Mode_reg(2)) AND Mode_reg(1) AND Mode_reg(0);
+ Burst_length_f <= (Mode_reg(2)) AND Mode_reg(1) AND Mode_reg(0);
+
+ -- CAS Latency Decode
+ Cas_latency_15 <= Mode_reg(6) AND NOT(Mode_reg(5)) AND (Mode_reg(4));
+ Cas_latency_2 <= NOT(Mode_reg(6)) AND Mode_reg(5) AND NOT(Mode_reg(4));
+ Cas_latency_25 <= Mode_reg(6) AND Mode_reg(5) AND NOT(Mode_reg(4));
+ Cas_latency_3 <= NOT(Mode_reg(6)) AND Mode_reg(5) AND Mode_reg(4);
+ Cas_latency_4 <= (Mode_reg(6)) AND NOT(Mode_reg(5)) AND NOT(Mode_reg(4));
+
+ -- Dqs buffer
+ Dqs <= Dqs_out;
+
+ --
+ -- System Clock
+ --
+ int_clk : PROCESS (Clk, Clk_n)
+ VARIABLE ClkZ, CkeZ : STD_LOGIC := '0';
+ begin
+ IF Clk = '1' AND Clk_n = '0' THEN
+ ClkZ := '1';
+ CkeZ := Cke;
+ ELSIF Clk = '0' AND Clk_n = '1' THEN
+ ClkZ := '0';
+ END IF;
+ Sys_clk <= CkeZ AND ClkZ;
+ END PROCESS;
+
+ --
+ -- Main Process
+ --
+ state_register : PROCESS
+ -- Precharge Variables
+ VARIABLE Pc_b0, Pc_b1, Pc_b2, Pc_b3 : STD_LOGIC := '0';
+
+ -- Activate Variables
+ VARIABLE Act_b0, Act_b1, Act_b2, Act_b3 : STD_LOGIC := '1';
+
+ -- Data IO variables
+ VARIABLE Data_in_enable, Data_out_enable : STD_LOGIC := '0';
+
+ -- Internal address mux variables
+ VARIABLE Cols_brst : STD_LOGIC_VECTOR (2 DOWNTO 0);
+ VARIABLE Prev_bank : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00";
+ VARIABLE Bank_addr : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00";
+ VARIABLE Cols_addr : STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0);
+ VARIABLE Rows_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ VARIABLE B0_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ VARIABLE B1_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ VARIABLE B2_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+ VARIABLE B3_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0);
+
+ -- DLL Reset variables
+ VARIABLE DLL_enable : STD_LOGIC := '0';
+ VARIABLE DLL_reset : STD_LOGIC := '0';
+ VARIABLE DLL_done : STD_LOGIC := '0';
+ VARIABLE DLL_count : INTEGER := 0;
+
+ -- Timing Check
+ VARIABLE MRD_chk : TIME := 0 ns;
+ VARIABLE RFC_chk : TIME := 0 ns;
+ VARIABLE RRD_chk : TIME := 0 ns;
+ VARIABLE RAS_chk0, RAS_chk1, RAS_chk2, RAS_chk3 : TIME := 0 ns;
+ VARIABLE RAP_chk0, RAP_chk1, RAP_chk2, RAP_chk3 : TIME := 0 ns;
+ VARIABLE RC_chk0, RC_chk1, RC_chk2, RC_chk3 : TIME := 0 ns;
+ VARIABLE RCD_chk0, RCD_chk1, RCD_chk2, RCD_chk3 : TIME := 0 ns;
+ VARIABLE RP_chk0, RP_chk1, RP_chk2, RP_chk3 : TIME := 0 ns;
+ VARIABLE WR_chk0, WR_chk1, WR_chk2, WR_chk3 : TIME := 0 ns;
+
+ -- Read pipeline variables
+ VARIABLE Read_cmnd : Array_Read_cmnd;
+ VARIABLE Read_bank : Array_Read_bank;
+ VARIABLE Read_cols : Array_Read_cols;
+
+ -- Write pipeline variables
+ VARIABLE Write_cmnd : Array_Write_cmnd;
+ VARIABLE Write_bank : Array_Write_bank;
+ VARIABLE Write_cols : Array_Write_cols;
+
+ -- Auto Precharge variables
+ VARIABLE Read_precharge : Array_Read_precharge := ('0' & '0' & '0' & '0');
+ VARIABLE Write_precharge : Array_Write_precharge := ('0' & '0' & '0' & '0');
+ VARIABLE Count_precharge : Array_Count_precharge := ( 0 & 0 & 0 & 0 );
+
+ -- Manual Precharge variables
+ VARIABLE A10_precharge : Array_A10_precharge;
+ VARIABLE Bank_precharge : Array_Bank_precharge;
+ VARIABLE Cmnd_precharge : Array_Cmnd_precharge;
+
+ -- Burst Terminate variable
+ VARIABLE Cmnd_bst : Array_Cmnd_bst;
+
+ -- Memory Banks
+ VARIABLE Bank0 : Array_ram_stor;
+ VARIABLE Bank1 : Array_ram_stor;
+ VARIABLE Bank2 : Array_ram_stor;
+ VARIABLE Bank3 : Array_ram_stor;
+
+ -- Burst Counter
+ VARIABLE Burst_counter : STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0);
+
+ -- Internal Dqs initialize
+ VARIABLE Dqs_int : STD_LOGIC := '0';
+
+ -- Data buffer for DM Mask
+ VARIABLE Data_buf : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z');
+
+ --
+ -- Initialize empty rows
+ --
+ PROCEDURE Init_mem (Bank : STD_LOGIC_VECTOR; Row_index : INTEGER) IS
+ VARIABLE i, j : INTEGER := 0;
+ BEGIN
+ IF Bank = "00" THEN
+ IF Bank0 (Row_index) = NULL THEN -- Check to see if row empty
+ Bank0 (Row_index) := NEW Array_ram_type; -- Open new row for access
+ FOR i IN (2**cols_bits - 1) DOWNTO 0 LOOP -- Filled row with zeros
+ FOR j IN (data_bits - 1) DOWNTO 0 LOOP
+ Bank0 (Row_index) (i) (j) := '0';
+ END LOOP;
+ END LOOP;
+ END IF;
+ ELSIF Bank = "01" THEN
+ IF Bank1 (Row_index) = NULL THEN
+ Bank1 (Row_index) := NEW Array_ram_type;
+ FOR i IN (2**cols_bits - 1) DOWNTO 0 LOOP
+ FOR j IN (data_bits - 1) DOWNTO 0 LOOP
+ Bank1 (Row_index) (i) (j) := '0';
+ END LOOP;
+ END LOOP;
+ END IF;
+ ELSIF Bank = "10" THEN
+ IF Bank2 (Row_index) = NULL THEN
+ Bank2 (Row_index) := NEW Array_ram_type;
+ FOR i IN (2**cols_bits - 1) DOWNTO 0 LOOP
+ FOR j IN (data_bits - 1) DOWNTO 0 LOOP
+ Bank2 (Row_index) (i) (j) := '0';
+ END LOOP;
+ END LOOP;
+ END IF;
+ ELSIF Bank = "11" THEN
+ IF Bank3 (Row_index) = NULL THEN
+ Bank3 (Row_index) := NEW Array_ram_type;
+ FOR i IN (2**cols_bits - 1) DOWNTO 0 LOOP
+ FOR j IN (data_bits - 1) DOWNTO 0 LOOP
+ Bank3 (Row_index) (i) (j) := '0';
+ END LOOP;
+ END LOOP;
+ END IF;
+ END IF;
+ END;
+
+ --
+ -- Burst Counter
+ --
+ PROCEDURE Burst_decode IS
+ VARIABLE Cols_temp : STD_LOGIC_VECTOR (cols_bits - 1 DOWNTO 0) := (OTHERS => '0');
+ BEGIN
+ -- Advance burst counter
+ Burst_counter := Burst_counter + 1;
+
+ -- Burst Type
+ IF Mode_reg (3) = '0' THEN
+ Cols_temp := Cols_addr + 1;
+ ELSIF Mode_reg (3) = '1' THEN
+ Cols_temp (2) := Burst_counter (2) XOR Cols_brst (2);
+ Cols_temp (1) := Burst_counter (1) XOR Cols_brst (1);
+ Cols_temp (0) := Burst_counter (0) XOR Cols_brst (0);
+ END IF;
+
+ -- Burst Length
+ IF Burst_length_2 = '1' THEN
+ Cols_addr (0) := Cols_temp (0);
+ ELSIF Burst_length_4 = '1' THEN
+ Cols_addr (1 DOWNTO 0) := Cols_temp (1 DOWNTO 0);
+ ELSIF Burst_length_8 = '1' THEN
+ Cols_addr (2 DOWNTO 0) := Cols_temp (2 DOWNTO 0);
+ ELSE
+ Cols_addr := Cols_temp;
+ END IF;
+
+ -- Data counter
+ IF Burst_length_2 = '1' THEN
+ IF Burst_counter >= 2 THEN
+ IF Data_in_enable = '1' THEN
+ Data_in_enable := '0';
+ ELSIF Data_out_enable = '1' THEN
+ Data_out_enable := '0';
+ END IF;
+ END IF;
+ ELSIF Burst_length_4 = '1' THEN
+ IF Burst_counter >= 4 THEN
+ IF Data_in_enable = '1' THEN
+ Data_in_enable := '0';
+ ELSIF Data_out_enable = '1' THEN
+ Data_out_enable := '0';
+ END IF;
+ END IF;
+ ELSIF Burst_length_8 = '1' THEN
+ IF Burst_counter >= 8 THEN
+ IF Data_in_enable = '1' THEN
+ Data_in_enable := '0';
+ ELSIF Data_out_enable = '1' THEN
+ Data_out_enable := '0';
+ END IF;
+ END IF;
+ END IF;
+ END;
+
+ BEGIN
+ WAIT ON Sys_clk;
+
+ --
+ -- Manual Precharge Pipeline
+ --
+ IF ((Sys_clk'EVENT AND Sys_clk = '0') OR (Sys_clk'EVENT AND Sys_clk = '1')) THEN
+ -- A10 Precharge Pipeline
+ A10_precharge(0) := A10_precharge(1);
+ A10_precharge(1) := A10_precharge(2);
+ A10_precharge(2) := A10_precharge(3);
+ A10_precharge(3) := A10_precharge(4);
+ A10_precharge(4) := A10_precharge(5);
+ A10_precharge(5) := A10_precharge(6);
+ A10_precharge(6) := A10_precharge(7);
+ A10_precharge(7) := A10_precharge(8);
+ A10_precharge(8) := '0';
+
+ -- Bank Precharge Pipeline
+ Bank_precharge(0) := Bank_precharge(1);
+ Bank_precharge(1) := Bank_precharge(2);
+ Bank_precharge(2) := Bank_precharge(3);
+ Bank_precharge(3) := Bank_precharge(4);
+ Bank_precharge(4) := Bank_precharge(5);
+ Bank_precharge(5) := Bank_precharge(6);
+ Bank_precharge(6) := Bank_precharge(7);
+ Bank_precharge(7) := Bank_precharge(8);
+ Bank_precharge(8) := "00";
+
+ -- Command Precharge Pipeline
+ Cmnd_precharge(0) := Cmnd_precharge(1);
+ Cmnd_precharge(1) := Cmnd_precharge(2);
+ Cmnd_precharge(2) := Cmnd_precharge(3);
+ Cmnd_precharge(3) := Cmnd_precharge(4);
+ Cmnd_precharge(4) := Cmnd_precharge(5);
+ Cmnd_precharge(5) := Cmnd_precharge(6);
+ Cmnd_precharge(6) := Cmnd_precharge(7);
+ Cmnd_precharge(7) := Cmnd_precharge(8);
+ Cmnd_precharge(8) := '0';
+
+ -- Terminate Read if same bank or all banks
+ IF ((Cmnd_precharge (0) = '1') AND
+ (Bank_precharge (0) = Bank_addr OR A10_precharge (0) = '1') AND
+ (Data_out_enable = '1')) THEN
+ Data_out_enable := '0';
+ END IF;
+ END IF;
+
+ --
+ -- Burst Terminate Pipeline
+ --
+ IF ((Sys_clk'EVENT AND Sys_clk = '0') OR (Sys_clk'EVENT AND Sys_clk = '1')) THEN
+ -- Burst Terminate pipeline
+ Cmnd_bst (0) := Cmnd_bst (1);
+ Cmnd_bst (1) := Cmnd_bst (2);
+ Cmnd_bst (2) := Cmnd_bst (3);
+ Cmnd_bst (3) := Cmnd_bst (4);
+ Cmnd_bst (4) := Cmnd_bst (5);
+ Cmnd_bst (5) := Cmnd_bst (6);
+ Cmnd_bst (6) := Cmnd_bst (7);
+ Cmnd_bst (7) := Cmnd_bst (8);
+ Cmnd_bst (8) := '0';
+
+ -- Terminate current Read
+ IF ((Cmnd_bst (0) = '1') AND (Data_out_enable = '1')) THEN
+ Data_out_enable := '0';
+ END IF;
+ END IF;
+
+ --
+ -- Dq and Dqs Drivers
+ --
+ IF ((Sys_clk'EVENT AND Sys_clk = '0') OR (Sys_clk'EVENT AND Sys_clk = '1')) THEN
+ -- Read Command Pipeline
+ Read_cmnd (0) := Read_cmnd (1);
+ Read_cmnd (1) := Read_cmnd (2);
+ Read_cmnd (2) := Read_cmnd (3);
+ Read_cmnd (3) := Read_cmnd (4);
+ Read_cmnd (4) := Read_cmnd (5);
+ Read_cmnd (5) := Read_cmnd (6);
+ Read_cmnd (6) := Read_cmnd (7);
+ Read_cmnd (7) := Read_cmnd (8);
+ Read_cmnd (8) := '0';
+
+ -- Read Bank Pipeline
+ Read_bank (0) := Read_bank (1);
+ Read_bank (1) := Read_bank (2);
+ Read_bank (2) := Read_bank (3);
+ Read_bank (3) := Read_bank (4);
+ Read_bank (4) := Read_bank (5);
+ Read_bank (5) := Read_bank (6);
+ Read_bank (6) := Read_bank (7);
+ Read_bank (7) := Read_bank (8);
+ Read_bank (8) := "00";
+
+ -- Read Column Pipeline
+ Read_cols (0) := Read_cols (1);
+ Read_cols (1) := Read_cols (2);
+ Read_cols (2) := Read_cols (3);
+ Read_cols (3) := Read_cols (4);
+ Read_cols (4) := Read_cols (5);
+ Read_cols (5) := Read_cols (6);
+ Read_cols (6) := Read_cols (7);
+ Read_cols (7) := Read_cols (8);
+ Read_cols (8) := (OTHERS => '0');
+
+ -- Initialize Read command
+ IF Read_cmnd (0) = '1' THEN
+ Data_out_enable := '1';
+ Bank_addr := Read_bank (0);
+ Cols_addr := Read_cols (0);
+ Cols_brst := Cols_addr (2 DOWNTO 0);
+ Burst_counter := (OTHERS => '0');
+
+ -- Row address mux
+ CASE Bank_addr IS
+ WHEN "00" => Rows_addr := B0_row_addr;
+ WHEN "01" => Rows_addr := B1_row_addr;
+ WHEN "10" => Rows_addr := B2_row_addr;
+ WHEN OTHERS => Rows_addr := B3_row_addr;
+ END CASE;
+ END IF;
+
+ -- Toggle Dqs during Read command
+ IF Data_out_enable = '1' THEN
+ Dqs_int := '0';
+ IF Dqs_out = "00" THEN
+ Dqs_out <= "11";
+ ELSIF Dqs_out = "11" THEN
+ Dqs_out <= "00";
+ ELSE
+ Dqs_out <= "00";
+ END IF;
+ ELSIF Data_out_enable = '0' AND Dqs_int = '0' THEN
+ Dqs_out <= "ZZ";
+ END IF;
+
+ -- Initialize Dqs for Read command
+ IF Read_cmnd (2) = '1' THEN
+ IF Data_out_enable = '0' THEN
+ Dqs_int := '1';
+ Dqs_out <= "00";
+ END IF;
+ END IF;
+
+ -- Read Latch
+ IF Data_out_enable = '1' THEN
+ -- Initialize Memory
+ Init_mem (Bank_addr, CONV_INTEGER(Rows_addr));
+
+ -- Output Data
+ CASE Bank_addr IS
+ WHEN "00" => Dq <= Bank0 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN "01" => Dq <= Bank1 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN "10" => Dq <= Bank2 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN OTHERS => Dq <= Bank3 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ END CASE;
+
+ -- Increase Burst Counter
+ Burst_decode;
+ ELSE
+ Dq <= (OTHERS => 'Z');
+ END IF;
+ END IF;
+
+ --
+ -- Write FIFO and DM Mask Logic
+ --
+ IF Sys_clk'EVENT AND Sys_clk = '1' THEN
+ -- Write command pipeline
+ Write_cmnd (0) := Write_cmnd (1);
+ Write_cmnd (1) := Write_cmnd (2);
+ Write_cmnd (2) := '0';
+
+ -- Write command pipeline
+ Write_bank (0) := Write_bank (1);
+ Write_bank (1) := Write_bank (2);
+ Write_bank (2) := "00";
+
+ -- Write column pipeline
+ Write_cols (0) := Write_cols (1);
+ Write_cols (1) := Write_cols (2);
+ Write_cols (2) := (OTHERS => '0');
+
+ -- Initialize Write command
+ IF Write_cmnd (0) = '1' THEN
+ Data_in_enable := '1';
+ Bank_addr := Write_bank (0);
+ Cols_addr := Write_cols (0);
+ Cols_brst := Cols_addr (2 DOWNTO 0);
+ Burst_counter := (OTHERS => '0');
+
+ -- Row address mux
+ CASE Bank_addr IS
+ WHEN "00" => Rows_addr := B0_row_addr;
+ WHEN "01" => Rows_addr := B1_row_addr;
+ WHEN "10" => Rows_addr := B2_row_addr;
+ WHEN OTHERS => Rows_addr := B3_row_addr;
+ END CASE;
+ END IF;
+
+ -- Write data
+ IF Data_in_enable = '1' THEN
+ -- Initialize memory
+ Init_mem (Bank_addr, CONV_INTEGER(Rows_addr));
+
+ -- Write first data
+ IF Dm_pair (1) = '0' OR Dm_pair (0) = '0' THEN
+ -- Data Buffer
+ CASE Bank_addr IS
+ WHEN "00" => Data_buf := Bank0 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN "01" => Data_buf := Bank1 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN "10" => Data_buf := Bank2 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN OTHERS => Data_buf := Bank3 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ END CASE;
+
+ -- Perform DM Mask
+ IF Dm_pair (0) = '0' THEN
+ Data_buf ( 7 DOWNTO 0) := Dq_pair ( 7 DOWNTO 0);
+ END IF;
+ IF Dm_pair (1) = '0' THEN
+ Data_buf (15 DOWNTO 8) := Dq_pair (15 DOWNTO 8);
+ END IF;
+
+ -- Write Data
+ CASE Bank_addr IS
+ WHEN "00" => Bank0 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr)) := Data_buf;
+ WHEN "01" => Bank1 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr)) := Data_buf;
+ WHEN "10" => Bank2 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr)) := Data_buf;
+ WHEN OTHERS => Bank3 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr)) := Data_buf;
+ END CASE;
+ END IF;
+
+ -- Increase Burst Counter
+ Burst_decode;
+
+ -- Write second data
+ IF Dm_pair (3) = '0' OR Dm_pair (2) = '0' THEN
+ -- Data Buffer
+ CASE Bank_addr IS
+ WHEN "00" => Data_buf := Bank0 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN "01" => Data_buf := Bank1 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN "10" => Data_buf := Bank2 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ WHEN OTHERS => Data_buf := Bank3 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr));
+ END CASE;
+
+ -- Perform DM Mask
+ IF Dm_pair (2) = '0' THEN
+ Data_buf ( 7 DOWNTO 0) := Dq_pair (23 DOWNTO 16);
+ END IF;
+ IF Dm_pair (3) = '0' THEN
+ Data_buf (15 DOWNTO 8) := Dq_pair (31 DOWNTO 24);
+ END IF;
+
+ -- Write Data
+ CASE Bank_addr IS
+ WHEN "00" => Bank0 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr)) := Data_buf;
+ WHEN "01" => Bank1 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr)) := Data_buf;
+ WHEN "10" => Bank2 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr)) := Data_buf;
+ WHEN OTHERS => Bank3 (CONV_INTEGER(Rows_addr)) (CONV_INTEGER(Cols_addr)) := Data_buf;
+ END CASE;
+ END IF;
+
+ -- Increase Burst Counter
+ Burst_decode;
+
+ -- tWR start and tWTR check
+ IF Dm_pair (3 DOWNTO 2) = "00" OR Dm_pair (1 DOWNTO 0) = "00" THEN
+ CASE Bank_addr IS
+ WHEN "00" => WR_chk0 := NOW;
+ WHEN "01" => WR_chk1 := NOW;
+ WHEN "10" => WR_chk2 := NOW;
+ WHEN OTHERS => WR_chk3 := NOW;
+ END CASE;
+
+ -- tWTR check
+ ASSERT (Read_enable = '0')
+ REPORT "tWTR violation during Read"
+ SEVERITY WARNING;
+ END IF;
+ END IF;
+ END IF;
+
+ --
+ -- Auto Precharge Calculation
+ --
+ IF Sys_clk'EVENT AND Sys_clk = '1' THEN
+ -- Precharge counter
+ IF Read_precharge (0) = '1' OR Write_precharge (0) = '1' THEN
+ Count_precharge (0) := Count_precharge (0) + 1;
+ END IF;
+ IF Read_precharge (1) = '1' OR Write_precharge (1) = '1' THEN
+ Count_precharge (1) := Count_precharge (1) + 1;
+ END IF;
+ IF Read_precharge (2) = '1' OR Write_precharge (2) = '1' THEN
+ Count_precharge (2) := Count_precharge (2) + 1;
+ END IF;
+ IF Read_precharge (3) = '1' OR Write_precharge (3) = '1' THEN
+ Count_precharge (3) := Count_precharge (3) + 1;
+ END IF;
+
+ -- Read with AutoPrecharge Calculation
+ -- The device start internal precharge when:
+ -- 1. Meet tRAS requirement
+ -- 2. BL/2 cycles after command
+ IF ((Read_precharge(0) = '1') AND (NOW - RAS_chk0 >= tRAS)) THEN
+ IF ((Burst_length_2 = '1' AND Count_precharge(0) >= 1) OR
+ (Burst_length_4 = '1' AND Count_precharge(0) >= 2) OR
+ (Burst_length_8 = '1' AND Count_precharge(0) >= 4)) THEN
+ Pc_b0 := '1';
+ Act_b0 := '0';
+ RP_chk0 := NOW;
+ Read_precharge(0) := '0';
+ END IF;
+ END IF;
+ IF ((Read_precharge(1) = '1') AND (NOW - RAS_chk1 >= tRAS)) THEN
+ IF ((Burst_length_2 = '1' AND Count_precharge(1) >= 1) OR
+ (Burst_length_4 = '1' AND Count_precharge(1) >= 2) OR
+ (Burst_length_8 = '1' AND Count_precharge(1) >= 4)) THEN
+ Pc_b1 := '1';
+ Act_b1 := '0';
+ RP_chk1 := NOW;
+ Read_precharge(1) := '0';
+ END IF;
+ END IF;
+ IF ((Read_precharge(2) = '1') AND (NOW - RAS_chk2 >= tRAS)) THEN
+ IF ((Burst_length_2 = '1' AND Count_precharge(2) >= 1) OR
+ (Burst_length_4 = '1' AND Count_precharge(2) >= 2) OR
+ (Burst_length_8 = '1' AND Count_precharge(2) >= 4)) THEN
+ Pc_b2 := '1';
+ Act_b2 := '0';
+ RP_chk2 := NOW;
+ Read_precharge(2) := '0';
+ END IF;
+ END IF;
+ IF ((Read_precharge(3) = '1') AND (NOW - RAS_chk3 >= tRAS)) THEN
+ IF ((Burst_length_2 = '1' AND Count_precharge(3) >= 1) OR
+ (Burst_length_4 = '1' AND Count_precharge(3) >= 2) OR
+ (Burst_length_8 = '1' AND Count_precharge(3) >= 4)) THEN
+ Pc_b3 := '1';
+ Act_b3 := '0';
+ RP_chk3 := NOW;
+ Read_precharge(3) := '0';
+ END IF;
+ END IF;
+
+ -- Write with AutoPrecharge Calculation
+ -- The device start internal precharge when:
+ -- 1. Meet tRAS requirement
+ -- 2. Two clock after last burst
+ -- Since tWR is time base, the model will compensate tRP
+ IF ((Write_precharge(0) = '1') AND (NOW - RAS_chk0 >= tRAS)) THEN
+ IF ((Burst_length_2 = '1' AND Count_precharge (0) >= 4) OR
+ (Burst_length_4 = '1' AND Count_precharge (0) >= 5) OR
+ (Burst_length_8 = '1' AND Count_precharge (0) >= 7)) THEN
+ Pc_b0 := '1';
+ Act_b0 := '0';
+ RP_chk0 := NOW - ((2 * tCK) - tWR);
+ Write_precharge(0) := '0';
+ END IF;
+ END IF;
+ IF ((Write_precharge(1) = '1') AND (NOW - RAS_chk1 >= tRAS)) THEN
+ IF ((Burst_length_2 = '1' AND Count_precharge (1) >= 4) OR
+ (Burst_length_4 = '1' AND Count_precharge (1) >= 5) OR
+ (Burst_length_8 = '1' AND Count_precharge (1) >= 7)) THEN
+ Pc_b1 := '1';
+ Act_b1 := '0';
+ RP_chk1 := NOW - ((2 * tCK) - tWR);
+ Write_precharge(1) := '0';
+ END IF;
+ END IF;
+ IF ((Write_precharge(2) = '1') AND (NOW - RAS_chk2 >= tRAS)) THEN
+ IF ((Burst_length_2 = '1' AND Count_precharge (2) >= 4) OR
+ (Burst_length_4 = '1' AND Count_precharge (2) >= 5) OR
+ (Burst_length_8 = '1' AND Count_precharge (2) >= 7)) THEN
+ Pc_b2 := '1';
+ Act_b2 := '0';
+ RP_chk2 := NOW - ((2 * tCK) - tWR);
+ Write_precharge(2) := '0';
+ END IF;
+ END IF;
+ IF ((Write_precharge(3) = '1') AND (NOW - RAS_chk3 >= tRAS)) THEN
+ IF ((Burst_length_2 = '1' AND Count_precharge (3) >= 4) OR
+ (Burst_length_4 = '1' AND Count_precharge (3) >= 5) OR
+ (Burst_length_8 = '1' AND Count_precharge (3) >= 7)) THEN
+ Pc_b3 := '1';
+ Act_b3 := '0';
+ RP_chk3 := NOW - ((2 * tCK) - tWR);
+ Write_precharge(3) := '0';
+ END IF;
+ END IF;
+ END IF;
+
+ --
+ -- DLL Counter
+ --
+ IF Sys_clk'EVENT AND Sys_clk = '1' THEN
+ IF (DLL_Reset = '1' AND DLL_done = '0') THEN
+ DLL_count := DLL_count + 1;
+ IF (DLL_count >= 200) THEN
+ DLL_done := '1';
+ END IF;
+ END IF;
+ END IF;
+
+ --
+ -- Control Logic
+ --
+ IF Sys_clk'EVENT AND Sys_clk = '1' THEN
+ -- Auto Refresh
+ IF Aref_enable = '1' THEN
+ -- Auto Refresh to Auto Refresh
+ ASSERT (NOW - RFC_chk >= tRFC)
+ REPORT "tRFC violation during Auto Refresh"
+ SEVERITY WARNING;
+
+ -- Precharge to Auto Refresh
+ ASSERT ((NOW - RP_chk0 >= tRP) AND (NOW - RP_chk1 >= tRP) AND
+ (NOW - RP_chk2 >= tRP) AND (NOW - RP_chk3 >= tRP))
+ REPORT "tRP violation during Auto Refresh"
+ SEVERITY WARNING;
+
+ -- Precharge to Auto Refresh
+ ASSERT (Pc_b0 = '1' AND Pc_b1 = '1' AND Pc_b2 = '1' AND Pc_b3 = '1')
+ REPORT "All banks must be Precharge before Auto Refresh"
+ SEVERITY WARNING;
+
+ -- Record current tRFC time
+ RFC_chk := NOW;
+ END IF;
+
+ -- Extended Load Mode Register
+ IF Ext_mode_enable = '1' THEN
+ IF (Pc_b0 = '1' AND Pc_b1 = '1' AND Pc_b2 = '1' AND Pc_b3 = '1') THEN
+ IF (Addr (0) = '0') THEN
+ DLL_enable := '1';
+ ELSE
+ DLL_enable := '0';
+ END IF;
+ END IF;
+
+ -- Precharge to EMR
+ ASSERT (Pc_b0 = '1' AND Pc_b1 = '1' AND Pc_b2 = '1' AND Pc_b3 = '1')
+ REPORT "All bank must be Precharged before Extended Mode Register"
+ SEVERITY WARNING;
+
+ -- Precharge to EMR
+ ASSERT ((NOW - RP_chk0 >= tRP) AND (NOW - RP_chk1 >= tRP) AND
+ (NOW - RP_chk2 >= tRP) AND (NOW - RP_chk3 >= tRP))
+ REPORT "tRP violation during Extended Load Register"
+ SEVERITY WARNING;
+
+ -- LMR/EMR to EMR
+ ASSERT (NOW - MRD_chk >= tMRD)
+ REPORT "tMRD violation during Extended Mode Register"
+ SEVERITY WARNING;
+
+ -- Record current tMRD time
+ MRD_chk := NOW;
+ END IF;
+
+ -- Load Mode Register
+ IF Mode_reg_enable = '1' THEN
+ -- Register mode
+ Mode_reg <= Addr;
+
+ -- DLL Reset
+ IF (DLL_enable = '1' AND Addr (8) = '1') THEN
+ DLL_reset := '1';
+ DLL_done := '0';
+ DLL_count := 0;
+ ELSIF (DLL_enable = '1' AND DLL_reset = '0' AND Addr (8) = '0') THEN
+ ASSERT (FALSE)
+ REPORT "DLL is ENABLE: DLL RESET is require"
+ SEVERITY WARNING;
+ ELSIF (DLL_enable = '0' AND Addr (8) = '1') THEN
+ ASSERT (FALSE)
+ REPORT "DLL is DISABLE: DLL RESET will be ignored"
+ SEVERITY WARNING;
+ END IF;
+
+ -- Precharge to LMR
+ ASSERT (Pc_b0 = '1' AND Pc_b1 = '1' AND Pc_b2 = '1' AND Pc_b3 = '1')
+ REPORT "All bank must be Precharged before Load Mode Register"
+ SEVERITY WARNING;
+
+ -- Precharge to EMR
+ ASSERT ((NOW - RP_chk0 >= tRP) AND (NOW - RP_chk1 >= tRP) AND
+ (NOW - RP_chk2 >= tRP) AND (NOW - RP_chk3 >= tRP))
+ REPORT "tRP violation during Load Mode Register"
+ SEVERITY WARNING;
+
+ -- LMR/ELMR to LMR
+ ASSERT (NOW - MRD_chk >= tMRD)
+ REPORT "tMRD violation during Load Mode Register"
+ SEVERITY WARNING;
+
+ -- Check for invalid Burst Length
+ ASSERT ((Addr (2 DOWNTO 0) = "001") OR -- BL = 2
+ (Addr (2 DOWNTO 0) = "010") OR -- BL = 4
+ (Addr (2 DOWNTO 0) = "011")) -- BL = 8
+ REPORT "Invalid Burst Length during Load Mode Register"
+ SEVERITY WARNING;
+
+ -- Check for invalid CAS Latency
+ ASSERT ((Addr (6 DOWNTO 4) = "010") OR -- CL = 2.0
+ (Addr (6 DOWNTO 4) = "110")) -- CL = 2.5
+ REPORT "Invalid CAS Latency during Load Mode Register"
+ SEVERITY WARNING;
+
+ -- Record current tMRD time
+ MRD_chk := NOW;
+ END IF;
+
+ -- Active Block (latch Bank and Row Address)
+ IF Active_enable = '1' THEN
+ -- Activate an OPEN bank can corrupt data
+ ASSERT ((Ba = "00" AND Act_b0 = '0') OR
+ (Ba = "01" AND Act_b1 = '0') OR
+ (Ba = "10" AND Act_b2 = '0') OR
+ (Ba = "11" AND Act_b3 = '0'))
+ REPORT "Bank is already activated - data can be corrupted"
+ SEVERITY WARNING;
+
+ -- Activate Bank 0
+ IF Ba = "00" AND Pc_b0 = '1' THEN
+ -- Activate to Activate (same bank)
+ ASSERT (NOW - RC_chk0 >= tRC)
+ REPORT "tRC violation during Activate Bank 0"
+ SEVERITY WARNING;
+
+ -- Precharge to Active
+ ASSERT (NOW - RP_chk0 >= tRP)
+ REPORT "tRP violation during Activate Bank 0"
+ SEVERITY WARNING;
+
+ -- Record Variables for checking violation
+ Act_b0 := '1';
+ Pc_b0 := '0';
+ B0_row_addr := Addr;
+ RC_chk0 := NOW;
+ RCD_chk0 := NOW;
+ RAS_chk0 := NOW;
+ RAP_chk0 := NOW;
+ END IF;
+
+ -- Activate Bank 1
+ IF Ba = "01" AND Pc_b1 = '1' THEN
+ -- Activate to Activate (same bank)
+ ASSERT (NOW - RC_chk1 >= tRC)
+ REPORT "tRC violation during Activate Bank 1"
+ SEVERITY WARNING;
+
+ -- Precharge to Active
+ ASSERT (NOW - RP_chk1 >= tRP)
+ REPORT "tRP violation during Activate Bank 1"
+ SEVERITY WARNING;
+
+ -- Record Variables for checking violation
+ Act_b1 := '1';
+ Pc_b1 := '0';
+ B1_row_addr := Addr;
+ RC_chk1 := NOW;
+ RCD_chk1 := NOW;
+ RAS_chk1 := NOW;
+ RAP_chk1 := NOW;
+ END IF;
+
+ -- Activate Bank 2
+ IF Ba = "10" AND Pc_b2 = '1' THEN
+ -- Activate to Activate (same bank)
+ ASSERT (NOW - RC_chk2 >= tRC)
+ REPORT "tRC violation during Activate Bank 2"
+ SEVERITY WARNING;
+
+ -- Precharge to Active
+ ASSERT (NOW - RP_chk2 >= tRP)
+ REPORT "tRP violation during Activate Bank 2"
+ SEVERITY WARNING;
+
+ -- Record Variables for checking violation
+ Act_b2 := '1';
+ Pc_b2 := '0';
+ B2_row_addr := Addr;
+ RC_chk2 := NOW;
+ RCD_chk2 := NOW;
+ RAS_chk2 := NOW;
+ RAP_chk2 := NOW;
+ END IF;
+
+ -- Activate Bank 3
+ IF Ba = "11" AND Pc_b3 = '1' THEN
+ -- Activate to Activate (same bank)
+ ASSERT (NOW - RC_chk3 >= tRC)
+ REPORT "tRC violation during Activate Bank 3"
+ SEVERITY WARNING;
+
+ -- Precharge to Active
+ ASSERT (NOW - RP_chk3 >= tRP)
+ REPORT "tRP violation during Activate Bank 3"
+ SEVERITY WARNING;
+
+ -- Record Variables for checking violation
+ Act_b3 := '1';
+ Pc_b3 := '0';
+ B3_row_addr := Addr;
+ RC_chk3 := NOW;
+ RCD_chk3 := NOW;
+ RAS_chk3 := NOW;
+ RAP_chk3 := NOW;
+ END IF;
+
+ -- Activate Bank A to Activate Bank B
+ IF (Prev_bank /= Ba) THEN
+ ASSERT (NOW - RRD_chk >= tRRD)
+ REPORT "tRRD violation during Activate"
+ SEVERITY WARNING;
+ END IF;
+
+ -- AutoRefresh to Activate
+ ASSERT (NOW - RFC_chk >= tRFC)
+ REPORT "tRFC violation during Activate"
+ SEVERITY WARNING;
+
+ -- Record Variables for Checking Violation
+ RRD_chk := NOW;
+ Prev_bank := Ba;
+ END IF;
+
+ -- Precharge Block - Consider NOP if bank already precharged or in process of precharging
+ IF Prech_enable = '1' THEN
+ -- EMR or LMR to Precharge
+ ASSERT (NOW - MRD_chk >= tMRD)
+ REPORT "tMRD violation during Precharge"
+ SEVERITY WARNING;
+
+ -- Precharge Bank 0
+ IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "00")) AND Act_b0 = '1') THEN
+ Act_b0 := '0';
+ Pc_b0 := '1';
+ RP_chk0 := NOW;
+
+ -- Activate to Precharge bank 0
+ ASSERT (NOW - RAS_chk0 >= tRAS)
+ REPORT "tRAS violation during Precharge"
+ SEVERITY WARNING;
+
+ -- tWR violation check for Write
+ ASSERT (NOW - WR_chk0 >= tWR)
+ REPORT "tWR violation during Precharge"
+ SEVERITY WARNING;
+ END IF;
+
+ -- Precharge Bank 1
+ IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "01")) AND Act_b1 = '1') THEN
+ Act_b1 := '0';
+ Pc_b1 := '1';
+ RP_chk1 := NOW;
+
+ -- Activate to Precharge
+ ASSERT (NOW - RAS_chk1 >= tRAS)
+ REPORT "tRAS violation during Precharge"
+ SEVERITY WARNING;
+
+ -- tWR violation check for Write
+ ASSERT (NOW - WR_chk1 >= tWR)
+ REPORT "tWR violation during Precharge"
+ SEVERITY WARNING;
+ END IF;
+
+ -- Precharge Bank 2
+ IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "10")) AND Act_b2 = '1') THEN
+ Act_b2 := '0';
+ Pc_b2 := '1';
+ RP_chk2 := NOW;
+
+ -- Activate to Precharge
+ ASSERT (NOW - RAS_chk2 >= tRAS)
+ REPORT "tRAS violation during Precharge"
+ SEVERITY WARNING;
+
+ -- tWR violation check for Write
+ ASSERT (NOW - WR_chk2 >= tWR)
+ REPORT "tWR violation during Precharge"
+ SEVERITY WARNING;
+ END IF;
+
+ -- Precharge Bank 3
+ IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "11")) AND Act_b3 = '1') THEN
+ Act_b3 := '0';
+ Pc_b3 := '1';
+ RP_chk3 := NOW;
+
+ -- Activate to Precharge
+ ASSERT (NOW - RAS_chk3 >= tRAS)
+ REPORT "tRAS violation during Precharge"
+ SEVERITY WARNING;
+
+ -- tWR violation check for Write
+ ASSERT (NOW - WR_chk3 >= tWR)
+ REPORT "tWR violation during Precharge"
+ SEVERITY WARNING;
+ END IF;
+
+ -- Pipeline for READ
+ IF CAS_latency_15 = '1' THEN
+ A10_precharge (3) := Addr(10);
+ Bank_precharge (3) := Ba;
+ Cmnd_precharge (3) := '1';
+ ELSIF CAS_latency_2 = '1' THEN
+ A10_precharge (4) := Addr(10);
+ Bank_precharge (4) := Ba;
+ Cmnd_precharge (4) := '1';
+ ELSIF CAS_latency_25 = '1' THEN
+ A10_precharge (5) := Addr(10);
+ Bank_precharge (5) := Ba;
+ Cmnd_precharge (5) := '1';
+ ELSIF CAS_latency_3 = '1' THEN
+ A10_precharge (6) := Addr(10);
+ Bank_precharge (6) := Ba;
+ Cmnd_precharge (6) := '1';
+ ELSIF CAS_latency_4 = '1' THEN
+ A10_precharge (8) := Addr(10);
+ Bank_precharge (8) := Ba;
+ Cmnd_precharge (8) := '1';
+ END IF;
+ END IF;
+
+ -- Burst Terminate
+ IF Burst_term = '1' THEN
+ -- Pipeline for Read
+ IF CAS_latency_15 = '1' THEN
+ Cmnd_bst (3) := '1';
+ ELSIF CAS_latency_2 = '1' THEN
+ Cmnd_bst (4) := '1';
+ ELSIF CAS_latency_25 = '1' THEN
+ Cmnd_bst (5) := '1';
+ ELSIF CAS_latency_3 = '1' THEN
+ Cmnd_bst (6) := '1';
+ ELSIF CAS_latency_4 = '1' THEN
+ Cmnd_bst (8) := '1';
+ END IF;
+
+ -- Terminate Write
+ ASSERT (Data_in_enable = '0')
+ REPORT "It's illegal to Burst Terminate a Write"
+ SEVERITY WARNING;
+
+ -- Terminate Read with Auto Precharge
+ ASSERT (Read_precharge (0) = '0' AND Read_precharge (1) = '0' AND
+ Read_precharge (2) = '0' AND Read_precharge (3) = '0')
+ REPORT "It's illegal to Burst Terminate a Read with Auto Precharge"
+ SEVERITY WARNING;
+ END IF;
+
+ -- Read Command
+ IF Read_enable = '1' THEN
+ -- CAS Latency Pipeline
+ IF Cas_latency_15 = '1' THEN
+ Read_cmnd (3) := '1';
+ Read_bank (3) := Ba;
+ Read_cols (3) := Addr (8 DOWNTO 0);
+ ELSIF Cas_latency_2 = '1' THEN
+ Read_cmnd (4) := '1';
+ Read_bank (4) := Ba;
+ Read_cols (4) := Addr (8 DOWNTO 0);
+ ELSIF Cas_latency_25 = '1' THEN
+ Read_cmnd (5) := '1';
+ Read_bank (5) := Ba;
+ Read_cols (5) := Addr (8 DOWNTO 0);
+ ELSIF Cas_latency_3 = '1' THEN
+ Read_cmnd (6) := '1';
+ Read_bank (6) := Ba;
+ Read_cols (6) := Addr (8 DOWNTO 0);
+ ELSIF Cas_latency_4 = '1' THEN
+ Read_cmnd (8) := '1';
+ Read_bank (8) := Ba;
+ Read_cols (8) := Addr (8 DOWNTO 0);
+ END IF;
+
+ -- Write to Read: Terminate Write Immediately
+ IF Data_in_enable = '1' THEN
+ Data_in_enable := '0';
+ END IF;
+
+ -- Interrupting a Read with Auto Precharge (same bank only)
+ ASSERT (Read_precharge(CONV_INTEGER(Ba)) = '0')
+ REPORT "It's illegal to interrupt a Read with Auto Precharge"
+ SEVERITY WARNING;
+
+ -- Activate to Read
+ ASSERT ((Ba = "00" AND Act_b0 = '1') OR
+ (Ba = "01" AND Act_b1 = '1') OR
+ (Ba = "10" AND Act_b2 = '1') OR
+ (Ba = "11" AND Act_b3 = '1'))
+ REPORT "Bank is not Activated for Read"
+ SEVERITY WARNING;
+
+ -- Activate to Read without Auto Precharge
+ IF Addr (10) = '0' THEN
+ ASSERT ((Ba = "00" AND NOW - RCD_chk0 >= tRCD) OR
+ (Ba = "01" AND NOW - RCD_chk1 >= tRCD) OR
+ (Ba = "10" AND NOW - RCD_chk2 >= tRCD) OR
+ (Ba = "11" AND NOW - RCD_chk3 >= tRCD))
+ REPORT "tRCD violation during Read"
+ SEVERITY WARNING;
+ END IF;
+
+ -- Activate to Read with Auto Precharge
+ IF Addr (10) = '1' THEN
+ ASSERT ((Ba = "00" AND NOW - RAP_chk0 >= tRAP) OR
+ (Ba = "01" AND NOW - RAP_chk1 >= tRAP) OR
+ (Ba = "10" AND NOW - RAP_chk2 >= tRAP) OR
+ (Ba = "11" AND NOW - RAP_chk3 >= tRAP))
+ REPORT "tRAP violation during Read"
+ SEVERITY WARNING;
+ END IF;
+
+ -- Auto precharge
+ IF Addr (10) = '1' THEN
+ Read_precharge (Conv_INTEGER(Ba)) := '1';
+ Count_precharge (Conv_INTEGER(Ba)) := 0;
+ END IF;
+
+ -- DLL Check
+ IF (DLL_reset = '1') THEN
+ ASSERT (DLL_done = '1')
+ REPORT "DLL RESET not complete"
+ SEVERITY WARNING;
+ END IF;
+ END IF;
+
+ -- Write Command
+ IF Write_enable = '1' THEN
+ -- Pipeline for Write
+ Write_cmnd (2) := '1';
+ Write_bank (2) := Ba;
+ Write_cols (2) := Addr (8 DOWNTO 0);
+
+ -- Interrupting a Write with Auto Precharge (same bank only)
+ ASSERT (Write_precharge(CONV_INTEGER(Ba)) = '0')
+ REPORT "It's illegal to interrupt a Write with Auto Precharge"
+ SEVERITY WARNING;
+
+ -- Activate to Write
+ ASSERT ((Ba = "00" AND Act_b0 = '1') OR
+ (Ba = "01" AND Act_b1 = '1') OR
+ (Ba = "10" AND Act_b2 = '1') OR
+ (Ba = "11" AND Act_b3 = '1'))
+ REPORT "Bank is not Activated for Write"
+ SEVERITY WARNING;
+
+ -- Activate to Write
+ ASSERT ((Ba = "00" AND NOW - RCD_chk0 >= tRCD) OR
+ (Ba = "01" AND NOW - RCD_chk1 >= tRCD) OR
+ (Ba = "10" AND NOW - RCD_chk2 >= tRCD) OR
+ (Ba = "11" AND NOW - RCD_chk3 >= tRCD))
+ REPORT "tRCD violation during Write"
+ SEVERITY WARNING;
+
+ -- Auto precharge
+ IF Addr (10) = '1' THEN
+ Write_precharge (Conv_INTEGER(Ba)) := '1';
+ Count_precharge (Conv_INTEGER(Ba)) := 0;
+ END IF;
+ END IF;
+ END IF;
+ END PROCESS;
+
+ --
+ -- Dqs Receiver
+ --
+ dqs_rcvrs : PROCESS
+ VARIABLE Dm_temp : STD_LOGIC_VECTOR (1 DOWNTO 0);
+ VARIABLE Dq_temp : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0);
+ BEGIN
+ WAIT ON Dqs;
+ -- Latch data at posedge Dqs
+ IF Dqs'EVENT AND Dqs (1) = '1' AND Dqs (0) = '1' THEN
+ Dq_temp := Dq;
+ Dm_temp := Dm;
+ END IF;
+ -- Latch data at negedge Dqs
+ IF Dqs'EVENT AND Dqs (1) = '0' AND Dqs (0) = '0' THEN
+ Dq_pair <= (Dq & Dq_temp);
+ Dm_pair <= (Dm & Dm_temp);
+ END IF;
+ END PROCESS;
+
+ --
+ -- Setup timing checks
+ --
+ Setup_check : PROCESS
+ BEGIN
+ WAIT ON Sys_clk;
+ IF Sys_clk'EVENT AND Sys_clk = '1' THEN
+ ASSERT(Cke'LAST_EVENT >= tIS)
+ REPORT "CKE Setup time violation -- tIS"
+ SEVERITY WARNING;
+ ASSERT(Cs_n'LAST_EVENT >= tIS)
+ REPORT "CS# Setup time violation -- tIS"
+ SEVERITY WARNING;
+ ASSERT(Cas_n'LAST_EVENT >= tIS)
+ REPORT "CAS# Setup time violation -- tIS"
+ SEVERITY WARNING;
+ ASSERT(Ras_n'LAST_EVENT >= tIS)
+ REPORT "RAS# Setup time violation -- tIS"
+ SEVERITY WARNING;
+ ASSERT(We_n'LAST_EVENT >= tIS)
+ REPORT "WE# Setup time violation -- tIS"
+ SEVERITY WARNING;
+ ASSERT(Addr'LAST_EVENT >= tIS)
+ REPORT "ADDR Setup time violation -- tIS"
+ SEVERITY WARNING;
+ ASSERT(Ba'LAST_EVENT >= tIS)
+ REPORT "BA Setup time violation -- tIS"
+ SEVERITY WARNING;
+ END IF;
+ END PROCESS;
+
+ --
+ -- Hold timing checks
+ --
+ Hold_check : PROCESS
+ BEGIN
+ WAIT ON Sys_clk'DELAYED (tIH);
+ IF Sys_clk'DELAYED (tIH) = '1' THEN
+ ASSERT(Cke'LAST_EVENT >= tIH)
+ REPORT "CKE Hold time violation -- tIH"
+ SEVERITY WARNING;
+ ASSERT(Cs_n'LAST_EVENT >= tIH)
+ REPORT "CS# Hold time violation -- tIH"
+ SEVERITY WARNING;
+ ASSERT(Cas_n'LAST_EVENT >= tIH)
+ REPORT "CAS# Hold time violation -- tIH"
+ SEVERITY WARNING;
+ ASSERT(Ras_n'LAST_EVENT >= tIH)
+ REPORT "RAS# Hold time violation -- tIH"
+ SEVERITY WARNING;
+ ASSERT(We_n'LAST_EVENT >= tIH)
+ REPORT "WE# Hold time violation -- tIH"
+ SEVERITY WARNING;
+ ASSERT(Addr'LAST_EVENT >= tIH)
+ REPORT "ADDR Hold time violation -- tIH"
+ SEVERITY WARNING;
+ ASSERT(Ba'LAST_EVENT >= tIH)
+ REPORT "BA Hold time violation -- tIH"
+ SEVERITY WARNING;
+ END IF;
+ END PROCESS;
+
+END behave;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/reset_virtex4.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/reset_virtex4.vhd
new file mode 100644
index 0000000..4f799c5
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/reset_virtex4.vhd
@@ -0,0 +1,111 @@
+-------------------------------------------------------------------------
+-- Project: SDRAM controller
+-- This file: Reset generator (Virtex-4 specific)
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+Library UNISIM;
+use UNISIM.vcomponents.all;
+
+entity reset is
+ port
+ (
+ clk : in std_logic;
+ rst_in : in std_logic;
+ rst_out : out std_logic
+ );
+end;
+
+architecture tech of reset is
+
+ signal rst : std_logic;
+ signal shift_pipe : std_logic_vector(3 downto 0);
+ attribute KEEP : string;
+ attribute KEEP of shift_pipe : signal is "TRUE";
+
+begin
+
+ rst <= shift_pipe(0);
+
+bufg_reset: bufg
+ port map
+ (
+ o => rst_out,
+ i => rst
+ );
+
+fdp0: fdp
+ generic map
+ (
+ init => '1'
+ )
+ port map
+ (
+ d => rst_in,
+ c => clk,
+ pre => '0',
+ q => shift_pipe(3)
+ );
+
+fdp1: fdp
+ generic map
+ (
+ init => '1'
+ )
+ port map
+ (
+
+ d => shift_pipe(3),
+ c => clk,
+ pre => '0',
+ q => shift_pipe(2)
+ );
+
+fdp2: fdp
+ generic map
+ (
+ init => '1'
+ )
+ port map
+ (
+ d => shift_pipe(2),
+ c => clk,
+ pre => '0',
+ q => shift_pipe(1)
+ );
+
+fdp3: fdp
+ generic map
+ (
+ init => '1'
+ )
+ port map
+ (
+
+ d => shift_pipe(1),
+ c => clk,
+ pre => '0',
+ q => shift_pipe(0)
+ );
+
+end tech;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/sdram_cmd.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_cmd.vhd
new file mode 100644
index 0000000..a50b6e8
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_cmd.vhd
@@ -0,0 +1,269 @@
+-------------------------------------------------------------------------
+-- Project: SDRAM controller
+-- This file: SDRAM command controller
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+
+entity sdram_cmd is
+ Generic (BL : natural := 2);
+ Port (
+ rst : in STD_LOGIC;
+ clk : in STD_LOGIC;
+ enable : in STD_LOGIC;
+ u_tag_in : in user_tag_t;
+ u_tag_out : out user_tag_t;
+ phy_ctrl : out phy_ctrl_t;
+ cmd : in sdr_cmd_t;
+ cmd_we : in STD_LOGIC;
+ cmd_ack : out STD_LOGIC;
+ col_addr : in col_addr_t;
+ mode_word : in mode_word_t;
+ sdr_cmd_ctrl : out sdr_cmd_lines_t;
+ sdr_addr : out sdr_addr_t;
+ sdr_ba : out sdr_ba_t
+ );
+end sdram_cmd;
+
+architecture behaviour of sdram_cmd is
+
+ signal st_sdr, st_sdr_next : sdr_state_t;
+
+ signal cc_preset : natural range 0 to 10;
+ signal cc_load_en : std_logic;
+ signal cycle_finished : std_logic;
+
+ signal burst_preset : natural range 0 to 3;
+ signal burst_load_en : std_logic;
+ signal burst_finished : std_logic;
+
+begin
+
+ u_tag_out <= u_tag_in;
+
+------------------------------------------------------------------------------------------
+
+fsm_sdr_state:
+ process (st_sdr, cmd, cmd_we, cycle_finished, burst_finished, mode_word, enable, col_addr)
+ begin
+ st_sdr_next <= st_sdr;
+ sdr_cmd_ctrl <= COMMAND(SD_NOP);
+
+ cc_load_en <= '0';
+ cc_preset <= TIMING(cmd);
+ burst_load_en <= '0';
+ cmd_ack <= '0';
+ burst_preset <= BL/2-1;
+ phy_ctrl.re <= '0';
+ phy_ctrl.drive_en <= '0';
+ phy_ctrl.we <= '0';
+ phy_ctrl.utag_we <= '0';
+ sdr_addr <= mode_word(sdr_addr_t'left downto sdr_addr_t'right);
+ sdr_ba <= mode_word(mode_word_t'left downto mode_word_t'left-1);
+
+ case st_sdr is
+ when PWR_DOWN =>
+ sdr_cmd_ctrl <= COMMAND(SD_DESELECT);
+ if enable = '1' then
+ st_sdr_next <= IDLE;
+ end if;
+
+ when PRECHARGE =>
+ if cycle_finished = '1' then
+ st_sdr_next <= IDLE;
+ end if;
+
+ when MODE =>
+ if cycle_finished = '1' then
+ st_sdr_next <= IDLE;
+ end if;
+
+ when IDLE =>
+ if cmd_we = '1' then
+ cmd_ack <= '1';
+ cc_load_en <= '1';
+ cc_preset <= TIMING(cmd);
+ sdr_cmd_ctrl <= COMMAND(cmd);
+ case cmd is
+ when SD_PRE =>
+ st_sdr_next <= PRECHARGE;
+ sdr_addr(BIT_PRE_ALL) <= mode_word(BIT_PRE_ALL);
+ when SD_LMR =>
+ st_sdr_next <= MODE;
+ when SD_ACT =>
+ st_sdr_next <= ROW_ACT;
+ when SD_AR =>
+ st_sdr_next <= AUTO_REF;
+ when others => null;
+ end case;
+ end if;
+
+ when ROW_ACT =>
+ if cycle_finished = '1' then
+ if cmd_we = '1' then
+ cmd_ack <= '1';
+ burst_load_en <= '1';
+ cc_load_en <= '1';
+ cc_preset <= TIMING(cmd);
+ sdr_cmd_ctrl <= COMMAND(cmd);
+ case cmd is
+ when SD_PRE =>
+ st_sdr_next <= PRECHARGE;
+ when SD_READ =>
+ phy_ctrl.utag_we <= '1';
+ st_sdr_next <= READ;
+ sdr_addr(col_addr_t'range) <= col_addr;
+ when SD_WRITE =>
+ phy_ctrl.utag_we <= '1';
+ phy_ctrl.drive_en <= '1';
+ st_sdr_next <= WRITE;
+ sdr_addr(col_addr_t'range) <= col_addr;
+ when others => null;
+ end case;
+ end if;
+ end if;
+
+ when WRITE =>
+ phy_ctrl.drive_en <= '1';
+ phy_ctrl.we <= '1';
+ if burst_finished = '1' then
+ if cmd_we = '1' and cmd = SD_WRITE then
+ sdr_addr(col_addr_t'range) <= col_addr;
+ cmd_ack <= '1';
+ burst_load_en <= '1';
+ sdr_cmd_ctrl <= COMMAND(cmd);
+ phy_ctrl.utag_we <= '1';
+ else
+ phy_ctrl.drive_en <= '0';
+ cc_load_en <= '1';
+ cc_preset <= TIMING(SD_WRITE)+1;
+ st_sdr_next <= ROW_ACT;
+ end if;
+ end if;
+
+ when READ =>
+ phy_ctrl.re <= '1';
+ if burst_finished = '1' then
+ if cmd_we = '1' and cmd = SD_READ then
+ sdr_addr(col_addr_t'range) <= col_addr;
+ cmd_ack <= '1';
+ burst_load_en <= '1';
+ sdr_cmd_ctrl <= COMMAND(cmd);
+ phy_ctrl.utag_we <= '1';
+ else
+ cc_load_en <= '1';
+ cc_preset <= TIMING(SD_READ);
+ st_sdr_next <= ROW_ACT;
+ end if;
+ end if;
+
+ when WRITE_A => -- not implemented yet
+ cmd_ack <= '1';
+ st_sdr_next <= IDLE;
+
+ when READ_A => -- not implemented yet
+ cmd_ack <= '1';
+ st_sdr_next <= IDLE;
+
+ when BURST_STOP => -- not implemented yet
+ cmd_ack <= '1';
+ st_sdr_next <= IDLE;
+
+ when SELF_REF => -- not implemented yet
+ cmd_ack <= '1';
+ st_sdr_next <= IDLE;
+
+ when PRE_PWR_DOWN => -- not implemented yet
+ cmd_ack <= '1';
+ st_sdr_next <= IDLE;
+
+ when ACT_PWR_DOWN => -- not implemented yet
+ cmd_ack <= '1';
+ st_sdr_next <= IDLE;
+
+ when AUTO_REF =>
+ if cycle_finished = '1' then
+ st_sdr_next <= IDLE;
+ end if;
+
+ when others =>
+ st_sdr_next <= IDLE;
+ end case;
+
+ end process;
+
+fsm_sdr_state_next:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ st_sdr <= PWR_DOWN;
+ elsif rising_edge(clk) then
+ st_sdr <= st_sdr_next;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+cycle_counter:
+ process (rst, clk)
+ variable cycle_cnt : natural range 0 to 10;
+ begin
+ if rst = '1' then
+ cycle_cnt := 0;
+ cycle_finished <= '0';
+ elsif rising_edge(clk) then
+ cycle_finished <= '0';
+ if cc_load_en = '1' then
+ cycle_cnt := cc_preset;
+ elsif cycle_cnt /= 0 then
+ cycle_cnt := cycle_cnt - 1;
+ else
+ cycle_finished <= '1';
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+burst_counter:
+ process (rst, clk)
+ variable burst_cnt : natural range 0 to 3;
+ begin
+ if rst = '1' then
+ burst_cnt := 0;
+ elsif rising_edge(clk) then
+ burst_finished <= '0';
+ if burst_load_en = '1' then
+ burst_cnt := burst_preset;
+ elsif burst_cnt /= 0 then
+ burst_cnt := burst_cnt - 1;
+ end if;
+ if burst_cnt = 0 then
+ burst_finished <= '1';
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+end behaviour;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/sdram_config.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_config.vhd
new file mode 100644
index 0000000..b62e085
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_config.vhd
@@ -0,0 +1,74 @@
+-------------------------------------------------------------------------
+-- Project: SDRAM controller
+-- This file: User SDRAM component adjustments
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+package sdram_config is
+
+ constant DDR_DATA_WIDTH : positive := 16; -- External DDR-SDRAM Module data bus width
+ constant DDR_ADDR_WIDTH : positive := 13; -- number of address lines to DDR-SDRAM Device/Module
+ constant DDR_BANK_WIDTH : positive := 2; -- Number of BANK address lines of external DDR-SDRAM
+ constant DDR_ROW_ADDR_WIDTH : positive := 13; --
+ constant DDR_COL_ADDR_WIDTH : positive := 9; --
+
+ constant LMR_REG_BASE : natural := 0;
+ constant LMR_REG_EXTENDED : natural := 1;
+ constant LMR_OP_NORMAL : natural := 0;
+ constant LMR_OP_RES_DLL : natural := 2;
+ constant LMR_BT_SEQ : natural := 0;
+ constant LMR_BT_ILVD : natural := 1;
+ constant LMR_BL2 : natural := 1;
+ constant LMR_BL4 : natural := 2;
+ constant LMR_BL8 : natural := 3;
+ constant LMR_CL2 : natural := 2;
+ constant LMR_CL3 : natural := 3;
+ constant LMR_CL2_5 : natural := 6;
+
+ -- DDR SDRAM Hardware defined constants
+ constant BIT_AUTO_PRE : positive := 10; -- bit-position in column address for auto precharge (see Data Sheet)
+ constant BIT_PRE_ALL : positive := 10; -- bit-position in column address for precharge all (see Data Sheet)
+ constant ENABLE_PRE_ALL : std_logic := '1';
+ constant ENABLE_AUTO_PRE : std_logic := '0';
+
+ -- DDR-SDR TIMING constants ------------------------------------------------------------------
+ -- After REFRESH_CLOCKS a refresh cycle is necessary, 64ms / 8192 = max every 7.8125 us refesh
+ constant REFRESH_INTERVAL : real := 7.8125; -- us
+
+ -- These values are for your SDRAM part (see datasheet)
+ constant TCAS : positive := 2; -- CAS latency [clocks]
+ constant TRP : positive := 2; -- precharge command period
+ constant TRAS : positive := 4; -- active to precharge delay
+ constant TRFC : positive := 8; -- auto refresh command period
+ constant TMRD : positive := 2; -- load mode register command cylce time
+ constant TRCD : positive := 2; -- active to read or write delay !
+ constant TWR : positive := 2; -- write recovery time
+
+ constant PWR_UP_WAIT : natural := 1; -- µs
+
+ subtype user_tag_t is unsigned(3 downto 0);
+
+ ----------------------------------------------------------------------------------------------
+
+end sdram_config;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl.vhd
new file mode 100644
index 0000000..dbb5b80
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl.vhd
@@ -0,0 +1,487 @@
+-------------------------------------------------------------------------
+-- Project: SDRAM controller
+-- This file: SDRAM main controller and user I/F
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+use work.utils_pkg.all;
+
+entity sdram_ctrl is
+ Generic
+ (
+ f_sysclk : natural := 100E6;
+ BL : natural := 2
+ );
+ Port (
+ rst : in STD_LOGIC;
+ clk : in STD_LOGIC;
+ u_busy : out STD_LOGIC;
+ u_tag_in : in user_tag_t;
+ u_tag_out : out user_tag_t;
+ u_addr : in user_addr_t;
+ u_cmd : in user_cmd_t;
+ u_cmd_we : in STD_LOGIC;
+ col_addr : out col_addr_t;
+ sdr_cmd_busy : in STD_LOGIC;
+ sdr_cmd : out sdr_cmd_t;
+ sdr_cmd_we : out STD_LOGIC;
+ sdr_mode : out mode_word_t;
+ sdr_cke : out STD_LOGIC
+ );
+end sdram_ctrl;
+
+architecture behaviour of sdram_ctrl is
+
+ constant LMR_BURST_LEN : natural := NextExpBaseTwo(BL);
+
+ type ctrl_state_t is (RESET, POWER_WAIT, INIT, INIT_WAIT, USER_READY, USER_WRITE_PRE, USER_WRITE_ACT, USER_WRITE, USER_READ_PRE, USER_READ_ACT, USER_READ, REFRESH);
+ signal st_ctrl, st_ctrl_next : ctrl_state_t;
+
+ constant PWR_UP_CLOCK_INTERVAL : natural := PWR_UP_WAIT*(f_sysclk/1E6);
+ signal pwr_up_cnt : natural range 0 to PWR_UP_CLOCK_INTERVAL-1;
+ signal pwr_up_cnt_rst : std_logic;
+ signal pwr_up_finished : std_logic;
+
+ signal cycle_cnt : natural range 0 to 255;
+ signal cc_preset : natural range 0 to 255;
+ signal cc_load_en : std_logic;
+ signal cycle_finished : std_logic;
+
+ signal seq_cnt : natural range 0 to 31;
+ signal seq_rst_en : std_logic;
+ signal seq_cnt_en : std_logic;
+
+ constant REFRESH_CLOCK_INTERVAL : natural := natural(REFRESH_INTERVAL*real(f_sysclk)/1.0E6);
+ signal refresh_cnt : natural range 0 to REFRESH_CLOCK_INTERVAL-1;
+ signal refresh_request : std_logic;
+ signal refresh_cnt_rst : std_logic;
+
+ signal addr_reg_load_en : std_logic;
+
+ signal u_tag_reg : user_tag_t;
+ signal bank_addr_reg : bank_addr_t;
+ signal row_addr_reg : row_addr_t;
+ signal col_addr_reg : col_addr_t;
+
+ signal u_bank_addr : bank_addr_t;
+ signal u_row_addr : row_addr_t;
+ signal u_col_addr : col_addr_t;
+
+ signal act_request : std_logic;
+ signal act_request_set : std_logic;
+ signal act_request_clr : std_logic;
+
+ type init_seq_rom_t is array (0 to 14) of init_seq_t;
+
+ constant init_seq_rom : init_seq_rom_t :=
+ (
+ (
+ cmd => SD_NOP,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_PRE,
+ mode_word => "000010000000000",
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_NOP,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_LMR,
+ mode_word => to_unsigned(LMR_REG_EXTENDED, 2) & "0000000000010",
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_NOP,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_LMR,
+ mode_word => to_unsigned(LMR_REG_BASE, 2) & to_unsigned(LMR_OP_RES_DLL, 6) & to_unsigned(LMR_CL2, 3) & '0' & to_unsigned(LMR_BURST_LEN, 3),
+ wait_cycle => 200
+ ),
+ (
+ cmd => SD_NOP,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_PRE,
+ mode_word => "000010000000000",
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_NOP,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_AR,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_NOP,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_AR,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_NOP,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ ),
+ (
+ cmd => SD_LMR,
+ mode_word => to_unsigned(LMR_REG_BASE, 2) & to_unsigned(LMR_OP_NORMAL, 6) & to_unsigned(LMR_CL2, 3) & '0' & to_unsigned(LMR_BURST_LEN, 3),
+ wait_cycle => 200
+ ),
+ (
+ cmd => SD_NOP,
+ mode_word => (others => '0'),
+ wait_cycle => 0
+ )
+
+ );
+
+begin
+
+ u_row_addr <= u_addr(user_addr_t'left downto user_addr_t'left-row_addr_t'length+1);
+ u_bank_addr <= u_addr(user_addr_t'left-row_addr_t'length downto user_addr_t'left-row_addr_t'length-bank_addr_t'length+1);
+ u_col_addr <= u_addr(user_addr_t'left-row_addr_t'length-bank_addr_t'length downto 0);
+
+------------------------------------------------------------------------------------------
+fsm_ctrl_state:
+ process (st_ctrl, u_tag_in, u_tag_reg, u_cmd, u_cmd_we, sdr_cmd_busy, pwr_up_finished, seq_cnt, cycle_finished, u_bank_addr, u_row_addr, bank_addr_reg, row_addr_reg, u_col_addr, col_addr_reg, refresh_request, act_request)
+ begin
+
+ u_busy <= '1';
+ pwr_up_cnt_rst <= '0';
+ cc_preset <= init_seq_rom(seq_cnt).wait_cycle;
+ cc_load_en <= '0';
+ sdr_cmd <= init_seq_rom(seq_cnt).cmd;
+ sdr_cmd_we <= '0';
+ sdr_mode <= bank_addr_reg & row_addr_reg;
+ col_addr <= col_addr_reg;
+ sdr_cke <= '1';
+ seq_cnt_en <= '0';
+ seq_rst_en <= '0';
+ addr_reg_load_en <= '0';
+ refresh_cnt_rst <= '0';
+ act_request_set <= '0';
+ act_request_clr <= '0';
+ u_tag_out <= u_tag_reg;
+
+ st_ctrl_next <= st_ctrl;
+ case st_ctrl is
+ when RESET =>
+ sdr_cke <= '0';
+ pwr_up_cnt_rst <= '1';
+ st_ctrl_next <= POWER_WAIT;
+
+ when POWER_WAIT =>
+ sdr_cke <= '0';
+ if pwr_up_finished = '1' then
+ seq_rst_en <= '1';
+ st_ctrl_next <= INIT;
+ end if;
+
+ when INIT =>
+ sdr_mode <= init_seq_rom(seq_cnt).mode_word;
+ sdr_cmd <= init_seq_rom(seq_cnt).cmd;
+ cc_preset <= init_seq_rom(seq_cnt).wait_cycle;
+ if seq_cnt = init_seq_rom_t'high then
+ act_request_set <= '1';
+ refresh_cnt_rst <= '1';
+ st_ctrl_next <= USER_READY;
+ elsif sdr_cmd_busy = '0' then
+ cc_load_en <= '1';
+ sdr_cmd_we <= '1';
+ st_ctrl_next <= INIT_WAIT;
+ end if;
+
+ when INIT_WAIT =>
+ if sdr_cmd_busy = '0' and cycle_finished = '1' then
+ seq_cnt_en <= '1';
+ st_ctrl_next <= INIT;
+ end if;
+
+ when USER_READY =>
+ if sdr_cmd_busy = '0' then
+ if refresh_request = '1' then
+ sdr_mode(BIT_PRE_ALL) <= '1';
+ sdr_cmd_we <= '1';
+ sdr_cmd <= SD_PRE;
+ st_ctrl_next <= REFRESH;
+ else
+ u_busy <= '0';
+ if u_cmd_we = '1' then
+ case u_cmd is
+ when UCMD_NOP =>
+ sdr_cmd <= SD_NOP;
+ when UCMD_LMR =>
+ sdr_cmd <= SD_NOP;
+ when UCMD_WRITE =>
+ col_addr <= u_col_addr;
+ u_tag_out <= u_tag_in;
+ sdr_mode(BIT_AUTO_PRE) <= ENABLE_AUTO_PRE;
+ addr_reg_load_en <= '1';
+ act_request_clr <= '1';
+ sdr_cmd <= SD_WRITE;
+ if (u_row_addr /= row_addr_reg) or act_request = '1' then
+ st_ctrl_next <= USER_WRITE_PRE;
+ elsif (u_bank_addr /= bank_addr_reg) then
+ if ENABLE_PRE_ALL = '1' then
+ st_ctrl_next <= USER_WRITE_ACT;
+ else
+ st_ctrl_next <= USER_WRITE_PRE;
+ end if;
+ elsif sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ else
+ st_ctrl_next <= USER_WRITE;
+ end if;
+ when UCMD_READ =>
+ col_addr <= u_col_addr;
+ u_tag_out <= u_tag_in;
+ sdr_mode(BIT_AUTO_PRE) <= ENABLE_AUTO_PRE;
+ addr_reg_load_en <= '1';
+ act_request_clr <= '1';
+ sdr_cmd <= SD_READ;
+ if (u_row_addr /= row_addr_reg) or act_request = '1' then
+ st_ctrl_next <= USER_READ_PRE;
+ elsif (u_bank_addr /= bank_addr_reg) then
+ if ENABLE_PRE_ALL = '1' then
+ st_ctrl_next <= USER_READ_ACT;
+ else
+ st_ctrl_next <= USER_READ_PRE;
+ end if;
+ elsif sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ else
+ st_ctrl_next <= USER_READ;
+ end if;
+ when others => null;
+ end case;
+ end if;
+ end if;
+ end if;
+
+ when USER_WRITE_PRE =>
+ sdr_cmd <= SD_PRE;
+ sdr_mode(BIT_PRE_ALL) <= ENABLE_PRE_ALL;
+ if sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ st_ctrl_next <= USER_WRITE_ACT;
+ end if;
+
+ when USER_WRITE_ACT =>
+ sdr_cmd <= SD_ACT;
+ if sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ st_ctrl_next <= USER_WRITE;
+ end if;
+
+ when USER_WRITE =>
+ sdr_cmd <= SD_WRITE;
+ sdr_mode(BIT_AUTO_PRE) <= ENABLE_AUTO_PRE;
+ if sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ st_ctrl_next <= USER_READY;
+ end if;
+
+ when USER_READ_PRE =>
+ sdr_cmd <= SD_PRE;
+ sdr_mode(BIT_PRE_ALL) <= ENABLE_PRE_ALL;
+ if sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ st_ctrl_next <= USER_READ_ACT;
+ end if;
+
+ when USER_READ_ACT =>
+ sdr_cmd <= SD_ACT;
+ if sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ st_ctrl_next <= USER_READ;
+ end if;
+
+ when USER_READ =>
+ sdr_cmd <= SD_READ;
+ sdr_mode(BIT_AUTO_PRE) <= ENABLE_AUTO_PRE;
+ if sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ st_ctrl_next <= USER_READY;
+ end if;
+
+ when REFRESH =>
+ sdr_cmd <= SD_AR;
+ if sdr_cmd_busy = '0' then
+ sdr_cmd_we <= '1';
+ st_ctrl_next <= USER_READY;
+ refresh_cnt_rst <= '1';
+ act_request_set <= '1';
+ end if;
+
+ when others =>
+ st_ctrl_next <= RESET;
+ end case;
+
+ end process;
+
+fsm_ctrl_state_next:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ st_ctrl <= RESET;
+ elsif rising_edge(clk) then
+ st_ctrl <= st_ctrl_next;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+act_request_register:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ act_request <= '1';
+ elsif rising_edge(clk) then
+ if act_request_set = '1' then
+ act_request <= '1';
+ elsif act_request_clr = '1' then
+ act_request <= '0';
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+user_addr_register:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ bank_addr_reg <= (others => '0');
+ row_addr_reg <= (others => '0');
+ col_addr_reg <= (others => '0');
+ u_tag_reg <= (others => '0');
+ elsif rising_edge(clk) then
+ if addr_reg_load_en = '1' then
+ bank_addr_reg <= u_bank_addr;
+ row_addr_reg <= u_row_addr;
+ col_addr_reg <= u_col_addr;
+ u_tag_reg <= u_tag_in;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+power_up_counter:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ pwr_up_cnt <= 0;
+ pwr_up_finished <= '0';
+ elsif rising_edge(clk) then
+ pwr_up_finished <= '0';
+ if pwr_up_cnt_rst = '1' then
+ pwr_up_cnt <= PWR_UP_CLOCK_INTERVAL-1;
+ else
+ if pwr_up_cnt /= 0 then
+ pwr_up_cnt <= pwr_up_cnt - 1;
+ else
+ pwr_up_finished <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+
+------------------------------------------------------------------------------------------
+refresh_counter:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ refresh_cnt <= 0;
+ refresh_request <= '0';
+ elsif rising_edge(clk) then
+ refresh_request <= '0';
+ if refresh_cnt_rst = '1' then
+ refresh_cnt <= REFRESH_CLOCK_INTERVAL-1;
+ else
+ if refresh_cnt /= 0 then
+ refresh_cnt <= refresh_cnt - 1;
+ else
+ refresh_request <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+cycle_counter:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ cycle_cnt <= 0;
+ cycle_finished <= '0';
+ elsif rising_edge(clk) then
+ cycle_finished <= '0';
+ if cc_load_en = '1' then
+ cycle_cnt <= cc_preset;
+ elsif cycle_cnt /= 0 then
+ cycle_cnt <= cycle_cnt - 1;
+ else
+ cycle_finished <= '1';
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+seq_counter:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ seq_cnt <= 0;
+ elsif rising_edge(clk) then
+ if seq_rst_en = '1' then
+ seq_cnt <= 0;
+ elsif seq_cnt_en = '1' then
+ if seq_cnt /= init_seq_rom_t'high then
+ seq_cnt <= seq_cnt + 1;
+ end if;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+end behaviour;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl_frontend.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl_frontend.vhd
new file mode 100644
index 0000000..98dea2a
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl_frontend.vhd
@@ -0,0 +1,277 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: cpu_embedded using cpu_core and rom
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.fifo_ctrl_pkg.all;
+use work.sdram_config.all;
+use work.sdram_types.all;
+
+entity sdram_ctrl_frontend is
+ Generic
+ (
+ BL : natural := 2;
+ f_sysclk : natural := 100E6;
+ read_phaseshift : integer := 0;
+ fifo_depth : integer := 4
+ );
+ Port
+ (
+ sys_rst_in : in STD_LOGIC;
+ sys_clk_in : in STD_LOGIC;
+ sys_rst_out : out STD_LOGIC;
+ sys_clk_out : out STD_LOGIC;
+ sys_clk_fb : in STD_LOGIC;
+
+ -- User interface
+ busy : out STD_LOGIC;
+ en : in STD_LOGIC;
+ r_wn : in STD_LOGIC;
+ be : in unsigned(SDR_DM_WIDTH-1 downto 0);
+ addr : in user_addr_t;
+ din : in unsigned(SDR_DATA_WIDTH-1 downto 0);
+ dout : out unsigned(SDR_DATA_WIDTH-1 downto 0);
+ dout_re : in STD_LOGIC;
+ dout_vld : out STD_LOGIC;
+
+ -- SDRAM signals
+ sd_clk_p : out STD_LOGIC;
+ sd_clk_n : out STD_LOGIC;
+ sd_cke : out STD_LOGIC;
+ sd_cs_n : out STD_LOGIC;
+ sd_cas_n : out STD_LOGIC;
+ sd_ras_n : out STD_LOGIC;
+ sd_we_n : out STD_LOGIC;
+ sd_addr : out sdr_addr_t;
+ sd_ba : out sdr_ba_t;
+ sd_dm : out unsigned(DDR_DM_WIDTH-1 downto 0);
+ sd_dqs : inout unsigned(DDR_DQS_WIDTH-1 downto 0);
+ sd_data : inout unsigned(DDR_DATA_WIDTH-1 downto 0)
+
+ );
+end sdram_ctrl_frontend;
+
+architecture struct of sdram_ctrl_frontend is
+
+ -- Number of user data words for simulation
+ signal rst_out : std_logic;
+ signal clk_out : std_logic;
+
+ signal u_addr : user_addr_t;
+ signal u_tag_in : user_tag_t;
+ signal u_tag_rd : user_tag_t;
+ signal u_tag_wr : user_tag_t;
+ signal u_cmd : user_cmd_t;
+ signal u_cmd_we : std_logic;
+ signal u_busy : std_logic;
+ signal u_data_w : unsigned(SDR_DATA_WIDTH-1 downto 0);
+ signal u_dm : unsigned(SDR_DM_WIDTH-1 downto 0);
+ signal u_data_r : unsigned(SDR_DATA_WIDTH-1 downto 0);
+ signal u_data_vld : std_logic;
+ signal u_req_wr : std_logic;
+
+ constant CAT_FIFO_WIDTH : integer := user_cmd_t'length + user_tag_t'length + DDR_ROW_ADDR_WIDTH + DDR_BANK_WIDTH + DDR_COL_ADDR_WIDTH;
+ signal cat_fifo_din : unsigned(CAT_FIFO_WIDTH-1 downto 0);
+ signal cat_fifo_dout : unsigned(CAT_FIFO_WIDTH-1 downto 0);
+ signal cat_fifo_re : std_logic;
+ signal cat_fifo_we : std_logic;
+ signal cat_fifo_full : std_logic;
+ signal cat_fifo_empty : std_logic;
+-- signal cat_fifo_almost_full : std_logic;
+-- signal cat_fifo_almost_empty : std_logic;
+
+ signal write_fifo_din : unsigned(SDR_DATA_WIDTH+SDR_DM_WIDTH-1 downto 0);
+ signal write_fifo_dout : unsigned(SDR_DATA_WIDTH+SDR_DM_WIDTH-1 downto 0);
+ signal write_fifo_re : std_logic;
+ signal write_fifo_we : std_logic;
+ signal write_fifo_full : std_logic;
+ signal write_fifo_empty : std_logic;
+-- signal write_fifo_almost_full : std_logic;
+-- signal write_fifo_almost_empty : std_logic;
+
+ signal read_fifo_din : unsigned(SDR_DATA_WIDTH-1 downto 0);
+ signal read_fifo_dout : unsigned(SDR_DATA_WIDTH-1 downto 0);
+ signal read_fifo_re : std_logic;
+ signal read_fifo_we : std_logic;
+ signal read_fifo_full : std_logic;
+ signal read_fifo_empty : std_logic;
+-- signal read_fifo_almost_full : std_logic;
+-- signal read_fifo_almost_empty : std_logic;
+
+ alias cmd_fifo_in is cat_fifo_din(CAT_FIFO_WIDTH-1 downto CAT_FIFO_WIDTH-user_cmd_t'length);
+ alias tag_fifo_in is cat_fifo_din(CAT_FIFO_WIDTH-user_cmd_t'length-1 downto CAT_FIFO_WIDTH-user_cmd_t'length-user_tag_t'length);
+ alias addr_fifo_in is cat_fifo_din(CAT_FIFO_WIDTH-user_cmd_t'length-user_tag_t'length-1 downto 0);
+ alias cmd_fifo_out is cat_fifo_dout(CAT_FIFO_WIDTH-1 downto CAT_FIFO_WIDTH-user_cmd_t'length);
+ alias tag_fifo_out is cat_fifo_dout(CAT_FIFO_WIDTH-user_cmd_t'length-1 downto CAT_FIFO_WIDTH-user_cmd_t'length-user_tag_t'length);
+ alias addr_fifo_out is cat_fifo_dout(CAT_FIFO_WIDTH-user_cmd_t'length-user_tag_t'length-1 downto 0);
+ alias write_fifo_dm_in is write_fifo_din(write_fifo_din'length-1 downto write_fifo_din'length-SDR_DM_WIDTH);
+ alias write_fifo_data_in is write_fifo_din(write_fifo_din'length-SDR_DM_WIDTH-1 downto 0);
+ alias write_fifo_dm_out is write_fifo_dout(write_fifo_dout'length-1 downto write_fifo_dout'length-SDR_DM_WIDTH);
+ alias write_fifo_data_out is write_fifo_dout(write_fifo_dout'length-SDR_DM_WIDTH-1 downto 0);
+
+begin
+
+ -- Instantiate synchronous FIFO
+ inst_cat_fifo: entity work.fifo_sync
+ GENERIC MAP
+ (
+ addr_width => fifo_depth,
+ data_width => CAT_FIFO_WIDTH
+ )
+ PORT MAP
+ (
+ rst => rst_out,
+ clk => clk_out,
+ we => cat_fifo_we,
+ re => cat_fifo_re,
+ fifo_full => cat_fifo_full,
+ fifo_empty => cat_fifo_empty,
+ fifo_afull => open,
+ fifo_aempty => open,
+ data_w => cat_fifo_din,
+ data_r => cat_fifo_dout
+ );
+
+ -- Instantiate synchronous FIFO
+ inst_write_fifo: entity work.fifo_sync
+ GENERIC MAP
+ (
+ addr_width => fifo_depth,
+ data_width => 2*DDR_DATA_WIDTH + SDR_DM_WIDTH
+ )
+ PORT MAP
+ (
+ rst => rst_out,
+ clk => clk_out,
+ we => write_fifo_we,
+ re => write_fifo_re,
+ fifo_full => write_fifo_full,
+ fifo_empty => write_fifo_empty,
+ fifo_afull => open,
+ fifo_aempty => open,
+ data_w => write_fifo_din,
+ data_r => write_fifo_dout
+ );
+
+ -- Instantiate synchronous FIFO
+ inst_read_fifo: entity work.fifo_sync
+ GENERIC MAP
+ (
+ addr_width => fifo_depth,
+ data_width => 2*DDR_DATA_WIDTH
+ )
+ PORT MAP
+ (
+ rst => rst_out,
+ clk => clk_out,
+ we => read_fifo_we,
+ re => read_fifo_re,
+ fifo_full => read_fifo_full,
+ fifo_empty => read_fifo_empty,
+ fifo_afull => open,
+ fifo_aempty => open,
+ data_w => read_fifo_din,
+ data_r => read_fifo_dout
+ );
+
+ -- DDR SDRAM Controller Core
+ inst_sdram_ctrl : entity work.sdram_ctrl_top
+ Generic map
+ (
+ BL => BL,
+ read_phaseshift => read_phaseshift,
+ f_sysclk => f_sysclk
+ )
+ Port map
+ (
+
+ sys_rst_in => sys_rst_in,
+ sys_clk_in => sys_clk_in,
+
+ sys_rst_out => rst_out,
+ sys_clk_out => clk_out,
+ sys_clk_fb => sys_clk_fb,
+
+ -- User interface
+ u_data_vld => u_data_vld,
+ u_data_req_w => u_req_wr,
+ u_data_req_r => open,
+ u_tag_in => u_tag_in,
+ u_tag_rd => u_tag_rd,
+ u_tag_wr => u_tag_wr,
+ u_busy => u_busy,
+ u_addr => u_addr,
+ u_cmd => u_cmd,
+ u_cmd_we => u_cmd_we,
+ u_data_wr => u_data_w,
+ u_data_rd => u_data_r,
+ u_dm => u_dm,
+
+ -- SDRAM signals
+ sd_clk_p => sd_clk_p,
+ sd_clk_n => sd_clk_n,
+ sd_cke => sd_cke,
+ sd_cs_n => sd_cs_n,
+ sd_cas_n => sd_cas_n,
+ sd_ras_n => sd_ras_n,
+ sd_we_n => sd_we_n,
+ sd_addr => sd_addr,
+ sd_ba => sd_ba,
+ sd_dm => sd_dm,
+ sd_dqs => sd_dqs,
+ sd_data => sd_data
+
+ );
+
+------------------------------------------------------------------------------------------
+ sys_rst_out <= rst_out;
+ sys_clk_out <= clk_out;
+
+ busy <= cat_fifo_full or write_fifo_full or read_fifo_full;
+ write_fifo_we <= en and not r_wn and not write_fifo_full and not cat_fifo_full and not read_fifo_full;
+ write_fifo_data_in <= din;
+ write_fifo_dm_in <= not be;
+ cat_fifo_we <= en and not cat_fifo_full and not write_fifo_full and not read_fifo_full;
+ cmd_fifo_in <= UCMD_WRITE when r_wn = '0' else UCMD_READ;
+ addr_fifo_in <= addr;
+ tag_fifo_in <= (others=>'0');
+ dout <= read_fifo_dout;
+ dout_vld <= not read_fifo_empty;
+
+ u_cmd_we <= (not cat_fifo_empty) and (not u_busy);
+ u_cmd <= cmd_fifo_out;
+ u_addr <= addr_fifo_out;
+ u_dm <= write_fifo_dm_out;
+ u_tag_in <= tag_fifo_out;
+
+ write_fifo_re <= u_req_wr and (not write_fifo_empty);
+ cat_fifo_re <= u_cmd_we;
+ u_data_w <= write_fifo_data_out;
+ read_fifo_re <= (not read_fifo_empty) and dout_re;
+ read_fifo_we <= u_data_vld;
+ read_fifo_din <= u_data_r;
+
+
+end architecture struct;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl_top.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl_top.vhd
new file mode 100644
index 0000000..ba9ee71
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_ctrl_top.vhd
@@ -0,0 +1,285 @@
+-------------------------------------------------------------------------
+-- Project: SDRAM controller
+-- This file: Top-level put all together
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+
+entity sdram_ctrl_top is
+ Generic
+ (
+ BL : natural := 2;
+ f_sysclk : natural := 100E6;
+ read_phaseshift : integer := 0
+ );
+ Port
+ (
+ sys_rst_in : in STD_LOGIC;
+ sys_clk_in : in STD_LOGIC;
+ sys_rst_out : out STD_LOGIC;
+ sys_clk_out : out STD_LOGIC;
+ sys_clk_fb : in STD_LOGIC;
+
+ -- User interface
+ u_data_vld : out STD_LOGIC;
+ u_data_req_w : out STD_LOGIC;
+ u_data_req_r : out STD_LOGIC;
+ u_busy : out STD_LOGIC;
+ u_tag_in : in user_tag_t;
+ u_tag_rd : out user_tag_t;
+ u_tag_wr : out user_tag_t;
+ u_addr : in user_addr_t;
+ u_cmd : in user_cmd_t;
+ u_cmd_we : in STD_LOGIC;
+ u_data_wr : in unsigned(SDR_DATA_WIDTH-1 downto 0);
+ u_dm : in unsigned(SDR_DM_WIDTH-1 downto 0);
+ u_data_rd : out unsigned(SDR_DATA_WIDTH-1 downto 0);
+
+ -- SDRAM signals
+ sd_clk_p : out STD_LOGIC;
+ sd_clk_n : out STD_LOGIC;
+ sd_cke : out STD_LOGIC;
+ sd_cs_n : out STD_LOGIC;
+ sd_cas_n : out STD_LOGIC;
+ sd_ras_n : out STD_LOGIC;
+ sd_we_n : out STD_LOGIC;
+ sd_addr : out sdr_addr_t;
+ sd_ba : out sdr_ba_t;
+ sd_dm : out unsigned(DDR_DM_WIDTH-1 downto 0);
+ sd_dqs : inout unsigned(DDR_DQS_WIDTH-1 downto 0);
+ sd_data : inout unsigned(DDR_DATA_WIDTH-1 downto 0)
+
+ );
+end sdram_ctrl_top;
+
+architecture rtl of sdram_ctrl_top is
+
+ signal clk0 : std_logic;
+ signal clk270 : std_logic;
+ signal read_clk270 : std_logic;
+
+ signal phy_ctrl : phy_ctrl_t;
+
+ signal u_tag : user_tag_t;
+ signal sd_cmd_in : sdr_cmd_t;
+ signal sd_cmd : sdr_cmd_t;
+ signal sd_cmd_we : std_logic;
+ signal cmd_ctrl : sdr_cmd_lines_t;
+ signal cke : std_logic;
+ signal ba : unsigned(DDR_BANK_WIDTH-1 downto 0);
+ signal addr : unsigned(DDR_ADDR_WIDTH-1 downto 0);
+
+ -- Clock generator
+
+ signal cg_rst : std_logic;
+ signal cg_read_clk0 : std_logic;
+ signal cg_read_clk270 : std_logic;
+ signal cg_sys_clk0 : std_logic;
+ signal cg_sys_clk270 : std_logic;
+ signal cg_locked : std_logic;
+ signal cg_error : std_logic;
+ signal ctrl_rst : std_logic;
+ signal part_ctrl : part_ctrl_t;
+
+ -- SD command FIFO
+
+ constant CMD_FIFO_ADDR_WIDTH : positive := 2;
+ constant CMD_FIFO_DATA_WIDTH : positive := user_tag_t'length + 4 + mode_word_t'length + col_addr_t'length;
+ signal cmd_fifo_din : unsigned(CMD_FIFO_DATA_WIDTH-1 downto 0);
+ signal cmd_fifo_dout : unsigned(CMD_FIFO_DATA_WIDTH-1 downto 0);
+ signal cmd_fifo_re : std_logic;
+ signal cmd_fifo_we : std_logic;
+ signal cmd_fifo_full : std_logic;
+ signal cmd_fifo_empty : std_logic;
+
+ alias tag_fifo_in is cmd_fifo_din(CMD_FIFO_DATA_WIDTH-1 downto CMD_FIFO_DATA_WIDTH-user_tag_t'length);
+ alias cmd_fifo_in is cmd_fifo_din(CMD_FIFO_DATA_WIDTH-user_tag_t'length-1 downto CMD_FIFO_DATA_WIDTH-user_tag_t'length-4);
+ alias mode_fifo_in is cmd_fifo_din(CMD_FIFO_DATA_WIDTH-user_tag_t'length-4-1 downto CMD_FIFO_DATA_WIDTH-user_tag_t'length-4-mode_word_t'length);
+ alias col_fifo_in is cmd_fifo_din(CMD_FIFO_DATA_WIDTH-user_tag_t'length-4-mode_word_t'length-1 downto 0);
+
+ alias tag_fifo_out is cmd_fifo_dout(CMD_FIFO_DATA_WIDTH-1 downto CMD_FIFO_DATA_WIDTH-user_tag_t'length);
+ alias cmd_fifo_out is cmd_fifo_dout(CMD_FIFO_DATA_WIDTH-user_tag_t'length-1 downto CMD_FIFO_DATA_WIDTH-user_tag_t'length-4);
+ alias mode_fifo_out is cmd_fifo_dout(CMD_FIFO_DATA_WIDTH-user_tag_t'length-4-1 downto CMD_FIFO_DATA_WIDTH-user_tag_t'length-4-mode_word_t'length);
+ alias col_fifo_out is cmd_fifo_dout(CMD_FIFO_DATA_WIDTH-user_tag_t'length-4-mode_word_t'length-1 downto 0);
+
+begin
+
+ ---------------------------------
+ clk0 <= cg_sys_clk0;
+ clk270 <= cg_sys_clk270;
+ read_clk270 <= cg_read_clk270;
+ cg_rst <= not cg_locked;
+
+ ---------------------------------
+ sys_clk_out <= cg_sys_clk0;
+ sys_rst_out <= ctrl_rst;
+
+ ---------------------------------
+ part_ctrl.cmd <= cmd_ctrl;
+ part_ctrl.ba <= ba;
+ part_ctrl.addr <= addr;
+ part_ctrl.cke <= cke;
+
+ ---------------------------------
+ sd_cmd_we <= not cmd_fifo_empty;
+ cmd_fifo_in <= to_unsigned(sd_cmd_in, 4);
+ sd_cmd <= sdr_cmd_t(to_integer(cmd_fifo_out));
+
+ ---------------------------------
+ inst_reset: entity work.reset
+ port map
+ (
+ clk => clk0,
+ rst_in => cg_rst,
+ rst_out => ctrl_rst
+ );
+
+ inst_clockgen : entity work.clockgen
+ generic map
+ (
+ read_phaseshift => read_phaseshift,
+ frequency_hz => f_sysclk
+ )
+ port map
+ (
+ rst => sys_rst_in,
+ clk_in => sys_clk_in,
+ clk_fb_in => sys_clk_fb,
+ read_clk0_out => cg_read_clk0,
+ read_clk270_out => cg_read_clk270,
+ sys_clk0_out => cg_sys_clk0,
+ sys_clk270_out => cg_sys_clk270,
+ locked_out => cg_locked,
+ error_out => cg_error
+ );
+
+ -- Main controller
+ inst_sdram_ctrl : entity work.sdram_ctrl
+ Generic map
+ (
+ f_sysclk => 100E6,
+ BL => BL
+ )
+ Port map
+ (
+ rst => ctrl_rst,
+ clk => clk0,
+ u_busy => u_busy,
+ u_tag_in => u_tag_in,
+ u_tag_out => tag_fifo_in,
+ u_cmd => u_cmd,
+ u_cmd_we => u_cmd_we,
+ u_addr => u_addr,
+ sdr_cmd_busy => cmd_fifo_full,
+ sdr_cmd => sd_cmd_in,
+ sdr_cmd_we => cmd_fifo_we,
+ col_addr => col_fifo_in,
+ sdr_mode => mode_fifo_in,
+ sdr_cke => cke
+ );
+
+ -- Instantiate synchronous FIFO
+ inst_sd_cmd_fifo: entity work.fifo_sync
+ GENERIC MAP
+ (
+ addr_width => CMD_FIFO_ADDR_WIDTH,
+ data_width => CMD_FIFO_DATA_WIDTH,
+ almost_full_thresh => 2**(CMD_FIFO_ADDR_WIDTH-1),
+ almost_empty_thresh => 2**(CMD_FIFO_ADDR_WIDTH-1)
+ )
+ PORT MAP
+ (
+ rst => ctrl_rst,
+ clk => clk0,
+ we => cmd_fifo_we,
+ re => cmd_fifo_re,
+ fifo_full => cmd_fifo_full,
+ fifo_empty => cmd_fifo_empty,
+ fifo_afull => open,
+ fifo_aempty => open,
+ data_w => cmd_fifo_din,
+ data_r => cmd_fifo_dout
+ );
+
+ -- DDR SDRAM command fsm
+ inst_sdram_cmd : entity work.sdram_cmd
+ Generic map
+ (
+ BL => BL
+ )
+ Port map
+ (
+ rst => ctrl_rst,
+ clk => clk0,
+ u_tag_in => tag_fifo_out,
+ u_tag_out => u_tag,
+ phy_ctrl => phy_ctrl,
+ enable => cke,
+ cmd => sd_cmd,
+ cmd_we => sd_cmd_we,
+ cmd_ack => cmd_fifo_re,
+ sdr_cmd_ctrl => cmd_ctrl,
+ col_addr => col_fifo_out,
+ mode_word => mode_fifo_out,
+ sdr_ba => ba,
+ sdr_addr => addr
+ );
+
+ -- DDR phy
+ inst_ddr_phy : entity work.ddr_phy
+ Port map
+ (
+ sys_rst => ctrl_rst,
+ sys_clk0 => clk0,
+ sys_clk270 => clk270,
+ u_tag_in => u_tag,
+ u_tag_rd => u_tag_rd,
+ u_tag_wr => u_tag_wr,
+ read_clk => read_clk270,
+ phy_ctrl => phy_ctrl,
+ part_ctrl => part_ctrl,
+ sdr_data_req_w => u_data_req_w,
+ sdr_data_req_r => u_data_req_r,
+ sdr_data_w => u_data_wr,
+ sdr_dm => u_dm,
+ sdr_data_r => u_data_rd,
+ sdr_data_vld => u_data_vld,
+ part_clk_p => sd_clk_p,
+ part_clk_n => sd_clk_n,
+ part_addr => sd_addr,
+ part_ba => sd_ba,
+ part_dm => sd_dm,
+ part_dqs => sd_dqs,
+ part_data => sd_data,
+ part_cs_n => sd_cs_n,
+ part_we_n => sd_we_n,
+ part_cas_n => sd_cas_n,
+ part_ras_n => sd_ras_n,
+ part_cke => sd_cke
+ );
+
+end architecture rtl;
+
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/sdram_types.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_types.vhd
new file mode 100644
index 0000000..d235d75
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/sdram_types.vhd
@@ -0,0 +1,133 @@
+-------------------------------------------------------------------------
+-- Project: SDRAM controller
+-- This file: Type definitions
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+use work.sdram_config.all;
+
+package sdram_types is
+
+ -----------------------------------------------------------------------------------------
+ -- Table of Timing Parameters as a function of operation
+
+ -- Derived constants from sdram_config
+
+ constant DDR_DQS_WIDTH : positive := DDR_DATA_WIDTH / 8; -- Number of data strobe lines
+ constant DDR_DM_WIDTH : positive := DDR_DATA_WIDTH / 8; -- Number of Data Mask Lines
+ constant SDR_DATA_WIDTH : positive := 2*DDR_DATA_WIDTH; --
+ constant SDR_DM_WIDTH : positive := 2*DDR_DM_WIDTH; --
+
+ subtype user_cmd_t is unsigned(1 downto 0);
+ constant UCMD_NOP : user_cmd_t := "00";
+ constant UCMD_READ : user_cmd_t := "01";
+ constant UCMD_WRITE : user_cmd_t := "10";
+ constant UCMD_LMR : user_cmd_t := "11";
+
+ subtype sdr_cmd_t is natural range 0 to 9;
+ constant SD_DESELECT : sdr_cmd_t := 0;
+ constant SD_NOP : sdr_cmd_t := 1;
+ constant SD_LMR : sdr_cmd_t := 2;
+ constant SD_ACT : sdr_cmd_t := 3;
+ constant SD_READ : sdr_cmd_t := 4;
+ constant SD_WRITE : sdr_cmd_t := 5;
+ constant SD_PRE : sdr_cmd_t := 6;
+ constant SD_BST : sdr_cmd_t := 7;
+ constant SD_AR : sdr_cmd_t := 8;
+ constant SD_SR : sdr_cmd_t := 9;
+
+ type sdr_state_t is (PWR_DOWN, PRECHARGE, MODE, IDLE, ROW_ACT, WRITE, WRITE_A, READ, READ_A, BURST_STOP, SELF_REF, AUTO_REF, PRE_PWR_DOWN, ACT_PWR_DOWN);
+ subtype user_addr_t is unsigned(DDR_BANK_WIDTH+DDR_ROW_ADDR_WIDTH+DDR_COL_ADDR_WIDTH-1 downto 0);
+ subtype sdr_addr_t is unsigned(DDR_ADDR_WIDTH-1 downto 0);
+ subtype sdr_ba_t is unsigned(DDR_BANK_WIDTH-1 downto 0);
+ subtype mode_word_t is unsigned(DDR_ADDR_WIDTH+DDR_BANK_WIDTH-1 downto 0);
+
+ subtype bank_addr_t is unsigned(DDR_BANK_WIDTH-1 downto 0);
+ subtype row_addr_t is unsigned(DDR_ADDR_WIDTH-1 downto 0);
+ subtype col_addr_t is unsigned(8 downto 0);
+
+ subtype cycle_cnt_t is natural range 0 to 10;
+
+ type phy_ctrl_t is
+ record
+ drive_en : std_logic;
+ re : std_logic;
+ we : std_logic;
+ utag_we : std_logic;
+ end record phy_ctrl_t;
+
+ type sdr_cmd_lines_t is
+ record
+ cs_n : std_logic;
+ ras_n : std_logic;
+ cas_n : std_logic;
+ we_n : std_logic;
+ end record sdr_cmd_lines_t;
+
+ type part_ctrl_t is
+ record
+ cmd : sdr_cmd_lines_t;
+ ba : unsigned(DDR_BANK_WIDTH-1 downto 0);
+ addr : unsigned(DDR_ADDR_WIDTH-1 downto 0);
+ cke : std_logic;
+ end record part_ctrl_t;
+
+ type part_cmd_array_t is array (sdr_cmd_t) of sdr_cmd_lines_t;
+ constant COMMAND : part_cmd_array_t :=
+ -- command cs_n ras_qn cas_qn we_qn
+ ( SD_DESELECT => ( '1', '1', '1', '1'),
+ SD_NOP => ( '0', '1', '1', '1'),
+ SD_LMR => ( '0', '0', '0', '0'),
+ SD_ACT => ( '0', '0', '1', '1'),
+ SD_READ => ( '0', '1', '0', '1'),
+ SD_WRITE => ( '0', '1', '0', '0'),
+ SD_PRE => ( '0', '0', '1', '0'),
+ SD_BST => ( '0', '1', '1', '0'),
+ SD_AR => ( '0', '0', '0', '1'),
+ SD_SR => ( '0', '0', '0', '1')
+ );
+
+ type part_timing_array_t is array (sdr_cmd_t) of cycle_cnt_t;
+ constant TIMING : part_timing_array_t :=
+ -- command cycle_cnt
+ ( SD_DESELECT => ( 0 ),
+ SD_NOP => ( 0 ),
+ SD_LMR => ( TMRD-1 ),
+ SD_ACT => ( TRCD-1 ),
+ SD_READ => ( TCAS-1 ),
+ SD_WRITE => ( TWR-1 ),
+ SD_PRE => ( TRP-1 ),
+ SD_BST => ( 0 ),
+ SD_AR => ( TRFC-1 ),
+ SD_SR => ( TRFC-1 )
+ );
+
+ type init_seq_t is
+ record
+ cmd : sdr_cmd_t;
+ mode_word : mode_word_t;
+ wait_cycle : natural;
+ end record init_seq_t;
+
+end sdram_types;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl.vhd
new file mode 100644
index 0000000..cc18253
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl.vhd
@@ -0,0 +1,332 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: cpu_embedded using cpu_core and rom
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+use work.utils_pkg.all;
+
+entity tb_sdr_ctrl is
+end;
+
+architecture struct of tb_sdr_ctrl is
+
+ -- Number of user data words for simulation
+ constant CLK_PERIOD : time := 10 ns;
+ constant BURST_LEN : natural := 8;
+
+ signal rst : std_logic := '1';
+ signal clk : std_logic := '0';
+ signal rst_out : std_logic;
+ signal clk_out : std_logic;
+ signal clk_fb : std_logic;
+ signal part_clk_p : std_logic;
+ signal part_clk_n : std_logic;
+ signal part_cke : std_logic;
+ signal part_cs_n : std_logic;
+ signal part_we_n : std_logic;
+ signal part_ras_n : std_logic;
+ signal part_cas_n : std_logic;
+ signal part_ba : unsigned(DDR_BANK_WIDTH-1 downto 0) := (others => '0');
+ signal part_dm : unsigned(DDR_DM_WIDTH-1 downto 0) := (others => '0');
+ signal part_dqs : unsigned(DDR_DQS_WIDTH-1 downto 0) := (others => '0');
+ signal part_addr : unsigned(DDR_ADDR_WIDTH-1 downto 0) := (others => '0');
+ signal part_data : unsigned(DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ signal u_addr : user_addr_t := (others => '0');
+ signal u_tag_in : user_tag_t := "0000";
+ signal u_tag_rd : user_tag_t;
+ signal u_tag_wr : user_tag_t;
+ signal u_cmd : user_cmd_t := UCMD_NOP;
+ signal u_cmd_we : std_logic := '0';
+ signal u_busy : std_logic;
+ signal u_data_w : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_dm : unsigned(2*DDR_DM_WIDTH-1 downto 0) := "0000";
+ signal u_data_r : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_data_vld : std_logic;
+ signal u_req_wr : std_logic;
+ signal u_req_rd : std_logic;
+ signal u_read_en : std_logic := '0';
+ signal u_write_en : std_logic := '0';
+ signal u_addr_cnt_en : std_logic := '0';
+ signal u_addr_load : std_logic := '0';
+ signal u_addr_preset : user_addr_t := (others => '0');
+ signal u_addr_end : user_addr_t := (others => '0');
+ signal ref_data : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ type test_phase_t is (IDLE, PART_INIT, WRITE_SINGLE, WRITE_MULTI, READ_SINGLE, READ_MULTI, FINISHED);
+ signal test_phase : test_phase_t := IDLE;
+
+ type u_addr_mode_t is (MONOTONIC, RANDOM);
+ signal u_addr_mode : u_addr_mode_t := MONOTONIC;
+ signal cycle_cnt : natural := 1;
+ signal data_cnt : natural := 0;
+ signal efficiency : real := 0.0;
+
+begin
+
+ clk_fb <= part_clk_p after 1 ns;
+
+ -- DDR SDRAM Controller Core
+ inst_sdram_ctrl : entity work.sdram_ctrl_top
+ Generic map
+ (
+ BL => BURST_LEN,
+ read_phaseshift => 0,
+ f_sysclk => 100E6
+ )
+ Port map
+ (
+
+ sys_rst_in => rst,
+ sys_clk_in => clk,
+
+ sys_rst_out => rst_out,
+ sys_clk_out => clk_out,
+ sys_clk_fb => clk_fb,
+
+ -- User interface
+ u_data_vld => u_data_vld,
+ u_data_req_w => u_req_wr,
+ u_data_req_r => u_req_rd,
+ u_tag_in => u_tag_in,
+ u_tag_rd => u_tag_rd,
+ u_tag_wr => u_tag_wr,
+ u_busy => u_busy,
+ u_addr => u_addr,
+ u_cmd => u_cmd,
+ u_cmd_we => u_cmd_we,
+ u_data_wr => u_data_w,
+ u_data_rd => u_data_r,
+ u_dm => u_dm,
+
+ -- SDRAM signals
+ sd_clk_p => part_clk_p,
+ sd_clk_n => part_clk_n,
+ sd_cke => part_cke,
+ sd_cs_n => part_cs_n,
+ sd_cas_n => part_cas_n,
+ sd_ras_n => part_ras_n,
+ sd_we_n => part_we_n,
+ sd_addr => part_addr,
+ sd_ba => part_ba,
+ sd_dm => part_dm,
+ sd_dqs => part_dqs,
+ sd_data => part_data
+
+ );
+
+ -- MICRON DDR SDRAM Simulation Model
+ i_mt46v16m16_0 : entity work.mt46v16m16
+ port map (
+ dq => std_logic_vector(part_data),
+ dqs => std_logic_vector(part_dqs),
+ addr => std_logic_vector(part_addr),
+ ba => std_logic_vector(part_ba),
+ clk => part_clk_p,
+ clk_n => part_clk_n,
+ cke => part_cke,
+ cs_n => part_cs_n,
+ ras_n => part_ras_n,
+ cas_n => part_cas_n,
+ we_n => part_we_n,
+ dm => std_logic_vector(part_dm)
+ );
+
+CLK_GEN: process
+ begin
+ wait for CLK_PERIOD/2;
+ clk <= not clk;
+ end process;
+
+------------------------------------------------------------------------------------------
+
+R_DATA_COMPARE:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_data_vld='1' then
+ if u_read_en = '1' then
+ assert (ref_data = u_data_r) report "Error on read!" severity failure;
+ end if;
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ ref_data((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ elsif u_read_en = '0' then
+ last_data := (others => '0');
+ ref_data <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+W_DATA_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_req_wr = '1' then
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ u_data_w((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ elsif u_write_en = '0' then
+ last_data := (others => '0');
+ u_data_w <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+ADDR_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_addr_load = '1' then
+ u_addr <= u_addr_preset;
+ elsif u_addr_cnt_en = '1' then
+ if u_addr_mode = MONOTONIC then
+ u_addr <= u_addr + BURST_LEN;
+ else
+ if u_addr(u_addr'left) = '1' then
+ if BURST_LEN = 2 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "10000000000010001010100";
+ elsif BURST_LEN = 4 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "1000000000010011010110";
+ elsif BURST_LEN = 8 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "100000000001011110100";
+ end if;
+ else
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)-1) <= u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)-1) & u_addr(u_addr'left);
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+performance_count:
+ process(clk_out)
+ begin
+ if rising_edge(clk_out) then
+ if u_write_en = '1' or u_read_en = '1' then
+ cycle_cnt <= cycle_cnt + 1;
+ if u_req_wr = '1' or u_req_rd = '1' then
+ data_cnt <= data_cnt + 1;
+ end if;
+ else
+ cycle_cnt <= 1;
+ data_cnt <= 0;
+ end if;
+ end if;
+ end process;
+
+ u_tag_in <= ("00" & u_write_en & u_read_en) when ((u_addr = X"333C98" or u_addr = X"000100") and u_cmd_we = '1') else "0000";
+
+ efficiency <= real(data_cnt)/real(cycle_cnt);
+ u_cmd_we <= (u_write_en or u_read_en) and (not u_busy);
+ u_addr_cnt_en <= '1' when (u_cmd_we = '1' and (u_addr /= u_addr_end)) else '0';
+
+ process
+ begin
+
+ -- Write MAX_WORDS to DDR SDRAM Controller
+ wait for 4*CLK_PERIOD;
+ rst <= '0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ wait for 137*CLK_PERIOD;
+
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ u_addr_preset <= X"000000";
+ u_addr_end <= X"008000"-BURST_LEN;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_cmd <= UCMD_WRITE;
+ u_write_en <= '1';
+ while u_addr /= u_addr_end loop
+ wait until rising_edge(clk_out);
+ end loop;
+ u_write_en <= '0';
+ wait until rising_edge(clk_out) and u_req_wr='0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 1
+ u_addr_preset <= X"400000";
+ u_addr_end <= X"408000"-BURST_LEN;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_cmd <= UCMD_WRITE;
+ u_write_en <= '1';
+ while u_addr /= u_addr_end loop
+ wait until rising_edge(clk_out);
+ end loop;
+ u_write_en <= '0';
+ wait until rising_edge(clk_out) and u_req_wr='0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ u_addr_preset <= X"000000";
+ u_addr_end <= X"008000"-BURST_LEN;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_cmd <= UCMD_READ;
+ u_read_en <= '1';
+ while u_addr /= u_addr_end loop
+ wait until rising_edge(clk_out);
+ end loop;
+ u_read_en <= '0';
+ wait until rising_edge(clk_out) and u_data_vld='0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 1
+ u_addr_preset <= X"400000";
+ u_addr_end <= X"408000"-BURST_LEN;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_cmd <= UCMD_READ;
+ u_read_en <= '1';
+ while u_addr /= u_addr_end loop
+ wait until rising_edge(clk_out);
+ end loop;
+ u_read_en <= '0';
+ wait until rising_edge(clk_out) and u_data_vld='0';
+
+ wait;
+
+ end process;
+
+end architecture struct;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_fifo.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_fifo.vhd
new file mode 100644
index 0000000..6a2a9da
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_fifo.vhd
@@ -0,0 +1,416 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: cpu_embedded using cpu_core and rom
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.fifo_ctrl_pkg.all;
+use work.sdram_config.all;
+use work.sdram_types.all;
+
+entity tb_sdr_ctrl_fifo is
+end;
+
+architecture struct of tb_sdr_ctrl_fifo is
+
+ -- Number of user data words for simulation
+ constant CLK_PERIOD : time := 10 ns;
+ constant BURST_LEN : natural := 2;
+
+ signal rst : std_logic := '1';
+ signal clk : std_logic := '0';
+ signal rst_out : std_logic;
+ signal clk_out : std_logic;
+ signal clk_fb : std_logic;
+ signal part_clk_p : std_logic;
+ signal part_clk_n : std_logic;
+ signal part_cke : std_logic;
+ signal part_cs_n : std_logic;
+ signal part_we_n : std_logic;
+ signal part_ras_n : std_logic;
+ signal part_cas_n : std_logic;
+ signal part_ba : unsigned(DDR_BANK_WIDTH-1 downto 0) := (others => '0');
+ signal part_dm : unsigned(DDR_DM_WIDTH-1 downto 0) := (others => '0');
+ signal part_dqs : unsigned(DDR_DQS_WIDTH-1 downto 0) := (others => '0');
+ signal part_addr : unsigned(DDR_ADDR_WIDTH-1 downto 0) := (others => '0');
+ signal part_data : unsigned(DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ signal u_addr : user_addr_t := (others => '0');
+ signal u_tag_in : user_tag_t := "0000";
+ signal u_tag_rd : user_tag_t;
+ signal u_tag_wr : user_tag_t;
+ signal u_cmd : user_cmd_t := UCMD_NOP;
+ signal u_cmd_we : std_logic := '0';
+ signal u_busy : std_logic;
+ signal u_data_w : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_dm : unsigned(2*DDR_DM_WIDTH-1 downto 0) := "0000";
+ signal u_data_r : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_data_vld : std_logic;
+ signal u_req_wr : std_logic;
+ signal u_req_rd : std_logic;
+ signal u_read_en : std_logic := '0';
+ signal u_write_en : std_logic := '0';
+
+ signal cmd_fifo_din : unsigned(25 downto 0) := (others => '0');
+ signal cmd_fifo_dout : unsigned(25 downto 0) := (others => '0');
+ signal cmd_fifo_re : std_logic := '0';
+ signal cmd_fifo_we : std_logic := '0';
+ signal cmd_fifo_full : std_logic := '0';
+ signal cmd_fifo_empty : std_logic := '0';
+ signal cmd_fifo_almost_full : std_logic := '0';
+ signal cmd_fifo_almost_empty : std_logic := '0';
+
+ signal write_fifo_din : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal write_fifo_dout : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal write_fifo_re : std_logic := '0';
+ signal write_fifo_we : std_logic := '0';
+ signal write_fifo_full : std_logic := '0';
+ signal write_fifo_empty : std_logic := '0';
+ signal write_fifo_almost_full : std_logic := '0';
+ signal write_fifo_almost_empty : std_logic := '0';
+
+ signal read_fifo_din : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal read_fifo_dout : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal read_fifo_re : std_logic := '0';
+ signal read_fifo_we : std_logic := '0';
+ signal read_fifo_full : std_logic := '0';
+ signal read_fifo_empty : std_logic := '0';
+ signal read_fifo_almost_full : std_logic := '0';
+ signal read_fifo_almost_empty : std_logic := '0';
+
+ signal write_start : std_logic := '1';
+ signal read_start : std_logic := '1';
+
+ alias cmd_fifo_in is cmd_fifo_din(25 downto 24);
+ alias addr_fifo_in is cmd_fifo_din(23 downto 0);
+ alias cmd_fifo_out is cmd_fifo_dout(25 downto 24);
+ alias addr_fifo_out is cmd_fifo_dout(23 downto 0);
+
+begin
+
+ clk_fb <= part_clk_p after 1 ns;
+
+ -- Instantiate synchronous FIFO
+ inst_command_fifo: entity work.fifo_sync
+ GENERIC MAP
+ (
+ addr_width => 8,
+ data_width => 2+24
+ )
+ PORT MAP
+ (
+ rst => rst_out,
+ clk => clk_out,
+ we => cmd_fifo_we,
+ re => cmd_fifo_re,
+ fifo_full => cmd_fifo_full,
+ fifo_empty => cmd_fifo_empty,
+ fifo_afull => cmd_fifo_almost_full,
+ fifo_aempty => cmd_fifo_almost_empty,
+ data_w => cmd_fifo_din,
+ data_r => cmd_fifo_dout
+ );
+
+ -- Instantiate synchronous FIFO
+ inst_write_fifo: entity work.fifo_sync
+ GENERIC MAP
+ (
+ addr_width => 8,
+ data_width => 2*DDR_DATA_WIDTH
+ )
+ PORT MAP
+ (
+ rst => rst_out,
+ clk => clk_out,
+ we => write_fifo_we,
+ re => write_fifo_re,
+ fifo_full => write_fifo_full,
+ fifo_empty => write_fifo_empty,
+ fifo_afull => write_fifo_almost_full,
+ fifo_aempty => write_fifo_almost_empty,
+ data_w => write_fifo_din,
+ data_r => write_fifo_dout
+ );
+
+ -- Instantiate synchronous FIFO
+ inst_read_fifo: entity work.fifo_sync
+ GENERIC MAP
+ (
+ addr_width => 8,
+ data_width => 2*DDR_DATA_WIDTH
+ )
+ PORT MAP
+ (
+ rst => rst_out,
+ clk => clk_out,
+ we => read_fifo_we,
+ re => read_fifo_re,
+ fifo_full => read_fifo_full,
+ fifo_empty => read_fifo_empty,
+ fifo_afull => read_fifo_almost_full,
+ fifo_aempty => read_fifo_almost_empty,
+ data_w => read_fifo_din,
+ data_r => read_fifo_dout
+ );
+
+ -- DDR SDRAM Controller Core
+ inst_sdram_ctrl : entity work.sdram_ctrl_top
+ Generic map
+ (
+ BL => BURST_LEN,
+ read_phaseshift => 0,
+ f_sysclk => 100E6
+ )
+ Port map
+ (
+
+ sys_rst_in => rst,
+ sys_clk_in => clk,
+
+ sys_rst_out => rst_out,
+ sys_clk_out => clk_out,
+ sys_clk_fb => clk_fb,
+
+ -- User interface
+ u_data_vld => u_data_vld,
+ u_data_req_w => u_req_wr,
+ u_data_req_r => u_req_rd,
+ u_tag_in => u_tag_in,
+ u_tag_rd => u_tag_rd,
+ u_tag_wr => u_tag_wr,
+ u_busy => u_busy,
+ u_addr => u_addr,
+ u_cmd => u_cmd,
+ u_cmd_we => u_cmd_we,
+ u_data_wr => u_data_w,
+ u_data_rd => u_data_r,
+ u_dm => u_dm,
+
+ -- SDRAM signals
+ sd_clk_p => part_clk_p,
+ sd_clk_n => part_clk_n,
+ sd_cke => part_cke,
+ sd_cs_n => part_cs_n,
+ sd_cas_n => part_cas_n,
+ sd_ras_n => part_ras_n,
+ sd_we_n => part_we_n,
+ sd_addr => part_addr,
+ sd_ba => part_ba,
+ sd_dm => part_dm,
+ sd_dqs => part_dqs,
+ sd_data => part_data
+
+ );
+
+ -- MICRON DDR SDRAM Simulation Model
+ i_mt46v16m16_0 : entity work.mt46v16m16
+ port map (
+ dq => std_logic_vector(part_data),
+ dqs => std_logic_vector(part_dqs),
+ addr => std_logic_vector(part_addr),
+ ba => std_logic_vector(part_ba),
+ clk => part_clk_p,
+ clk_n => part_clk_n,
+ cke => part_cke,
+ cs_n => part_cs_n,
+ ras_n => part_ras_n,
+ cas_n => part_cas_n,
+ we_n => part_we_n,
+ dm => std_logic_vector(part_dm)
+ );
+
+CLK_GEN: process
+ begin
+ wait for CLK_PERIOD/2;
+ clk <= not clk;
+ end process;
+
+------------------------------------------------------------------------------------------
+ u_cmd_we <= (not cmd_fifo_empty) and write_start and (not u_busy);
+ u_cmd <= cmd_fifo_out;
+ u_addr <= addr_fifo_out;
+
+ write_fifo_re <= u_req_wr and (not write_fifo_empty);
+ cmd_fifo_re <= u_cmd_we;
+ u_data_w <= write_fifo_dout;
+ read_fifo_re <= (not read_fifo_empty) and read_start;
+ read_fifo_we <= u_data_vld;
+ read_fifo_din <= u_data_r;
+
+ process
+ begin
+
+ -- Write MAX_WORDS to DDR SDRAM Controller
+ wait for 4*CLK_PERIOD;
+ rst <= '0';
+
+ wait for 4*CLK_PERIOD;
+ wait until rising_edge(clk_out) and rst_out='0';
+
+
write_fifo_we <= '1';
+ cmd_fifo_we <= '1';
+ write_fifo_din <= X"01020304";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000000";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"05060708";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000002";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"00001111";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000004";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"22223333";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000006";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"44445555";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000008";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"66667777";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"00000a";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"88889999";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"00000c";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"AAAABBBB";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"00000e";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"CCCCDDDD";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000010";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"EEEEFFFF";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000012";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '0';
+ cmd_fifo_we <= '0';
+
+-- wait until rising_edge(clk_out) and u_busy='0';
+-- write_start <= '1';
+-- wait until rising_edge(clk_out) and write_fifo_empty='1';
+
+ write_fifo_we <= '1';
+ cmd_fifo_we <= '1';
+ write_fifo_din <= X"01234567";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000014";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '0';
+ cmd_fifo_in <= UCMD_READ;
+ addr_fifo_in <= X"000014";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"89ABCDEF";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000016";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"11223344";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000018";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '0';
+ cmd_fifo_in <= UCMD_READ;
+ addr_fifo_in <= X"000010";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"55667788";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"00001a";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"99990000";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"00001c";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '1';
+ write_fifo_din <= X"AAAA5555";
+ cmd_fifo_in <= UCMD_WRITE;
+ addr_fifo_in <= X"000020";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '0';
+ cmd_fifo_in <= UCMD_READ;
+ addr_fifo_in <= X"000000";
+
+ wait until rising_edge(clk_out);
+ cmd_fifo_in <= UCMD_READ;
+ addr_fifo_in <= X"000018";
+
+ wait until rising_edge(clk_out);
+ cmd_fifo_in <= UCMD_READ;
+ addr_fifo_in <= X"00001A";
+
+ wait until rising_edge(clk_out);
+ cmd_fifo_in <= UCMD_READ;
+ addr_fifo_in <= X"00001C";
+
+ wait until rising_edge(clk_out);
+ cmd_fifo_in <= UCMD_READ;
+ addr_fifo_in <= X"000020";
+
+ wait until rising_edge(clk_out);
+ write_fifo_we <= '0';
+ cmd_fifo_we <= '0';
+
+ wait for 40*CLK_PERIOD;
+ read_start <= '1';
+ wait;
+
+ end process;
+
+end architecture struct;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_lin_r_rand_w.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_lin_r_rand_w.vhd
new file mode 100644
index 0000000..3ab72bd
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_lin_r_rand_w.vhd
@@ -0,0 +1,318 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: cpu_embedded using cpu_core and rom
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+use work.utils_pkg.all;
+
+entity tb_sdr_ctrl is
+end;
+
+architecture struct of tb_sdr_ctrl is
+
+ -- Number of user data words for simulation
+ constant CLK_PERIOD : time := 10 ns;
+ constant BURST_LEN : natural := 8;
+
+ signal rst : std_logic := '1';
+ signal clk : std_logic := '0';
+ signal rst_out : std_logic;
+ signal clk_out : std_logic;
+ signal clk_fb : std_logic;
+ signal part_clk_p : std_logic;
+ signal part_clk_n : std_logic;
+ signal part_cke : std_logic;
+ signal part_cs_n : std_logic;
+ signal part_we_n : std_logic;
+ signal part_ras_n : std_logic;
+ signal part_cas_n : std_logic;
+ signal part_ba : unsigned(DDR_BANK_WIDTH-1 downto 0) := (others => '0');
+ signal part_dm : unsigned(DDR_DM_WIDTH-1 downto 0) := (others => '0');
+ signal part_dqs : unsigned(DDR_DQS_WIDTH-1 downto 0) := (others => '0');
+ signal part_addr : unsigned(DDR_ADDR_WIDTH-1 downto 0) := (others => '0');
+ signal part_data : unsigned(DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ signal u_addr : user_addr_t := (others => '0');
+ signal lin_addr : user_addr_t := (others => '0');
+ signal rand_gen : unsigned(7 downto 0) := (others => '0');
+ signal u_tag_in : user_tag_t := "0000";
+ signal u_tag_rd : user_tag_t;
+ signal u_tag_wr : user_tag_t;
+ signal u_cmd : user_cmd_t := UCMD_NOP;
+ signal u_cmd_we : std_logic := '0';
+ signal u_busy : std_logic;
+ signal u_data_w : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_dm : unsigned(2*DDR_DM_WIDTH-1 downto 0) := "0000";
+ signal u_data_r : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_data_vld : std_logic;
+ signal u_req_wr : std_logic;
+ signal u_req_rd : std_logic;
+ signal u_read_en : std_logic := '0';
+ signal u_write_en : std_logic := '0';
+ signal rw_null_en : std_logic := '0';
+ signal u_addr_cnt_en : std_logic := '0';
+ signal u_addr_load : std_logic := '0';
+ signal u_addr_preset : user_addr_t := (others => '0');
+ signal u_addr_end : user_addr_t := (others => '0');
+ signal ref_data : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ type test_phase_t is (IDLE, PART_INIT, WRITE_SINGLE, WRITE_MULTI, READ_SINGLE, READ_MULTI, FINISHED);
+ signal test_phase : test_phase_t := IDLE;
+
+ type u_addr_mode_t is (MONOTONIC, RANDOM);
+ signal u_addr_mode : u_addr_mode_t := MONOTONIC;
+ signal cycle_cnt : natural := 1;
+ signal data_cnt : natural := 0;
+ signal efficiency : real := 0.0;
+
+begin
+
+ clk_fb <= part_clk_p after 1 ns;
+
+ -- DDR SDRAM Controller Core
+ inst_sdram_ctrl : entity work.sdram_ctrl_top
+ Generic map
+ (
+ BL => BURST_LEN,
+ read_phaseshift => 0,
+ f_sysclk => 100E6
+ )
+ Port map
+ (
+
+ sys_rst_in => rst,
+ sys_clk_in => clk,
+
+ sys_rst_out => rst_out,
+ sys_clk_out => clk_out,
+ sys_clk_fb => clk_fb,
+
+ -- User interface
+ u_data_vld => u_data_vld,
+ u_data_req_w => u_req_wr,
+ u_data_req_r => u_req_rd,
+ u_tag_in => u_tag_in,
+ u_tag_rd => u_tag_rd,
+ u_tag_wr => u_tag_wr,
+ u_busy => u_busy,
+ u_addr => u_addr,
+ u_cmd => u_cmd,
+ u_cmd_we => u_cmd_we,
+ u_data_wr => u_data_w,
+ u_data_rd => u_data_r,
+ u_dm => u_dm,
+
+ -- SDRAM signals
+ sd_clk_p => part_clk_p,
+ sd_clk_n => part_clk_n,
+ sd_cke => part_cke,
+ sd_cs_n => part_cs_n,
+ sd_cas_n => part_cas_n,
+ sd_ras_n => part_ras_n,
+ sd_we_n => part_we_n,
+ sd_addr => part_addr,
+ sd_ba => part_ba,
+ sd_dm => part_dm,
+ sd_dqs => part_dqs,
+ sd_data => part_data
+
+ );
+
+ -- MICRON DDR SDRAM Simulation Model
+ i_mt46v16m16_0 : entity work.mt46v16m16
+ port map (
+ dq => std_logic_vector(part_data),
+ dqs => std_logic_vector(part_dqs),
+ addr => std_logic_vector(part_addr),
+ ba => std_logic_vector(part_ba),
+ clk => part_clk_p,
+ clk_n => part_clk_n,
+ cke => part_cke,
+ cs_n => part_cs_n,
+ ras_n => part_ras_n,
+ cas_n => part_cas_n,
+ we_n => part_we_n,
+ dm => std_logic_vector(part_dm)
+ );
+
+CLK_GEN: process
+ begin
+ wait for CLK_PERIOD/2;
+ clk <= not clk;
+ end process;
+
+------------------------------------------------------------------------------------------
+
+R_DATA_COMPARE:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_data_vld='1' then
+ if u_read_en = '1' and u_tag_rd = "0000" then
+ assert (ref_data = u_data_r) report "Error on read!" severity failure;
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ ref_data((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ end if;
+ elsif u_read_en = '0' and rw_null_en = '0' then
+ last_data := (others => '0');
+ ref_data <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+W_DATA_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_req_wr = '1' and u_tag_wr = "0000" then
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ u_data_w((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ elsif u_write_en = '0' and rw_null_en = '0' then
+ last_data := (others => '0');
+ u_data_w <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+ADDR_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_addr_load = '1' then
+ lin_addr <= u_addr_preset;
+ rand_gen <= X"80";
+ elsif u_addr_cnt_en = '1' then
+ lin_addr <= lin_addr + BURST_LEN;
+ if rand_gen(rand_gen'left) = '1' then
+ rand_gen <= (rand_gen(rand_gen'left-1 downto 0) & rand_gen(rand_gen'left)) xor "10010010";
+ else
+ rand_gen <= rand_gen(rand_gen'left-1 downto 0) & rand_gen(rand_gen'left);
+ end if;
+ end if;
+ end if;
+ end process;
+
+performance_count:
+ process(clk_out)
+ begin
+ if rising_edge(clk_out) then
+ if u_write_en = '1' or u_read_en = '1' then
+ cycle_cnt <= cycle_cnt + 1;
+ if u_req_wr = '1' or u_req_rd = '1' then
+ data_cnt <= data_cnt + 1;
+ end if;
+ else
+ cycle_cnt <= 1;
+ data_cnt <= 0;
+ end if;
+ end if;
+ end process;
+
+ u_tag_in <= "000" & rw_null_en;
+
+ efficiency <= real(data_cnt)/real(cycle_cnt);
+ u_cmd_we <= (u_write_en or u_read_en or rw_null_en) and (not u_busy);
+ u_addr_cnt_en <= '1' when (u_cmd_we = '1' and (lin_addr /= u_addr_end)) else '0';
+ u_addr <= (rand_gen(7) and (not rw_null_en)) & lin_addr(lin_addr'left-1 downto 0);
+ process
+ begin
+
+ -- Write MAX_WORDS to DDR SDRAM Controller
+ wait for 4*CLK_PERIOD;
+ rst <= '0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ wait for 137*CLK_PERIOD;
+
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ test_phase <= WRITE_MULTI;
+ u_addr_preset <= X"000000";
+ u_addr_end <= X"010000"-BURST_LEN;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_cmd <= UCMD_READ;
+ u_write_en <= '1';
+ rw_null_en <= '1';
+ while lin_addr /= u_addr_end loop
+ u_cmd <= UCMD_READ;
+ rw_null_en <= '1';
+ if rand_gen(3) = '0' and rand_gen(4) = '0' and rand_gen(5) = '0' and rand_gen(6) = '0' then
+ if rand_gen(1) = '1' or rand_gen(7) = '1' then
+ u_cmd <= UCMD_WRITE;
+ end if;
+ rw_null_en <= '0';
+ end if;
+ wait until rising_edge(clk_out);
+ end loop;
+ u_write_en <= '0';
+ rw_null_en <= '0';
+ wait until rising_edge(clk_out) and u_req_wr='0';
+ wait for 200*CLK_PERIOD;
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ test_phase <= READ_MULTI;
+ u_addr_preset <= X"000000";
+ u_addr_end <= X"010000"-BURST_LEN;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_cmd <= UCMD_WRITE;
+ u_read_en <= '1';
+ rw_null_en <= '1';
+ while lin_addr /= u_addr_end loop
+ u_cmd <= UCMD_WRITE;
+ rw_null_en <= '1';
+ if rand_gen(3) = '0' and rand_gen(4) = '0' and rand_gen(5) = '0' and rand_gen(6) = '0' then
+ if rand_gen(1) = '1' or rand_gen(7) = '1' then
+ u_cmd <= UCMD_READ;
+ end if;
+ rw_null_en <= '0';
+ end if;
+ wait until rising_edge(clk_out);
+ end loop;
+ u_read_en <= '0';
+ rw_null_en <= '0';
+ wait until rising_edge(clk_out) and u_data_vld='0';
+
+ wait;
+
+ end process;
+
+end architecture struct;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_lin_w_rand_r.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_lin_w_rand_r.vhd
new file mode 100644
index 0000000..312d2a8
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_lin_w_rand_r.vhd
@@ -0,0 +1,316 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: cpu_embedded using cpu_core and rom
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+use work.utils_pkg.all;
+
+entity tb_sdr_ctrl is
+end;
+
+architecture struct of tb_sdr_ctrl is
+
+ -- Number of user data words for simulation
+ constant CLK_PERIOD : time := 10 ns;
+ constant BURST_LEN : natural := 8;
+
+ signal rst : std_logic := '1';
+ signal clk : std_logic := '0';
+ signal rst_out : std_logic;
+ signal clk_out : std_logic;
+ signal clk_fb : std_logic;
+ signal part_clk_p : std_logic;
+ signal part_clk_n : std_logic;
+ signal part_cke : std_logic;
+ signal part_cs_n : std_logic;
+ signal part_we_n : std_logic;
+ signal part_ras_n : std_logic;
+ signal part_cas_n : std_logic;
+ signal part_ba : unsigned(DDR_BANK_WIDTH-1 downto 0) := (others => '0');
+ signal part_dm : unsigned(DDR_DM_WIDTH-1 downto 0) := (others => '0');
+ signal part_dqs : unsigned(DDR_DQS_WIDTH-1 downto 0) := (others => '0');
+ signal part_addr : unsigned(DDR_ADDR_WIDTH-1 downto 0) := (others => '0');
+ signal part_data : unsigned(DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ signal u_addr : user_addr_t := (others => '0');
+ signal lin_addr : user_addr_t := (others => '0');
+ signal rand_gen : unsigned(7 downto 0) := (others => '0');
+ signal u_tag_in : user_tag_t := "0000";
+ signal u_tag_rd : user_tag_t;
+ signal u_tag_wr : user_tag_t;
+ signal u_cmd : user_cmd_t := UCMD_NOP;
+ signal u_cmd_we : std_logic := '0';
+ signal u_busy : std_logic;
+ signal u_data_w : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_dm : unsigned(2*DDR_DM_WIDTH-1 downto 0) := "0000";
+ signal u_data_r : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_data_vld : std_logic;
+ signal u_req_wr : std_logic;
+ signal u_req_rd : std_logic;
+ signal u_read_en : std_logic := '0';
+ signal u_write_en : std_logic := '0';
+ signal rw_null_en : std_logic := '0';
+ signal u_addr_cnt_en : std_logic := '0';
+ signal u_addr_load : std_logic := '0';
+ signal u_addr_preset : user_addr_t := (others => '0');
+ signal u_addr_end : user_addr_t := (others => '0');
+ signal ref_data : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ type test_phase_t is (IDLE, PART_INIT, WRITE_SINGLE, WRITE_MULTI, READ_SINGLE, READ_MULTI, FINISHED);
+ signal test_phase : test_phase_t := IDLE;
+
+ type u_addr_mode_t is (MONOTONIC, RANDOM);
+ signal u_addr_mode : u_addr_mode_t := MONOTONIC;
+ signal cycle_cnt : natural := 1;
+ signal data_cnt : natural := 0;
+ signal efficiency : real := 0.0;
+
+begin
+
+ clk_fb <= part_clk_p after 1 ns;
+
+ -- DDR SDRAM Controller Core
+ inst_sdram_ctrl : entity work.sdram_ctrl_top
+ Generic map
+ (
+ BL => BURST_LEN,
+ read_phaseshift => 0,
+ f_sysclk => 100E6
+ )
+ Port map
+ (
+
+ sys_rst_in => rst,
+ sys_clk_in => clk,
+
+ sys_rst_out => rst_out,
+ sys_clk_out => clk_out,
+ sys_clk_fb => clk_fb,
+
+ -- User interface
+ u_data_vld => u_data_vld,
+ u_data_req_w => u_req_wr,
+ u_data_req_r => u_req_rd,
+ u_tag_in => u_tag_in,
+ u_tag_rd => u_tag_rd,
+ u_tag_wr => u_tag_wr,
+ u_busy => u_busy,
+ u_addr => u_addr,
+ u_cmd => u_cmd,
+ u_cmd_we => u_cmd_we,
+ u_data_wr => u_data_w,
+ u_data_rd => u_data_r,
+ u_dm => u_dm,
+
+ -- SDRAM signals
+ sd_clk_p => part_clk_p,
+ sd_clk_n => part_clk_n,
+ sd_cke => part_cke,
+ sd_cs_n => part_cs_n,
+ sd_cas_n => part_cas_n,
+ sd_ras_n => part_ras_n,
+ sd_we_n => part_we_n,
+ sd_addr => part_addr,
+ sd_ba => part_ba,
+ sd_dm => part_dm,
+ sd_dqs => part_dqs,
+ sd_data => part_data
+
+ );
+
+ -- MICRON DDR SDRAM Simulation Model
+ i_mt46v16m16_0 : entity work.mt46v16m16
+ port map (
+ dq => std_logic_vector(part_data),
+ dqs => std_logic_vector(part_dqs),
+ addr => std_logic_vector(part_addr),
+ ba => std_logic_vector(part_ba),
+ clk => part_clk_p,
+ clk_n => part_clk_n,
+ cke => part_cke,
+ cs_n => part_cs_n,
+ ras_n => part_ras_n,
+ cas_n => part_cas_n,
+ we_n => part_we_n,
+ dm => std_logic_vector(part_dm)
+ );
+
+CLK_GEN: process
+ begin
+ wait for CLK_PERIOD/2;
+ clk <= not clk;
+ end process;
+
+------------------------------------------------------------------------------------------
+
+R_DATA_COMPARE:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_data_vld='1' then
+ if u_read_en = '1' and u_tag_rd = "0000" then
+ assert (ref_data = u_data_r) report "Error on read!" severity failure;
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ ref_data((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ end if;
+ elsif u_read_en = '0' and rw_null_en = '0' then
+ last_data := (others => '0');
+ ref_data <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+W_DATA_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_req_wr = '1' and u_tag_wr = "0000" then
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ u_data_w((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ elsif u_write_en = '0' and rw_null_en = '0' then
+ last_data := (others => '0');
+ u_data_w <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+ADDR_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_addr_load = '1' then
+ lin_addr <= u_addr_preset;
+ rand_gen <= X"80";
+ elsif u_addr_cnt_en = '1' then
+ lin_addr <= lin_addr + BURST_LEN;
+ if rand_gen(rand_gen'left) = '1' then
+ rand_gen <= (rand_gen(rand_gen'left-1 downto 0) & rand_gen(rand_gen'left)) xor "10010010";
+ else
+ rand_gen <= rand_gen(rand_gen'left-1 downto 0) & rand_gen(rand_gen'left);
+ end if;
+ end if;
+ end if;
+ end process;
+
+performance_count:
+ process(clk_out)
+ begin
+ if rising_edge(clk_out) then
+ if u_write_en = '1' or u_read_en = '1' then
+ cycle_cnt <= cycle_cnt + 1;
+ if u_req_wr = '1' or u_req_rd = '1' then
+ data_cnt <= data_cnt + 1;
+ end if;
+ else
+ cycle_cnt <= 1;
+ data_cnt <= 0;
+ end if;
+ end if;
+ end process;
+
+ u_tag_in <= "000" & rw_null_en;
+
+ efficiency <= real(data_cnt)/real(cycle_cnt);
+ u_cmd_we <= (u_write_en or u_read_en or rw_null_en) and (not u_busy);
+ u_addr_cnt_en <= '1' when (u_cmd_we = '1' and (lin_addr /= u_addr_end)) else '0';
+ u_addr <= (rand_gen(7) and (rw_null_en)) & lin_addr(lin_addr'left-1 downto 0);
+ process
+ begin
+
+ -- Write MAX_WORDS to DDR SDRAM Controller
+ wait for 4*CLK_PERIOD;
+ rst <= '0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ wait for 137*CLK_PERIOD;
+
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ test_phase <= WRITE_MULTI;
+ u_addr_preset <= X"000000";
+ u_addr_end <= X"010000"-BURST_LEN;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_cmd <= UCMD_WRITE;
+ u_write_en <= '1';
+ while lin_addr /= u_addr_end loop
+ u_cmd <= UCMD_WRITE;
+ rw_null_en <= '0';
+ if rand_gen(3) = '0' and rand_gen(4) = '0' and rand_gen(5) = '0' and rand_gen(6) = '0' then
+ if rand_gen(1) = '1' or rand_gen(7) = '1' then
+ u_cmd <= UCMD_READ;
+ end if;
+ rw_null_en <= '1';
+ end if;
+ wait until rising_edge(clk_out);
+ end loop;
+ u_write_en <= '0';
+ rw_null_en <= '0';
+ wait until rising_edge(clk_out) and u_req_wr='0';
+ wait for 200*CLK_PERIOD;
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ test_phase <= READ_MULTI;
+ u_addr_preset <= X"000000";
+ u_addr_end <= X"010000"-BURST_LEN;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_cmd <= UCMD_READ;
+ u_read_en <= '1';
+ while lin_addr /= u_addr_end loop
+ u_cmd <= UCMD_READ;
+ rw_null_en <= '0';
+ if rand_gen(3) = '0' and rand_gen(4) = '0' and rand_gen(5) = '0' and rand_gen(6) = '0' then
+ if rand_gen(1) = '1' or rand_gen(7) = '1' then
+ u_cmd <= UCMD_WRITE;
+ end if;
+ rw_null_en <= '1';
+ end if;
+ wait until rising_edge(clk_out);
+ end loop;
+ u_read_en <= '0';
+ rw_null_en <= '0';
+ wait until rising_edge(clk_out) and u_data_vld='0';
+
+ wait;
+
+ end process;
+
+end architecture struct;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_rand_addr.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_rand_addr.vhd
new file mode 100644
index 0000000..e20e4af
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_rand_addr.vhd
@@ -0,0 +1,315 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: cpu_embedded using cpu_core and rom
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+use work.utils_pkg.all;
+
+entity tb_sdr_ctrl is
+end;
+
+architecture struct of tb_sdr_ctrl is
+
+ -- Number of user data words for simulation
+ constant CLK_PERIOD : time := 10 ns;
+ constant BURST_LEN : natural := 8;
+
+ signal rst : std_logic := '1';
+ signal clk : std_logic := '0';
+ signal rst_out : std_logic;
+ signal clk_out : std_logic;
+ signal clk_fb : std_logic;
+ signal part_clk_p : std_logic;
+ signal part_clk_n : std_logic;
+ signal part_cke : std_logic;
+ signal part_cs_n : std_logic;
+ signal part_we_n : std_logic;
+ signal part_ras_n : std_logic;
+ signal part_cas_n : std_logic;
+ signal part_ba : unsigned(DDR_BANK_WIDTH-1 downto 0) := (others => '0');
+ signal part_dm : unsigned(DDR_DM_WIDTH-1 downto 0) := (others => '0');
+ signal part_dqs : unsigned(DDR_DQS_WIDTH-1 downto 0) := (others => '0');
+ signal part_addr : unsigned(DDR_ADDR_WIDTH-1 downto 0) := (others => '0');
+ signal part_data : unsigned(DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ signal u_addr : user_addr_t := (others => '0');
+ signal u_tag_in : user_tag_t := "0000";
+ signal u_tag_rd : user_tag_t;
+ signal u_tag_wr : user_tag_t;
+ signal u_cmd : user_cmd_t := UCMD_NOP;
+ signal u_cmd_we : std_logic := '0';
+ signal u_busy : std_logic;
+ signal u_data_w : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_dm : unsigned(2*DDR_DM_WIDTH-1 downto 0) := "0000";
+ signal u_data_r : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_data_vld : std_logic;
+ signal u_req_wr : std_logic;
+ signal u_req_rd : std_logic;
+ signal u_read_en : std_logic := '0';
+ signal u_write_en : std_logic := '0';
+ signal u_addr_cnt_en : std_logic := '0';
+ signal u_addr_load : std_logic := '0';
+ signal u_addr_preset : user_addr_t := (others => '0');
+ signal u_addr_end : user_addr_t := (others => '0');
+ signal ref_data : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ type test_phase_t is (IDLE, PART_INIT, WRITE_SINGLE, WRITE_MULTI, READ_SINGLE, READ_MULTI, FINISHED);
+ signal test_phase : test_phase_t := IDLE;
+
+ type u_addr_mode_t is (MONOTONIC, RANDOM);
+ signal u_addr_mode : u_addr_mode_t := MONOTONIC;
+ signal cycle_cnt : natural := 1;
+ signal data_cnt : natural := 0;
+ signal efficiency : real := 0.0;
+
+begin
+
+ clk_fb <= part_clk_p after 1 ns;
+
+ -- DDR SDRAM Controller Core
+ inst_sdram_ctrl : entity work.sdram_ctrl_top
+ Generic map
+ (
+ BL => BURST_LEN,
+ read_phaseshift => 0,
+ f_sysclk => 100E6
+ )
+ Port map
+ (
+
+ sys_rst_in => rst,
+ sys_clk_in => clk,
+
+ sys_rst_out => rst_out,
+ sys_clk_out => clk_out,
+ sys_clk_fb => clk_fb,
+
+ -- User interface
+ u_data_vld => u_data_vld,
+ u_data_req_w => u_req_wr,
+ u_data_req_r => u_req_rd,
+ u_tag_in => u_tag_in,
+ u_tag_rd => u_tag_rd,
+ u_tag_wr => u_tag_wr,
+ u_busy => u_busy,
+ u_addr => u_addr,
+ u_cmd => u_cmd,
+ u_cmd_we => u_cmd_we,
+ u_data_wr => u_data_w,
+ u_data_rd => u_data_r,
+ u_dm => u_dm,
+
+ -- SDRAM signals
+ sd_clk_p => part_clk_p,
+ sd_clk_n => part_clk_n,
+ sd_cke => part_cke,
+ sd_cs_n => part_cs_n,
+ sd_cas_n => part_cas_n,
+ sd_ras_n => part_ras_n,
+ sd_we_n => part_we_n,
+ sd_addr => part_addr,
+ sd_ba => part_ba,
+ sd_dm => part_dm,
+ sd_dqs => part_dqs,
+ sd_data => part_data
+
+ );
+
+ -- MICRON DDR SDRAM Simulation Model
+ i_mt46v16m16_0 : entity work.mt46v16m16
+ port map (
+ dq => std_logic_vector(part_data),
+ dqs => std_logic_vector(part_dqs),
+ addr => std_logic_vector(part_addr),
+ ba => std_logic_vector(part_ba),
+ clk => part_clk_p,
+ clk_n => part_clk_n,
+ cke => part_cke,
+ cs_n => part_cs_n,
+ ras_n => part_ras_n,
+ cas_n => part_cas_n,
+ we_n => part_we_n,
+ dm => std_logic_vector(part_dm)
+ );
+
+CLK_GEN: process
+ begin
+ wait for CLK_PERIOD/2;
+ clk <= not clk;
+ end process;
+
+------------------------------------------------------------------------------------------
+
+R_DATA_COMPARE:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_data_vld='1' then
+ if u_read_en = '1' then
+ assert (ref_data = u_data_r) report "Error on read!" severity failure;
+ end if;
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ ref_data((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ elsif u_read_en = '0' then
+ last_data := (others => '0');
+ ref_data <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+W_DATA_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_req_wr = '1' then
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ u_data_w((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ elsif u_write_en = '0' then
+ last_data := (others => '0');
+ u_data_w <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+ADDR_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_addr_load = '1' then
+ u_addr <= u_addr_preset;
+ elsif u_addr_cnt_en = '1' then
+ if u_addr_mode = MONOTONIC then
+ u_addr <= u_addr + BURST_LEN;
+ else
+ if u_addr(u_addr'left) = '1' then
+ if BURST_LEN = 2 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "10000000000010001010100";
+ elsif BURST_LEN = 4 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "1000000000010011010110";
+ elsif BURST_LEN = 8 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "100000000001011110100";
+ end if;
+ else
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)-1) <= u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)-1) & u_addr(u_addr'left);
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+performance_count:
+ process(clk_out)
+ begin
+ if rising_edge(clk_out) then
+ if u_write_en = '1' or u_read_en = '1' then
+ cycle_cnt <= cycle_cnt + 1;
+ if u_req_wr = '1' or u_req_rd = '1' then
+ data_cnt <= data_cnt + 1;
+ end if;
+ else
+ cycle_cnt <= 1;
+ data_cnt <= 0;
+ end if;
+ end if;
+ end process;
+
+ u_tag_in <= ("00" & u_write_en & u_read_en) when ((u_addr = X"333C98" or u_addr = X"000100") and u_cmd_we = '1') else "0000";
+
+ efficiency <= real(data_cnt)/real(cycle_cnt);
+ u_cmd_we <= (u_write_en or u_read_en) and (not u_busy);
+ u_addr_cnt_en <= '1' when (u_cmd_we = '1' and (u_addr /= u_addr_end)) else '0';
+
+ process
+ begin
+
+ -- Write MAX_WORDS to DDR SDRAM Controller
+ wait for 4*CLK_PERIOD;
+ rst <= '0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ wait for 137*CLK_PERIOD;
+
+
wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ test_phase <= WRITE_MULTI;
+ u_addr_preset <= X"800000";
+ if BURST_LEN = 2 then
+ u_addr_end <= X"5E2330";
+ elsif BURST_LEN = 4 then
+ u_addr_end <= X"7DEDD0";
+ elsif BURST_LEN = 8 then
+ u_addr_end <= X"5666B0";
+ end if;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_addr_mode <= RANDOM;
+ u_cmd <= UCMD_WRITE;
+ u_write_en <= '1';
+ while u_addr /= u_addr_end loop
+ wait until rising_edge(clk_out);
+ end loop;
+ u_write_en <= '0';
+ wait until rising_edge(clk_out) and u_req_wr='0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ test_phase <= READ_MULTI;
+ u_addr_preset <= X"800000";
+ if BURST_LEN = 2 then
+ u_addr_end <= X"5E2330";
+ elsif BURST_LEN = 4 then
+ u_addr_end <= X"7DEDD0";
+ elsif BURST_LEN = 8 then
+ u_addr_end <= X"5666B0";
+ end if;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_addr_mode <= RANDOM;
+ u_cmd <= UCMD_READ;
+ u_read_en <= '1';
+ while u_addr /= u_addr_end loop
+ wait until rising_edge(clk_out);
+ end loop;
+ u_read_en <= '0';
+ wait until rising_edge(clk_out) and u_data_vld='0';
+
+ wait;
+
+ end process;
+
+end architecture struct;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_rand_rw.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_rand_rw.vhd
new file mode 100644
index 0000000..26c8b9b
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdr_ctrl_rand_rw.vhd
@@ -0,0 +1,329 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: cpu_embedded using cpu_core and rom
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.sdram_config.all;
+use work.sdram_types.all;
+use work.utils_pkg.all;
+
+entity tb_sdr_ctrl is
+end;
+
+architecture struct of tb_sdr_ctrl is
+
+ -- Number of user data words for simulation
+ constant CLK_PERIOD : time := 10 ns;
+ constant BURST_LEN : natural := 2;
+
+ signal rst : std_logic := '1';
+ signal clk : std_logic := '0';
+ signal rst_out : std_logic;
+ signal clk_out : std_logic;
+ signal clk_fb : std_logic;
+ signal part_clk_p : std_logic;
+ signal part_clk_n : std_logic;
+ signal part_cke : std_logic;
+ signal part_cs_n : std_logic;
+ signal part_we_n : std_logic;
+ signal part_ras_n : std_logic;
+ signal part_cas_n : std_logic;
+ signal part_ba : unsigned(DDR_BANK_WIDTH-1 downto 0) := (others => '0');
+ signal part_dm : unsigned(DDR_DM_WIDTH-1 downto 0) := (others => '0');
+ signal part_dqs : unsigned(DDR_DQS_WIDTH-1 downto 0) := (others => '0');
+ signal part_addr : unsigned(DDR_ADDR_WIDTH-1 downto 0) := (others => '0');
+ signal part_data : unsigned(DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ signal u_addr : user_addr_t := (others => '0');
+ signal u_tag_in : user_tag_t := "0000";
+ signal u_tag_rd : user_tag_t;
+ signal u_tag_wr : user_tag_t;
+ signal u_cmd : user_cmd_t := UCMD_NOP;
+ signal u_cmd_we : std_logic := '0';
+ signal u_busy : std_logic;
+ signal u_data_w : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_dm : unsigned(2*DDR_DM_WIDTH-1 downto 0) := "0000";
+ signal u_data_r : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal u_data_vld : std_logic;
+ signal u_req_wr : std_logic;
+ signal u_req_rd : std_logic;
+ signal u_read_en : std_logic := '0';
+ signal u_write_en : std_logic := '0';
+ signal rw_null_en : std_logic := '0';
+ signal u_addr_cnt_en : std_logic := '0';
+ signal u_addr_load : std_logic := '0';
+ signal u_addr_preset : user_addr_t := (others => '0');
+ signal u_addr_end : user_addr_t := (others => '0');
+ signal ref_data : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ type test_phase_t is (IDLE, PART_INIT, WRITE_SINGLE, WRITE_MULTI, READ_SINGLE, READ_MULTI, FINISHED);
+ signal test_phase : test_phase_t := IDLE;
+
+ type u_addr_mode_t is (MONOTONIC, RANDOM);
+ signal u_addr_mode : u_addr_mode_t := MONOTONIC;
+ signal cycle_cnt : natural := 1;
+ signal data_cnt : natural := 0;
+ signal efficiency : real := 0.0;
+
+begin
+
+ clk_fb <= part_clk_p after 1 ns;
+
+ -- DDR SDRAM Controller Core
+ inst_sdram_ctrl : entity work.sdram_ctrl_top
+ Generic map
+ (
+ BL => BURST_LEN,
+ read_phaseshift => 0,
+ f_sysclk => 100E6
+ )
+ Port map
+ (
+
+ sys_rst_in => rst,
+ sys_clk_in => clk,
+
+ sys_rst_out => rst_out,
+ sys_clk_out => clk_out,
+ sys_clk_fb => clk_fb,
+
+ -- User interface
+ u_data_vld => u_data_vld,
+ u_data_req_w => u_req_wr,
+ u_data_req_r => u_req_rd,
+ u_tag_in => u_tag_in,
+ u_tag_rd => u_tag_rd,
+ u_tag_wr => u_tag_wr,
+ u_busy => u_busy,
+ u_addr => u_addr,
+ u_cmd => u_cmd,
+ u_cmd_we => u_cmd_we,
+ u_data_wr => u_data_w,
+ u_data_rd => u_data_r,
+ u_dm => u_dm,
+
+ -- SDRAM signals
+ sd_clk_p => part_clk_p,
+ sd_clk_n => part_clk_n,
+ sd_cke => part_cke,
+ sd_cs_n => part_cs_n,
+ sd_cas_n => part_cas_n,
+ sd_ras_n => part_ras_n,
+ sd_we_n => part_we_n,
+ sd_addr => part_addr,
+ sd_ba => part_ba,
+ sd_dm => part_dm,
+ sd_dqs => part_dqs,
+ sd_data => part_data
+
+ );
+
+ -- MICRON DDR SDRAM Simulation Model
+ i_mt46v16m16_0 : entity work.mt46v16m16
+ port map (
+ dq => std_logic_vector(part_data),
+ dqs => std_logic_vector(part_dqs),
+ addr => std_logic_vector(part_addr),
+ ba => std_logic_vector(part_ba),
+ clk => part_clk_p,
+ clk_n => part_clk_n,
+ cke => part_cke,
+ cs_n => part_cs_n,
+ ras_n => part_ras_n,
+ cas_n => part_cas_n,
+ we_n => part_we_n,
+ dm => std_logic_vector(part_dm)
+ );
+
+CLK_GEN: process
+ begin
+ wait for CLK_PERIOD/2;
+ clk <= not clk;
+ end process;
+
+------------------------------------------------------------------------------------------
+
+R_DATA_COMPARE:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_data_vld='1' then
+ if u_read_en = '1' then
+ assert (ref_data = u_data_r) report "Error on read!" severity failure;
+ end if;
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ ref_data((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ elsif u_read_en = '0' and rw_null_en = '0' then
+ last_data := (others => '0');
+ ref_data <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+W_DATA_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_req_wr = '1' then
+ for i in 0 to DDR_DATA_WIDTH/4-1 loop
+ u_data_w((i+1)*DDR_DATA_WIDTH/2-1 downto i*DDR_DATA_WIDTH/2) <= last_data + i + 1;
+ end loop;
+ last_data := last_data + DDR_DATA_WIDTH/4;
+ elsif u_write_en = '0' and rw_null_en = '0' then
+ last_data := (others => '0');
+ u_data_w <= (others => '0');
+ end if;
+ end if;
+ end process;
+
+ADDR_GEN:
+ process(clk_out)
+ variable last_data : unsigned(7 downto 0) := (others => '0');
+ begin
+ if rising_edge(clk_out) then
+ if u_addr_load = '1' then
+ u_addr <= u_addr_preset;
+ elsif u_addr_cnt_en = '1' then
+ if u_addr_mode = MONOTONIC then
+ u_addr <= u_addr + BURST_LEN;
+ else
+ if u_addr(u_addr'left) = '1' then
+ if BURST_LEN = 2 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "10000000000010001010100";
+ elsif BURST_LEN = 4 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "1000000000010011010110";
+ elsif BURST_LEN = 8 then
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)) <= (u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)) & u_addr(u_addr'left)) xor "100000000001011110100";
+ end if;
+ else
+ u_addr(u_addr'left downto NextExpBaseTwo(BURST_LEN)-1) <= u_addr(u_addr'left-1 downto NextExpBaseTwo(BURST_LEN)-1) & u_addr(u_addr'left);
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+performance_count:
+ process(clk_out)
+ begin
+ if rising_edge(clk_out) then
+ if u_write_en = '1' or u_read_en = '1' then
+ cycle_cnt <= cycle_cnt + 1;
+ if u_req_wr = '1' or u_req_rd = '1' then
+ data_cnt <= data_cnt + 1;
+ end if;
+ else
+ cycle_cnt <= 1;
+ data_cnt <= 0;
+ end if;
+ end if;
+ end process;
+
+ u_tag_in <= ("00" & u_write_en & u_read_en) when ((u_addr = X"333C98" or u_addr = X"000100") and u_cmd_we = '1') else "0000";
+
+ efficiency <= real(data_cnt)/real(cycle_cnt);
+ u_cmd_we <= (u_write_en or u_read_en or rw_null_en) and (not u_busy);
+ u_addr_cnt_en <= '1' when (u_cmd_we = '1' and (u_addr /= u_addr_end)) else '0';
+
+ process
+ begin
+
+ -- Write MAX_WORDS to DDR SDRAM Controller
+ wait for 4*CLK_PERIOD;
+ rst <= '0';
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ wait for 137*CLK_PERIOD;
+
+ -- Bank 0
+ test_phase <= WRITE_MULTI;
+ u_addr_preset <= X"800000";
+ if BURST_LEN = 2 then
+ u_addr_end <= X"646808";
+ elsif BURST_LEN = 4 then
+ u_addr_end <= X"7DEDD0";
+ elsif BURST_LEN = 8 then
+ u_addr_end <= X"5666B0";
+ end if;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_addr_mode <= RANDOM;
+ while u_addr /= u_addr_end loop
+ u_cmd <= UCMD_WRITE;
+ u_write_en <= '1';
+ rw_null_en <= '0';
+ if u_addr(20) = '0' then
+ u_cmd <= UCMD_READ;
+ u_write_en <= '0';
+ rw_null_en <= '1';
+ end if;
+ wait until rising_edge(clk_out);
+ end loop;
+ u_write_en <= '0';
+ rw_null_en <= '0';
+ wait for 200*CLK_PERIOD;
+
+ wait until rising_edge(clk_out) and u_busy='0';
+ -- Bank 0
+ test_phase <= READ_MULTI;
+ u_addr_preset <= X"800000";
+ if BURST_LEN = 2 then
+ u_addr_end <= X"646808";
+ elsif BURST_LEN = 4 then
+ u_addr_end <= X"7DEDD0";
+ elsif BURST_LEN = 8 then
+ u_addr_end <= X"5666B0";
+ end if;
+ u_addr_load <= '1';
+ wait until rising_edge(clk_out);
+ u_addr_load <= '0';
+ wait until rising_edge(clk_out);
+ u_addr_mode <= RANDOM;
+ while u_addr /= u_addr_end loop
+ u_cmd <= UCMD_READ;
+ u_read_en <= '1';
+ rw_null_en <= '0';
+ if u_addr(20) = '0' then
+ u_cmd <= UCMD_WRITE;
+ u_read_en <= '0';
+ rw_null_en <= '1';
+ end if;
+ wait until rising_edge(clk_out);
+ end loop;
+ u_read_en <= '0';
+ rw_null_en <= '0';
+ wait until rising_edge(clk_out) and u_data_vld='0';
+
+ wait;
+
+ end process;
+
+end architecture struct;
diff --git a/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdram_ctrl_frontend.vhd b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdram_ctrl_frontend.vhd
new file mode 100644
index 0000000..95ffa58
--- /dev/null
+++ b/lib/SDRAM/ddr_sdr_v1_4/src/tb_sdram_ctrl_frontend.vhd
@@ -0,0 +1,385 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: cpu_embedded using cpu_core and rom
+--
+-- Copyright (C) 2007 J. Ahrensfeld
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+--
+-- For questions and ideas, please contact the author at jens@jayfield.org
+--
+--------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+use work.fifo_ctrl_pkg.all;
+use work.sdram_config.all;
+use work.sdram_types.all;
+
+entity tb_sdram_ctrl_frontend is
+end;
+
+architecture struct of tb_sdram_ctrl_frontend is
+
+ -- Number of user data words for simulation
+ constant CLK_PERIOD : time := 10 ns;
+ constant BURST_LEN : natural := 2;
+
+ signal rst : std_logic := '1';
+ signal clk : std_logic := '0';
+ signal rst_out : std_logic;
+ signal clk_out : std_logic;
+ signal clk_fb : std_logic;
+ signal part_clk_p : std_logic;
+ signal part_clk_n : std_logic;
+ signal part_cke : std_logic;
+ signal part_cs_n : std_logic;
+ signal part_we_n : std_logic;
+ signal part_ras_n : std_logic;
+ signal part_cas_n : std_logic;
+ signal part_ba : unsigned(DDR_BANK_WIDTH-1 downto 0) := (others => '0');
+ signal part_dm : unsigned(DDR_DM_WIDTH-1 downto 0) := (others => '0');
+ signal part_dqs : unsigned(DDR_DQS_WIDTH-1 downto 0) := (others => '0');
+ signal part_addr : unsigned(DDR_ADDR_WIDTH-1 downto 0) := (others => '0');
+ signal part_data : unsigned(DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+ signal addr : user_addr_t := (others => '0');
+ signal r_wn : std_logic := '0';
+ signal en : std_logic := '0';
+ signal busy : std_logic;
+ signal din : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal be : unsigned(2*DDR_DM_WIDTH-1 downto 0) := "1111";
+ signal dout : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+ signal dout_vld : std_logic;
+ signal dout_re : std_logic;
+ signal dout_reg : unsigned(2*DDR_DATA_WIDTH-1 downto 0) := (others => '0');
+
+begin
+
+ clk_fb <= part_clk_p after 1 ns;
+
+ -- DDR SDRAM Controller Core
+ inst_sdram_ctrl_frontend : entity work.sdram_ctrl_frontend
+ Generic map
+ (
+ BL => BURST_LEN,
+ read_phaseshift => 0,
+ f_sysclk => 100E6,
+ fifo_depth => 4
+ )
+ Port map
+ (
+
+ sys_rst_in => rst,
+ sys_clk_in => clk,
+
+ sys_rst_out => rst_out,
+ sys_clk_out => clk_out,
+ sys_clk_fb => clk_fb,
+
+ busy => busy,
+ en => en,
+ r_wn => r_wn,
+ be => be,
+ addr => addr,
+ din => din,
+ dout => dout,
+ dout_re => dout_re,
+ dout_vld => dout_vld,
+
+ -- SDRAM signals
+ sd_clk_p => part_clk_p,
+ sd_clk_n => part_clk_n,
+ sd_cke => part_cke,
+ sd_cs_n => part_cs_n,
+ sd_cas_n => part_cas_n,
+ sd_ras_n => part_ras_n,
+ sd_we_n => part_we_n,
+ sd_addr => part_addr,
+ sd_ba => part_ba,
+ sd_dm => part_dm,
+ sd_dqs => part_dqs,
+ sd_data => part_data
+
+ );
+
+ -- MICRON DDR SDRAM Simulation Model
+ i_mt46v16m16_0 : entity work.mt46v16m16
+ port map (
+ dq => std_logic_vector(part_data),
+ dqs => std_logic_vector(part_dqs),
+ addr => std_logic_vector(part_addr),
+ ba => std_logic_vector(part_ba),
+ clk => part_clk_p,
+ clk_n => part_clk_n,
+ cke => part_cke,
+ cs_n => part_cs_n,
+ ras_n => part_ras_n,
+ cas_n => part_cas_n,
+ we_n => part_we_n,
+ dm => std_logic_vector(part_dm)
+ );
+
+CLK_GEN: process
+ begin
+ wait for CLK_PERIOD/2;
+ clk <= not clk;
+ end process;
+
+read_register:
+ process(clk_out)
+ begin
+ if rising_edge(clk_out) then
+ if dout_vld = '1' then
+ dout_reg <= dout;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------------------------------------
+ dout_re <= dout_vld;
+
+ process
+ begin
+
+ -- Write MAX_WORDS to DDR SDRAM Controller
+ wait for 4*CLK_PERIOD;
+ rst <= '0';
+
+ wait for 4*CLK_PERIOD;
+ wait until rising_edge(clk_out) and rst_out='0';
+
+ for i in 0 to 999 loop
+
en <= '1';
+ r_wn <= '0';
+ din <= to_unsigned(i, 32);
+ addr <= to_unsigned(2*i, 24);
+ wait until rising_edge(clk_out) and busy = '0';
+ end loop;
+
+ for i in 0 to 999 loop
+ en <= '1';
+ r_wn <= '1';
+ din <= to_unsigned(i, 32);
+ addr <= to_unsigned(2*i, 24);
+ wait until rising_edge(clk_out) and busy = '0';
+ end loop;
+
+ en <= '1';
+ r_wn <= '0';
+ din <= X"01020304";
+ addr <= X"000000";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"05060708";
+ addr <= X"000002";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"00001111";
+ addr <= X"000004";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"22223333";
+ addr <= X"000006";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"44445555";
+ addr <= X"000008";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"66667777";
+ addr <= X"00000a";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"88889999";
+ addr <= X"00000c";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"AAAABBBB";
+ addr <= X"00000e";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"CCCCDDDD";
+ addr <= X"000010";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"EEEEFFFF";
+ addr <= X"000012";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"FFFFFFFF";
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '1';
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"87CCCCCC";
+ be <= "1000";
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '1';
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"CC65CCCC";
+ be <= "0100";
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '1';
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"CCCC43CC";
+ be <= "0010";
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '1';
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"89ABCDEF";
+ addr <= X"000016";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"CCCCCC21";
+ be <= "0001";
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '1';
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"55555555";
+ be <= "1010";
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '1';
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"AAAAAAAA";
+ be <= "0101";
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '1';
+ addr <= X"000014";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ be <= "1111";
+ en <= '1';
+ r_wn <= '0';
+ din <= X"11223344";
+ addr <= X"000018";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ r_wn <= '1';
+ addr <= X"000010";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"55667788";
+ addr <= X"00001a";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"99990000";
+ addr <= X"00001c";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '1';
+ r_wn <= '0';
+ din <= X"AAAA5555";
+ addr <= X"000020";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ r_wn <= '1';
+ addr <= X"000000";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ r_wn <= '1';
+ addr <= X"000018";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ r_wn <= '1';
+ addr <= X"00001A";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ r_wn <= '1';
+ addr <= X"00001C";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ r_wn <= '1';
+ addr <= X"000020";
+
+ wait until rising_edge(clk_out) and busy = '0';
+ en <= '0';
+
+ wait;
+
+ end process;
+
+end architecture struct;
diff --git a/lib/VGA_ctrl/src/char_gen.vhd b/lib/VGA_ctrl/src/char_gen.vhd
new file mode 100644
index 0000000..5d82fc9
--- /dev/null
+++ b/lib/VGA_ctrl/src/char_gen.vhd
@@ -0,0 +1,546 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 11:25:45 10/15/05
+-- Design Name:
+-- Module Name: char_gen - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+use work.vga_types.all;
+
+entity char_gen is
+ Generic
+ (
+ tsvga : vga_timespec_t := ts_vga_800_600_72;
+
+ -- User supplied parameters
+ CHARACTER_SCALE : natural := 1;
+ CHAR_ROM_SIZE_X : natural := 8; -- Pixels
+ CHAR_ROM_SIZE_Y : natural := 16; -- Pixels
+ CHAR_ROM_DEPTH : natural := 256; -- Chars
+ MAX_CHAR_PER_LINE : natural := 32; -- Chars
+ MAX_LINE_PER_FRAME : natural := 16; -- Chars
+ CHAR_SPACING_X : natural := 0; -- Pixels
+ CHAR_SPACING_Y : natural := 0; -- Pixels
+ SCREEN_OFFSET_X : natural := 16; -- Pixels
+ SCREEN_OFFSET_Y : natural := 16 -- Pixels
+ );
+ Port
+ (
+ -- System signals
+ rst : in std_logic;
+ vga_clk : in std_logic;
+ sys_clk : in std_logic;
+ ce : in std_logic;
+ frame_pulse : in std_logic;
+
+
+ -- Host Signals
+ clr_screen : in std_logic;
+ clr_line : in std_logic;
+ ascii_data : in unsigned(7 downto 0);
+ ascii_data_we : in std_logic;
+ ascii_posy_we : in std_logic;
+ ascii_posx_we : in std_logic;
+ ready : out std_logic;
+
+ -- Control signals
+ pos_x : in natural range 0 to tsvga.ts_h.ncyc_scan-1;
+ pos_y : in natural range 0 to tsvga.ts_v.ncyc_scan-1;
+
+ -- Output
+ char_draw_en : out std_logic
+
+ );
+end char_gen;
+
+architecture Behavioral of char_gen is
+
+ constant A_RAM_ADDR_WIDTH : integer := 12;
+ constant A_RAM_DATA_WIDTH : integer := 8;
+
+ type offset_rom_t is array (0 to MAX_LINE_PER_FRAME-1) of unsigned(A_RAM_ADDR_WIDTH-1 downto 0);
+
+
+
+ function gen_offset_rom(num_char_per_line, num_lines : natural) return offset_rom_t is
+ variable result : offset_rom_t;
+
+ variable offset : unsigned(A_RAM_ADDR_WIDTH-1 downto 0) := (others => '0');
+ begin
+ for i in 0 to num_lines-1 loop
+ result(i) := offset;
+ offset := offset + to_unsigned(num_char_per_line, A_RAM_ADDR_WIDTH-1);
+ end loop;
+ return result;
+ end gen_offset_rom;
+
+ constant offset_rom : offset_rom_t := gen_offset_rom(MAX_CHAR_PER_LINE, MAX_LINE_PER_FRAME);
+
+ -- Calculated parameters
+ type cg_state_t is (cg_init, cg_ready, cg_clr_line, cg_clr_screen);
+ signal s, sn : cg_state_t;
+
+ constant CELL_SIZE_X : natural := (CHAR_ROM_SIZE_X+CHAR_SPACING_X)*CHARACTER_SCALE;
+ constant CELL_SIZE_Y : natural := (CHAR_ROM_SIZE_Y+CHAR_SPACING_Y)*CHARACTER_SCALE;
+ constant CHAR_SIZE_X : natural := CHAR_ROM_SIZE_X*CHARACTER_SCALE;
+ constant CHAR_SIZE_Y : natural := CHAR_ROM_SIZE_Y*CHARACTER_SCALE;
+
+ signal line_offset : natural range 0 to MAX_LINE_PER_FRAME-1;
+ signal cell_x_cnt : natural range 0 to MAX_CHAR_PER_LINE-1;
+ signal cell_y_cnt : natural range 0 to MAX_LINE_PER_FRAME-1;
+ signal char_x_cnt : natural range 0 to CELL_SIZE_X-1;
+ signal char_y_cnt : natural range 0 to CELL_SIZE_Y-1;
+ signal char_rom_row : unsigned(NextExpBaseTwo(CHAR_SIZE_Y)-1 downto 0);
+ signal char_rom_addr : unsigned(NextExpBaseTwo(CHAR_ROM_DEPTH*CHAR_ROM_SIZE_Y)-1 downto 0);
+ signal char_rom_data : unsigned(CHAR_ROM_SIZE_X-1 downto 0);
+ signal char_reg : unsigned((CHARACTER_SCALE*CHAR_ROM_SIZE_X)-1 downto 0);
+
+ signal a_addr_rd : unsigned(A_RAM_ADDR_WIDTH-1 downto 0);
+ signal a_addr_wr : unsigned(A_RAM_ADDR_WIDTH-1 downto 0);
+ signal a_data_rd : unsigned(A_RAM_DATA_WIDTH-1 downto 0);
+ signal a_data_wr : unsigned(A_RAM_DATA_WIDTH-1 downto 0);
+ signal a_ram_we : std_logic;
+ signal a_cnt : natural range 0 to 2**A_RAM_ADDR_WIDTH-1;
+ signal a_cnt_rst : std_logic;
+ signal a_cnt_en : std_logic;
+ signal csr_posx_reg : natural range 0 to MAX_CHAR_PER_LINE-1;
+ signal csr_posy_reg : natural range 0 to MAX_LINE_PER_FRAME-1;
+ signal a_data_reg : unsigned(A_RAM_DATA_WIDTH-1 downto 0);
+ signal a_data_we : std_logic;
+ signal csr_posx_overflow : std_logic;
+ signal csr_posx_cnt_din : natural range 0 to MAX_CHAR_PER_LINE-1;
+ signal csr_posx_cnt_set : std_logic;
+ signal csr_posx_cnt_en : std_logic;
+ signal csr_posy_overflow : std_logic;
+ signal csr_posy_cnt_din : natural range 0 to MAX_LINE_PER_FRAME-1;
+ signal csr_posy_cnt_set : std_logic;
+ signal csr_posy_cnt_en : std_logic;
+
+ signal line_addr : unsigned(A_RAM_ADDR_WIDTH-1 downto 0);
+ signal char_addr : unsigned(A_RAM_ADDR_WIDTH-1 downto 0);
+
+ -- Visible Cursor
+ constant CURSOR_BLINK_INTERVAL : natural := tsvga.nfps/2;
+
+ type cursor_rom_t is array (0 to 2*CHAR_ROM_SIZE_Y-1) of unsigned (CHAR_ROM_SIZE_X-1 downto 0);
+ constant cursor_rom : cursor_rom_t :=
+ (
+ -- Cursor off
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "00000000",
+ "11111111",
+ "11111111",
+ "11111111",
+
+ -- Cursor on
+ "00000000",
+ "00000000",
+ "11111111",
+ "11111111",
+ "11111111",
+ "11111111",
+ "11111111",
+ "11111111",
+ "11111111",
+ "11111111",
+ "11111111",
+ "11111111",
+ "11111111",
+ "00000000",
+ "00000000",
+ "00000000"
+
+ );
+ signal cursor_rom_addr : unsigned(NextExpBaseTwo(2*CHAR_ROM_SIZE_Y)-1 downto 0);
+ signal cursor_rom_data : unsigned(CHAR_ROM_SIZE_X-1 downto 0);
+ signal cursor_visible : std_logic;
+ signal cursor_cnt : natural range 0 to CURSOR_BLINK_INTERVAL-1;
+ signal csr_posx_synced : natural range 0 to MAX_CHAR_PER_LINE-1;
+ signal csr_posy_synced : natural range 0 to MAX_LINE_PER_FRAME-1;
+
+ -- Scrolling
+ signal scroll_offset : natural range 0 to MAX_CHAR_PER_LINE-1;
+ signal scroll_active : std_logic;
+
+
+begin
+
+ a_addr_rd <= to_unsigned(cell_x_cnt, a_addr_rd'length) + offset_rom(line_offset);
+ line_addr <= offset_rom(csr_posy_reg);
+ char_addr <= to_unsigned(csr_posx_reg, char_addr'length);
+ char_rom_addr <= a_data_rd & char_rom_row(NextExpBaseTwo(CHAR_SIZE_Y)-1 downto (CHARACTER_SCALE-1));
+ cursor_rom_addr <= cursor_visible & char_rom_row(NextExpBaseTwo(CHAR_SIZE_Y)-1 downto (CHARACTER_SCALE-1));
+
+ inst_char_rom : entity work.char_rom
+ PORT MAP
+ (
+ CLK => vga_clk,
+ ADDR => char_rom_addr,
+ DATA => char_rom_data
+ );
+
+ inst_ascii_ram: entity work.dpram
+ GENERIC MAP (
+ addr_width => A_RAM_ADDR_WIDTH,
+ data_width => A_RAM_DATA_WIDTH
+ )
+ PORT MAP(
+ clka => sys_clk,
+ clkb => vga_clk,
+ en_a => '1',
+ en_b => '1',
+ we_a => a_ram_we,
+ addr_a => a_addr_wr,
+ addr_b => a_addr_rd,
+ din_a => a_data_wr,
+ dout_b => a_data_rd
+ );
+
+ ---------------------------------------------------------------------------------------------
+ --- ASCII RAM control
+ ---------------------------------------------------------------------------------------------
+ asci_ram_fsm:
+ process (s, a_cnt, clr_line, clr_screen, a_data_we, a_data_reg, char_addr, line_addr)
+ begin
+ sn <= s;
+ a_cnt_rst <= '0';
+ a_cnt_en <= '0';
+ a_ram_we <= '0';
+ a_data_wr <= a_data_reg;
+ a_addr_wr <= char_addr + line_addr;
+ ready <= '0';
+
+ case s is
+
+ when cg_init =>
+ sn <= cg_clr_screen;
+ a_cnt_rst <= '1';
+ when cg_ready =>
+ ready <= '1';
+ a_ram_we <= a_data_we;
+ if clr_screen = '1' then
+ a_cnt_rst <= '1';
+ sn <= cg_clr_screen;
+ elsif clr_line = '1' then
+ a_cnt_rst <= '1';
+ sn <= cg_clr_line;
+ end if;
+ when cg_clr_line =>
+ a_ram_we <= '1';
+ a_cnt_en <= '1';
+ a_data_wr <= to_unsigned(0, A_RAM_DATA_WIDTH);
+ a_addr_wr <= to_unsigned(a_cnt + to_integer(line_addr), A_RAM_ADDR_WIDTH);
+ if a_cnt = MAX_CHAR_PER_LINE-1 then
+ sn <= cg_ready;
+ end if;
+ when cg_clr_screen =>
+ a_ram_we <= '1';
+ a_cnt_en <= '1';
+ a_data_wr <= to_unsigned(0, A_RAM_DATA_WIDTH);
+ a_addr_wr <= to_unsigned(a_cnt, A_RAM_ADDR_WIDTH);
+ if a_cnt = (2**A_RAM_ADDR_WIDTH-1) then
+ sn <= cg_ready;
+ end if;
+
+ when others =>
+ sn <= cg_ready;
+
+ end case;
+ end process;
+
+ asci_ram_fsm_next: process (rst, sys_clk)
+ begin
+ if rst = '1' then
+ s <= cg_init;
+ elsif rising_edge(sys_clk) then
+ s <= sn;
+ end if;
+ end process;
+
+ ---------------------------------------------------------------------------------------------
+ asci_ram_cnt: process (rst, sys_clk)
+ begin
+ if rst = '1' then
+ a_cnt <= 0;
+ elsif rising_edge(sys_clk) then
+ if a_cnt_rst = '1' then
+ a_cnt <= 0;
+ elsif a_cnt_en = '1' then
+ if a_cnt < (2**A_RAM_ADDR_WIDTH-1) then
+ a_cnt <= a_cnt + 1;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ ---------------------------------------------------------------------------------------------
+ asci_addr_reg: process (rst, sys_clk)
+ begin
+ if rst = '1' then
+ csr_posx_cnt_en <= '0';
+ csr_posx_cnt_set <= '0';
+ csr_posy_cnt_en <= '0';
+ csr_posy_cnt_set <= '0';
+ a_data_reg <= (others => '0');
+ a_data_we <= '0';
+ elsif rising_edge(sys_clk) then
+ a_data_we <= '0';
+ csr_posx_cnt_en <= '0';
+ csr_posx_cnt_set <= '0';
+ csr_posy_cnt_en <= '0';
+ csr_posy_cnt_set <= '0';
+ if ascii_posy_we = '1' then
+ csr_posy_cnt_din <= to_integer(ascii_data);
+ csr_posy_cnt_set <= '1';
+ elsif ascii_posx_we = '1' then
+ csr_posx_cnt_din <= to_integer(ascii_data);
+ csr_posx_cnt_set <= '1';
+ elsif ascii_data_we = '1' then
+ if ascii_data < X"20" then
+ if ascii_data = X"0D" then
+ csr_posx_cnt_din <= 0;
+ csr_posx_cnt_set <= '1';
+ elsif ascii_data = X"0A" then
+ csr_posy_cnt_en <= '1';
+ end if;
+ else
+ a_data_reg <= ascii_data - X"20";
+ a_data_we <= '1';
+ csr_posx_cnt_en <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ asci_csr_posx_counter:
+ process (rst, sys_clk)
+ begin
+ if rst = '1' then
+ csr_posx_reg <= 0;
+ csr_posx_overflow <= '0';
+ elsif rising_edge(sys_clk) then
+ csr_posx_overflow <= '0';
+ if csr_posx_cnt_set = '1' then
+ csr_posx_reg <= csr_posx_cnt_din;
+ elsif csr_posx_cnt_en = '1' then
+ if csr_posx_reg < MAX_CHAR_PER_LINE-1 then
+ csr_posx_reg <= csr_posx_reg + 1;
+ else
+ csr_posx_reg <= 0;
+ csr_posx_overflow <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ asci_csr_posy_counter:
+ process (rst, sys_clk)
+ begin
+ if rst = '1' then
+ csr_posy_reg <= 0;
+ csr_posy_overflow <= '0';
+ elsif rising_edge(sys_clk) then
+ csr_posy_overflow <= '0';
+ if csr_posy_cnt_set = '1' then
+ csr_posy_reg <= csr_posy_cnt_din;
+ elsif csr_posy_cnt_en = '1' or csr_posx_overflow = '1' then
+ if csr_posy_reg < MAX_LINE_PER_FRAME-1 then
+ csr_posy_reg <= csr_posy_reg + 1;
+ else
+ csr_posy_reg <= 0;
+ csr_posy_overflow <= '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ scroll_gen: process (rst, sys_clk)
+ begin
+ if rst = '1' then
+ scroll_offset <= 0;
+ scroll_active <= '0';
+ elsif rising_edge(sys_clk) then
+ if clr_screen = '1' then
+ scroll_offset <= 0;
+ scroll_active <= '0';
+ elsif csr_posy_overflow = '1' then
+ scroll_active <= '1';
+ scroll_offset <= 1;
+ end if;
+ if (csr_posy_cnt_en = '1' or csr_posx_overflow = '1') and scroll_active = '1' then
+ scroll_offset <= scroll_offset + 1;
+ end if;
+ end if;
+ end process;
+
+ ---------------------------------------------------------------------------------------------
+ --- Cursor generator
+ ---------------------------------------------------------------------------------------------
+ proc_sync_csr_posx:
+ process(vga_clk)
+ variable p1, p2 : natural range 0 to MAX_CHAR_PER_LINE-1;
+ begin
+ if rising_edge(vga_clk) then
+ csr_posx_synced <= p2;
+ p2 := p1;
+ p1 := csr_posx_reg;
+ end if;
+ end process;
+
+ proc_sync_csr_posy:
+ process(vga_clk)
+ variable p1, p2 : natural range 0 to MAX_LINE_PER_FRAME-1;
+ begin
+ if rising_edge(vga_clk) then
+ csr_posy_synced <= p2;
+ p2 := p1;
+ p1 := csr_posy_reg;
+ end if;
+ end process;
+
+ csr_blink_cnt: process (rst, vga_clk)
+ begin
+ if rst = '1' then
+ cursor_cnt <= 0;
+ cursor_visible <= '0';
+ elsif rising_edge(vga_clk) then
+ if frame_pulse = '1' then
+ if cursor_cnt < CURSOR_BLINK_INTERVAL-1 then
+ cursor_cnt <= cursor_cnt + 1;
+ else
+ cursor_cnt <= 0;
+ cursor_visible <= not cursor_visible;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ cursor_rom_read: process (vga_clk)
+ begin
+ if rising_edge(vga_clk) then
+ cursor_rom_data <= (others => '0');
+ if (cell_x_cnt = csr_posx_synced) and (line_offset = csr_posy_synced) then
+ cursor_rom_data <= cursor_rom(to_integer(cursor_rom_addr));
+ end if;
+ end if;
+ end process;
+
+ ---------------------------------------------------------------------------------------------
+ --- Character generator
+ ---------------------------------------------------------------------------------------------
+ char_rom_ctrl: process (vga_clk)
+ begin
+ if rising_edge(vga_clk) then
+ char_rom_row <= to_unsigned(char_y_cnt, char_rom_row'length);
+ end if;
+ end process;
+
+ ---------------------------------------------------------------------------------------------
+ char_reg_ctrl: process (vga_clk)
+ begin
+ if rising_edge(vga_clk) and ce = '1' then
+ if char_x_cnt = 2 then -- +2 delay for ASCII-RAM access and CHAR-ROM access
+ for i in 0 to CHAR_ROM_SIZE_X-1 loop
+ for j in 0 to CHARACTER_SCALE-1 loop
+ char_reg(i*CHARACTER_SCALE + j) <= char_rom_data(i) xor cursor_rom_data(i);
+ end loop;
+ end loop;
+ else
+ char_reg <= char_reg(char_reg'left-1 downto 0) & '0';
+ end if;
+ end if;
+ end process;
+
+ ---------------------------------------------------------------------------------------------
+ cg_ctrl: process (rst, vga_clk)
+ variable enable_x : std_logic;
+ variable enable_y : std_logic;
+ variable char_en : std_logic;
+ variable char_en2 : std_logic;
+ begin
+
+ if (rst = '1') then
+ enable_x := '0';
+ enable_y := '0';
+ line_offset <= 0;
+ cell_x_cnt <= 0;
+ cell_y_cnt <= 0;
+ char_x_cnt <= 0;
+ char_y_cnt <= 0;
+ char_en := '0';
+ elsif rising_edge(vga_clk) and ce = '1' then
+ char_draw_en <= char_en2 and char_reg(char_reg'left);
+ char_en2 := char_en;
+ char_en := '0';
+ if pos_y = SCREEN_OFFSET_Y then
+ enable_y := '1';
+ cell_y_cnt <= 0;
+ char_x_cnt <= 0;
+ line_offset <= scroll_offset;
+ end if;
+ if pos_x = SCREEN_OFFSET_X and enable_y = '1' then
+ enable_x := '1';
+ cell_x_cnt <= 0;
+ char_x_cnt <= 0;
+ elsif enable_x = '1' and enable_y = '1' then
+ if char_x_cnt < CELL_SIZE_X-1 then
+ char_x_cnt <= char_x_cnt + 1;
+ else
+ char_x_cnt <= 0;
+ if cell_x_cnt < MAX_CHAR_PER_LINE-1 then
+ cell_x_cnt <= cell_x_cnt + 1;
+ else
+ enable_x := '0';
+ if char_y_cnt < CELL_SIZE_Y-1 then
+ char_y_cnt <= char_y_cnt + 1;
+ else
+ char_y_cnt <= 0;
+ if cell_y_cnt < MAX_LINE_PER_FRAME-1 then
+ cell_y_cnt <= cell_y_cnt + 1;
+ else
+ enable_y := '0';
+ end if;
+ if line_offset < MAX_LINE_PER_FRAME-1 then
+ line_offset <= line_offset + 1;
+ else
+ line_offset <= 0;
+ end if;
+ end if;
+ end if;
+ end if;
+ if (char_x_cnt < CHAR_SIZE_X) and (char_y_cnt < CHAR_SIZE_Y) then
+ char_en := '1';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ ---------------------------------------------------------------------------------------------
+end Behavioral;
diff --git a/lib/VGA_ctrl/src/clkgen_virtex4.vhd b/lib/VGA_ctrl/src/clkgen_virtex4.vhd
new file mode 100644
index 0000000..0b58baf
--- /dev/null
+++ b/lib/VGA_ctrl/src/clkgen_virtex4.vhd
@@ -0,0 +1,105 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 11:25:45 10/15/05
+-- Design Name:
+-- Module Name: vga_ctrl_core - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+use work.vga_types.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+Library UNISIM;
+use UNISIM.vcomponents.all;
+
+entity clkgen is
+ Generic
+ (
+ sys_freq : integer := 100E6;
+ tsvga : vga_timespec_t := ts_vga_800_600_72
+ );
+ Port
+ (
+ rst : in std_logic;
+ clk : in std_logic;
+ vga_clk : out std_logic;
+ dcm_locked : out std_logic
+ );
+end clkgen;
+
+architecture tech of clkgen is
+
+ signal vga_clk0 : std_logic;
+ signal dcm_clk0 : std_logic;
+ signal dcm_clk_fb : std_logic;
+
+ begin
+
+ -- Compnent instantiation
+ DCM_VGA_CLK_inst : DCM_BASE
+ generic map (
+ CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
+ -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
+ CLKFX_DIVIDE => DCM_FREQ_D(sys_freq, tsvga.f_pxl_clk), -- Can be any interger from 1 to 32
+ CLKFX_MULTIPLY => DCM_FREQ_M(sys_freq, tsvga.f_pxl_clk), -- Can be any integer from 2 to 32
+ CLKIN_DIVIDE_BY_2 => FALSE, -- TRUE/FALSE to enable CLKIN divide by two feature
+ CLKIN_PERIOD => DCM_PERIOD(sys_freq), -- Specify period of input clock in ns from 1.25 to 1000.00
+ CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift mode of NONE or FIXED
+ CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE or 1X
+ DCM_PERFORMANCE_MODE => "MAX_SPEED", -- Can be MAX_SPEED or MAX_RANGE
+ DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS", -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
+ -- an integer from 0 to 15
+ DFS_FREQUENCY_MODE => "LOW", -- LOW or HIGH frequency mode for frequency synthesis
+ DLL_FREQUENCY_MODE => "LOW", -- LOW, HIGH, or HIGH_SER frequency mode for DLL
+ DUTY_CYCLE_CORRECTION => TRUE, -- Duty cycle correction, TRUE or FALSE
+ FACTORY_JF => X"F0F0", -- FACTORY JF Values Suggested to be set to X"F0F0"
+ PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 1023
+ STARTUP_WAIT => FALSE) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE
+ port map (
+ CLK0 => dcm_clk0, -- 0 degree DCM CLK ouptput
+ CLK180 => open, -- 180 degree DCM CLK output
+ CLK270 => open, -- 270 degree DCM CLK output
+ CLK2X => open, -- 2X DCM CLK output
+ CLK2X180 => open, -- 2X, 180 degree DCM CLK out
+ CLK90 => open, -- 90 degree DCM CLK output
+ CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE)
+ CLKFX => vga_clk0, -- DCM CLK synthesis out (M/D)
+ CLKFX180 => open, -- 180 degree CLK synthesis out
+ LOCKED => dcm_locked, -- DCM LOCK status output
+ CLKFB => dcm_clk_fb, -- DCM clock feedback
+ CLKIN => clk, -- Clock input (from IBUFG, BUFG or DCM)
+ RST => rst -- DCM asynchronous reset input
+ );
+
+ BUFG_dcm_clk_fb : BUFG
+ port map
+ (
+ O => dcm_clk_fb, -- Clock buffer output
+ I => dcm_clk0 -- Clock buffer input
+ );
+
+ BUFG_vga_clk : BUFG
+ port map
+ (
+ O => vga_clk, -- Clock buffer output
+ I => vga_clk0 -- Clock buffer input
+ );
+
+
+end tech;
diff --git a/lib/VGA_ctrl/src/dpram.vhd b/lib/VGA_ctrl/src/dpram.vhd
new file mode 100644
index 0000000..b6c5419
--- /dev/null
+++ b/lib/VGA_ctrl/src/dpram.vhd
@@ -0,0 +1,79 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: Dual-ported register file with asynchrous read
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+entity dpram is
+ Generic
+ (
+ addr_width : integer := 3;
+ data_width : integer := 8
+ );
+ Port
+ (
+ clka : in STD_LOGIC;
+ clkb : in STD_LOGIC;
+ en_a : in STD_LOGIC;
+ en_b : in STD_LOGIC;
+ we_a : in STD_LOGIC;
+ addr_a : in unsigned (addr_width-1 downto 0);
+ addr_b : in unsigned (addr_width-1 downto 0);
+ din_a : in unsigned (data_width-1 downto 0);
+ dout_b : out unsigned (data_width-1 downto 0)
+ );
+end dpram;
+
+architecture Behavioral of dpram is
+
+ constant depth : integer := 2**addr_width;
+ type RAMtype is array (0 to depth-1) of unsigned (data_width-1 downto 0);
+ signal RAM : RAMtype;
+
+begin
+
+process (clka)
+ begin
+ if clka'event and clka = '1' then
+ if en_a = '1' then
+ if we_a = '1' then
+ RAM(to_integer(addr_a)) <= din_a;
+ end if;
+ end if;
+ end if;
+end process;
+
+process (clkb)
+ begin
+ if clkb'event and clkb = '1' then
+ if en_b = '1' then
+ dout_b <= RAM(to_integer(addr_b));
+ end if;
+ end if;
+end process;
+
+
+end Behavioral;
+
diff --git a/lib/VGA_ctrl/src/fonts/Fixedsys_8x15.bff b/lib/VGA_ctrl/src/fonts/Fixedsys_8x15.bff
new file mode 100644
index 0000000..a1d2353
Binary files /dev/null and b/lib/VGA_ctrl/src/fonts/Fixedsys_8x15.bff differ
diff --git a/lib/VGA_ctrl/src/fonts/Fixedsys_8x16.bff b/lib/VGA_ctrl/src/fonts/Fixedsys_8x16.bff
new file mode 100644
index 0000000..b5c16cc
Binary files /dev/null and b/lib/VGA_ctrl/src/fonts/Fixedsys_8x16.bff differ
diff --git a/lib/VGA_ctrl/src/fonts/Fixedsys_9x16.bff b/lib/VGA_ctrl/src/fonts/Fixedsys_9x16.bff
new file mode 100644
index 0000000..158e99f
Binary files /dev/null and b/lib/VGA_ctrl/src/fonts/Fixedsys_9x16.bff differ
diff --git a/lib/VGA_ctrl/src/fonts/System_16x16.bff b/lib/VGA_ctrl/src/fonts/System_16x16.bff
new file mode 100644
index 0000000..4ca2523
Binary files /dev/null and b/lib/VGA_ctrl/src/fonts/System_16x16.bff differ
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_c64.vhd b/lib/VGA_ctrl/src/fonts/char_rom_c64.vhd
new file mode 100644
index 0000000..5a544d0
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_c64.vhd
@@ -0,0 +1,540 @@
+-- generated with romgen v3.0 by MikeJ
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(7 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(7 downto 0);
+ constant ROM : ROM_ARRAY := (
+ x"3C",x"66",x"6E",x"6E",x"60",x"62",x"3C",x"00", -- 0x0000
+ x"18",x"3C",x"66",x"7E",x"66",x"66",x"66",x"00", -- 0x0008
+ x"7C",x"66",x"66",x"7C",x"66",x"66",x"7C",x"00", -- 0x0010
+ x"3C",x"66",x"60",x"60",x"60",x"66",x"3C",x"00", -- 0x0018
+ x"78",x"6C",x"66",x"66",x"66",x"6C",x"78",x"00", -- 0x0020
+ x"7E",x"60",x"60",x"78",x"60",x"60",x"7E",x"00", -- 0x0028
+ x"7E",x"60",x"60",x"78",x"60",x"60",x"60",x"00", -- 0x0030
+ x"3C",x"66",x"60",x"6E",x"66",x"66",x"3C",x"00", -- 0x0038
+ x"66",x"66",x"66",x"7E",x"66",x"66",x"66",x"00", -- 0x0040
+ x"3C",x"18",x"18",x"18",x"18",x"18",x"3C",x"00", -- 0x0048
+ x"1E",x"0C",x"0C",x"0C",x"0C",x"6C",x"38",x"00", -- 0x0050
+ x"66",x"6C",x"78",x"70",x"78",x"6C",x"66",x"00", -- 0x0058
+ x"60",x"60",x"60",x"60",x"60",x"60",x"7E",x"00", -- 0x0060
+ x"63",x"77",x"7F",x"6B",x"63",x"63",x"63",x"00", -- 0x0068
+ x"66",x"76",x"7E",x"7E",x"6E",x"66",x"66",x"00", -- 0x0070
+ x"3C",x"66",x"66",x"66",x"66",x"66",x"3C",x"00", -- 0x0078
+ x"7C",x"66",x"66",x"7C",x"60",x"60",x"60",x"00", -- 0x0080
+ x"3C",x"66",x"66",x"66",x"66",x"3C",x"0E",x"00", -- 0x0088
+ x"7C",x"66",x"66",x"7C",x"78",x"6C",x"66",x"00", -- 0x0090
+ x"3C",x"66",x"60",x"3C",x"06",x"66",x"3C",x"00", -- 0x0098
+ x"7E",x"18",x"18",x"18",x"18",x"18",x"18",x"00", -- 0x00A0
+ x"66",x"66",x"66",x"66",x"66",x"66",x"3C",x"00", -- 0x00A8
+ x"66",x"66",x"66",x"66",x"66",x"3C",x"18",x"00", -- 0x00B0
+ x"63",x"63",x"63",x"6B",x"7F",x"77",x"63",x"00", -- 0x00B8
+ x"66",x"66",x"3C",x"18",x"3C",x"66",x"66",x"00", -- 0x00C0
+ x"66",x"66",x"66",x"3C",x"18",x"18",x"18",x"00", -- 0x00C8
+ x"7E",x"06",x"0C",x"18",x"30",x"60",x"7E",x"00", -- 0x00D0
+ x"3C",x"30",x"30",x"30",x"30",x"30",x"3C",x"00", -- 0x00D8
+ x"0C",x"12",x"30",x"7C",x"30",x"62",x"FC",x"00", -- 0x00E0
+ x"3C",x"0C",x"0C",x"0C",x"0C",x"0C",x"3C",x"00", -- 0x00E8
+ x"00",x"18",x"3C",x"7E",x"18",x"18",x"18",x"18", -- 0x00F0
+ x"00",x"10",x"30",x"7F",x"7F",x"30",x"10",x"00", -- 0x00F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0100
+ x"18",x"18",x"18",x"18",x"00",x"00",x"18",x"00", -- 0x0108
+ x"66",x"66",x"66",x"00",x"00",x"00",x"00",x"00", -- 0x0110
+ x"66",x"66",x"FF",x"66",x"FF",x"66",x"66",x"00", -- 0x0118
+ x"18",x"3E",x"60",x"3C",x"06",x"7C",x"18",x"00", -- 0x0120
+ x"62",x"66",x"0C",x"18",x"30",x"66",x"46",x"00", -- 0x0128
+ x"3C",x"66",x"3C",x"38",x"67",x"66",x"3F",x"00", -- 0x0130
+ x"06",x"0C",x"18",x"00",x"00",x"00",x"00",x"00", -- 0x0138
+ x"0C",x"18",x"30",x"30",x"30",x"18",x"0C",x"00", -- 0x0140
+ x"30",x"18",x"0C",x"0C",x"0C",x"18",x"30",x"00", -- 0x0148
+ x"00",x"66",x"3C",x"FF",x"3C",x"66",x"00",x"00", -- 0x0150
+ x"00",x"18",x"18",x"7E",x"18",x"18",x"00",x"00", -- 0x0158
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"30", -- 0x0160
+ x"00",x"00",x"00",x"7E",x"00",x"00",x"00",x"00", -- 0x0168
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"00", -- 0x0170
+ x"00",x"03",x"06",x"0C",x"18",x"30",x"60",x"00", -- 0x0178
+ x"3C",x"66",x"6E",x"76",x"66",x"66",x"3C",x"00", -- 0x0180
+ x"18",x"18",x"38",x"18",x"18",x"18",x"7E",x"00", -- 0x0188
+ x"3C",x"66",x"06",x"0C",x"30",x"60",x"7E",x"00", -- 0x0190
+ x"3C",x"66",x"06",x"1C",x"06",x"66",x"3C",x"00", -- 0x0198
+ x"06",x"0E",x"1E",x"66",x"7F",x"06",x"06",x"00", -- 0x01A0
+ x"7E",x"60",x"7C",x"06",x"06",x"66",x"3C",x"00", -- 0x01A8
+ x"3C",x"66",x"60",x"7C",x"66",x"66",x"3C",x"00", -- 0x01B0
+ x"7E",x"66",x"0C",x"18",x"18",x"18",x"18",x"00", -- 0x01B8
+ x"3C",x"66",x"66",x"3C",x"66",x"66",x"3C",x"00", -- 0x01C0
+ x"3C",x"66",x"66",x"3E",x"06",x"66",x"3C",x"00", -- 0x01C8
+ x"00",x"00",x"18",x"00",x"00",x"18",x"00",x"00", -- 0x01D0
+ x"00",x"00",x"18",x"00",x"00",x"18",x"18",x"30", -- 0x01D8
+ x"0E",x"18",x"30",x"60",x"30",x"18",x"0E",x"00", -- 0x01E0
+ x"00",x"00",x"7E",x"00",x"7E",x"00",x"00",x"00", -- 0x01E8
+ x"70",x"18",x"0C",x"06",x"0C",x"18",x"70",x"00", -- 0x01F0
+ x"3C",x"66",x"06",x"0C",x"18",x"00",x"18",x"00", -- 0x01F8
+ x"00",x"00",x"00",x"FF",x"FF",x"00",x"00",x"00", -- 0x0200
+ x"08",x"1C",x"3E",x"7F",x"7F",x"1C",x"3E",x"00", -- 0x0208
+ x"18",x"18",x"18",x"18",x"18",x"18",x"18",x"18", -- 0x0210
+ x"00",x"00",x"00",x"FF",x"FF",x"00",x"00",x"00", -- 0x0218
+ x"00",x"00",x"FF",x"FF",x"00",x"00",x"00",x"00", -- 0x0220
+ x"00",x"FF",x"FF",x"00",x"00",x"00",x"00",x"00", -- 0x0228
+ x"00",x"00",x"00",x"00",x"FF",x"FF",x"00",x"00", -- 0x0230
+ x"30",x"30",x"30",x"30",x"30",x"30",x"30",x"30", -- 0x0238
+ x"0C",x"0C",x"0C",x"0C",x"0C",x"0C",x"0C",x"0C", -- 0x0240
+ x"00",x"00",x"00",x"E0",x"F0",x"38",x"18",x"18", -- 0x0248
+ x"18",x"18",x"1C",x"0F",x"07",x"00",x"00",x"00", -- 0x0250
+ x"18",x"18",x"38",x"F0",x"E0",x"00",x"00",x"00", -- 0x0258
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"FF",x"FF", -- 0x0260
+ x"C0",x"E0",x"70",x"38",x"1C",x"0E",x"07",x"03", -- 0x0268
+ x"03",x"07",x"0E",x"1C",x"38",x"70",x"E0",x"C0", -- 0x0270
+ x"FF",x"FF",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0", -- 0x0278
+ x"FF",x"FF",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0280
+ x"00",x"3C",x"7E",x"7E",x"7E",x"7E",x"3C",x"00", -- 0x0288
+ x"00",x"00",x"00",x"00",x"00",x"FF",x"FF",x"00", -- 0x0290
+ x"36",x"7F",x"7F",x"7F",x"3E",x"1C",x"08",x"00", -- 0x0298
+ x"60",x"60",x"60",x"60",x"60",x"60",x"60",x"60", -- 0x02A0
+ x"00",x"00",x"00",x"07",x"0F",x"1C",x"18",x"18", -- 0x02A8
+ x"C3",x"E7",x"7E",x"3C",x"3C",x"7E",x"E7",x"C3", -- 0x02B0
+ x"00",x"3C",x"7E",x"66",x"66",x"7E",x"3C",x"00", -- 0x02B8
+ x"18",x"18",x"66",x"66",x"18",x"18",x"3C",x"00", -- 0x02C0
+ x"06",x"06",x"06",x"06",x"06",x"06",x"06",x"06", -- 0x02C8
+ x"08",x"1C",x"3E",x"7F",x"3E",x"1C",x"08",x"00", -- 0x02D0
+ x"18",x"18",x"18",x"FF",x"FF",x"18",x"18",x"18", -- 0x02D8
+ x"C0",x"C0",x"30",x"30",x"C0",x"C0",x"30",x"30", -- 0x02E0
+ x"18",x"18",x"18",x"18",x"18",x"18",x"18",x"18", -- 0x02E8
+ x"00",x"00",x"03",x"3E",x"76",x"36",x"36",x"00", -- 0x02F0
+ x"FF",x"7F",x"3F",x"1F",x"0F",x"07",x"03",x"01", -- 0x02F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0300
+ x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x0308
+ x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0310
+ x"FF",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0318
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"FF", -- 0x0320
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0", -- 0x0328
+ x"CC",x"CC",x"33",x"33",x"CC",x"CC",x"33",x"33", -- 0x0330
+ x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0338
+ x"00",x"00",x"00",x"00",x"CC",x"CC",x"33",x"33", -- 0x0340
+ x"FF",x"FE",x"FC",x"F8",x"F0",x"E0",x"C0",x"80", -- 0x0348
+ x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0350
+ x"18",x"18",x"18",x"1F",x"1F",x"18",x"18",x"18", -- 0x0358
+ x"00",x"00",x"00",x"00",x"0F",x"0F",x"0F",x"0F", -- 0x0360
+ x"18",x"18",x"18",x"1F",x"1F",x"00",x"00",x"00", -- 0x0368
+ x"00",x"00",x"00",x"F8",x"F8",x"18",x"18",x"18", -- 0x0370
+ x"00",x"00",x"00",x"00",x"00",x"00",x"FF",x"FF", -- 0x0378
+ x"00",x"00",x"00",x"1F",x"1F",x"18",x"18",x"18", -- 0x0380
+ x"18",x"18",x"18",x"FF",x"FF",x"00",x"00",x"00", -- 0x0388
+ x"00",x"00",x"00",x"FF",x"FF",x"18",x"18",x"18", -- 0x0390
+ x"18",x"18",x"18",x"F8",x"F8",x"18",x"18",x"18", -- 0x0398
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0", -- 0x03A0
+ x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x03A8
+ x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"07", -- 0x03B0
+ x"FF",x"FF",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8
+ x"FF",x"FF",x"FF",x"00",x"00",x"00",x"00",x"00", -- 0x03C0
+ x"00",x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF", -- 0x03C8
+ x"03",x"03",x"03",x"03",x"03",x"03",x"FF",x"FF", -- 0x03D0
+ x"00",x"00",x"00",x"00",x"F0",x"F0",x"F0",x"F0", -- 0x03D8
+ x"0F",x"0F",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x03E0
+ x"18",x"18",x"18",x"F8",x"F8",x"00",x"00",x"00", -- 0x03E8
+ x"F0",x"F0",x"F0",x"F0",x"00",x"00",x"00",x"00", -- 0x03F0
+ x"F0",x"F0",x"F0",x"F0",x"0F",x"0F",x"0F",x"0F", -- 0x03F8
+ x"C3",x"99",x"91",x"91",x"9F",x"99",x"C3",x"FF", -- 0x0400
+ x"E7",x"C3",x"99",x"81",x"99",x"99",x"99",x"FF", -- 0x0408
+ x"83",x"99",x"99",x"83",x"99",x"99",x"83",x"FF", -- 0x0410
+ x"C3",x"99",x"9F",x"9F",x"9F",x"99",x"C3",x"FF", -- 0x0418
+ x"87",x"93",x"99",x"99",x"99",x"93",x"87",x"FF", -- 0x0420
+ x"81",x"9F",x"9F",x"87",x"9F",x"9F",x"81",x"FF", -- 0x0428
+ x"81",x"9F",x"9F",x"87",x"9F",x"9F",x"9F",x"FF", -- 0x0430
+ x"C3",x"99",x"9F",x"91",x"99",x"99",x"C3",x"FF", -- 0x0438
+ x"99",x"99",x"99",x"81",x"99",x"99",x"99",x"FF", -- 0x0440
+ x"C3",x"E7",x"E7",x"E7",x"E7",x"E7",x"C3",x"FF", -- 0x0448
+ x"E1",x"F3",x"F3",x"F3",x"F3",x"93",x"C7",x"FF", -- 0x0450
+ x"99",x"93",x"87",x"8F",x"87",x"93",x"99",x"FF", -- 0x0458
+ x"9F",x"9F",x"9F",x"9F",x"9F",x"9F",x"81",x"FF", -- 0x0460
+ x"9C",x"88",x"80",x"94",x"9C",x"9C",x"9C",x"FF", -- 0x0468
+ x"99",x"89",x"81",x"81",x"91",x"99",x"99",x"FF", -- 0x0470
+ x"C3",x"99",x"99",x"99",x"99",x"99",x"C3",x"FF", -- 0x0478
+ x"83",x"99",x"99",x"83",x"9F",x"9F",x"9F",x"FF", -- 0x0480
+ x"C3",x"99",x"99",x"99",x"99",x"C3",x"F1",x"FF", -- 0x0488
+ x"83",x"99",x"99",x"83",x"87",x"93",x"99",x"FF", -- 0x0490
+ x"C3",x"99",x"9F",x"C3",x"F9",x"99",x"C3",x"FF", -- 0x0498
+ x"81",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"FF", -- 0x04A0
+ x"99",x"99",x"99",x"99",x"99",x"99",x"C3",x"FF", -- 0x04A8
+ x"99",x"99",x"99",x"99",x"99",x"C3",x"E7",x"FF", -- 0x04B0
+ x"9C",x"9C",x"9C",x"94",x"80",x"88",x"9C",x"FF", -- 0x04B8
+ x"99",x"99",x"C3",x"E7",x"C3",x"99",x"99",x"FF", -- 0x04C0
+ x"99",x"99",x"99",x"C3",x"E7",x"E7",x"E7",x"FF", -- 0x04C8
+ x"81",x"F9",x"F3",x"E7",x"CF",x"9F",x"81",x"FF", -- 0x04D0
+ x"C3",x"CF",x"CF",x"CF",x"CF",x"CF",x"C3",x"FF", -- 0x04D8
+ x"F3",x"ED",x"CF",x"83",x"CF",x"9D",x"03",x"FF", -- 0x04E0
+ x"C3",x"F3",x"F3",x"F3",x"F3",x"F3",x"C3",x"FF", -- 0x04E8
+ x"FF",x"E7",x"C3",x"81",x"E7",x"E7",x"E7",x"E7", -- 0x04F0
+ x"FF",x"EF",x"CF",x"80",x"80",x"CF",x"EF",x"FF", -- 0x04F8
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0500
+ x"E7",x"E7",x"E7",x"E7",x"FF",x"FF",x"E7",x"FF", -- 0x0508
+ x"99",x"99",x"99",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0510
+ x"99",x"99",x"00",x"99",x"00",x"99",x"99",x"FF", -- 0x0518
+ x"E7",x"C1",x"9F",x"C3",x"F9",x"83",x"E7",x"FF", -- 0x0520
+ x"9D",x"99",x"F3",x"E7",x"CF",x"99",x"B9",x"FF", -- 0x0528
+ x"C3",x"99",x"C3",x"C7",x"98",x"99",x"C0",x"FF", -- 0x0530
+ x"F9",x"F3",x"E7",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0538
+ x"F3",x"E7",x"CF",x"CF",x"CF",x"E7",x"F3",x"FF", -- 0x0540
+ x"CF",x"E7",x"F3",x"F3",x"F3",x"E7",x"CF",x"FF", -- 0x0548
+ x"FF",x"99",x"C3",x"00",x"C3",x"99",x"FF",x"FF", -- 0x0550
+ x"FF",x"E7",x"E7",x"81",x"E7",x"E7",x"FF",x"FF", -- 0x0558
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"E7",x"E7",x"CF", -- 0x0560
+ x"FF",x"FF",x"FF",x"81",x"FF",x"FF",x"FF",x"FF", -- 0x0568
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"E7",x"E7",x"FF", -- 0x0570
+ x"FF",x"FC",x"F9",x"F3",x"E7",x"CF",x"9F",x"FF", -- 0x0578
+ x"C3",x"99",x"91",x"89",x"99",x"99",x"C3",x"FF", -- 0x0580
+ x"E7",x"E7",x"C7",x"E7",x"E7",x"E7",x"81",x"FF", -- 0x0588
+ x"C3",x"99",x"F9",x"F3",x"CF",x"9F",x"81",x"FF", -- 0x0590
+ x"C3",x"99",x"F9",x"E3",x"F9",x"99",x"C3",x"FF", -- 0x0598
+ x"F9",x"F1",x"E1",x"99",x"80",x"F9",x"F9",x"FF", -- 0x05A0
+ x"81",x"9F",x"83",x"F9",x"F9",x"99",x"C3",x"FF", -- 0x05A8
+ x"C3",x"99",x"9F",x"83",x"99",x"99",x"C3",x"FF", -- 0x05B0
+ x"81",x"99",x"F3",x"E7",x"E7",x"E7",x"E7",x"FF", -- 0x05B8
+ x"C3",x"99",x"99",x"C3",x"99",x"99",x"C3",x"FF", -- 0x05C0
+ x"C3",x"99",x"99",x"C1",x"F9",x"99",x"C3",x"FF", -- 0x05C8
+ x"FF",x"FF",x"E7",x"FF",x"FF",x"E7",x"FF",x"FF", -- 0x05D0
+ x"FF",x"FF",x"E7",x"FF",x"FF",x"E7",x"E7",x"CF", -- 0x05D8
+ x"F1",x"E7",x"CF",x"9F",x"CF",x"E7",x"F1",x"FF", -- 0x05E0
+ x"FF",x"FF",x"81",x"FF",x"81",x"FF",x"FF",x"FF", -- 0x05E8
+ x"8F",x"E7",x"F3",x"F9",x"F3",x"E7",x"8F",x"FF", -- 0x05F0
+ x"C3",x"99",x"F9",x"F3",x"E7",x"FF",x"E7",x"FF", -- 0x05F8
+ x"FF",x"FF",x"FF",x"00",x"00",x"FF",x"FF",x"FF", -- 0x0600
+ x"F7",x"E3",x"C1",x"80",x"80",x"E3",x"C1",x"FF", -- 0x0608
+ x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x0610
+ x"FF",x"FF",x"FF",x"00",x"00",x"FF",x"FF",x"FF", -- 0x0618
+ x"FF",x"FF",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0620
+ x"FF",x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0628
+ x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"FF",x"FF", -- 0x0630
+ x"CF",x"CF",x"CF",x"CF",x"CF",x"CF",x"CF",x"CF", -- 0x0638
+ x"F3",x"F3",x"F3",x"F3",x"F3",x"F3",x"F3",x"F3", -- 0x0640
+ x"FF",x"FF",x"FF",x"1F",x"0F",x"C7",x"E7",x"E7", -- 0x0648
+ x"E7",x"E7",x"E3",x"F0",x"F8",x"FF",x"FF",x"FF", -- 0x0650
+ x"E7",x"E7",x"C7",x"0F",x"1F",x"FF",x"FF",x"FF", -- 0x0658
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"00",x"00", -- 0x0660
+ x"3F",x"1F",x"8F",x"C7",x"E3",x"F1",x"F8",x"FC", -- 0x0668
+ x"FC",x"F8",x"F1",x"E3",x"C7",x"8F",x"1F",x"3F", -- 0x0670
+ x"00",x"00",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0678
+ x"00",x"00",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC", -- 0x0680
+ x"FF",x"C3",x"81",x"81",x"81",x"81",x"C3",x"FF", -- 0x0688
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"FF", -- 0x0690
+ x"C9",x"80",x"80",x"80",x"C1",x"E3",x"F7",x"FF", -- 0x0698
+ x"9F",x"9F",x"9F",x"9F",x"9F",x"9F",x"9F",x"9F", -- 0x06A0
+ x"FF",x"FF",x"FF",x"F8",x"F0",x"E3",x"E7",x"E7", -- 0x06A8
+ x"3C",x"18",x"81",x"C3",x"C3",x"81",x"18",x"3C", -- 0x06B0
+ x"FF",x"C3",x"81",x"99",x"99",x"81",x"C3",x"FF", -- 0x06B8
+ x"E7",x"E7",x"99",x"99",x"E7",x"E7",x"C3",x"FF", -- 0x06C0
+ x"F9",x"F9",x"F9",x"F9",x"F9",x"F9",x"F9",x"F9", -- 0x06C8
+ x"F7",x"E3",x"C1",x"80",x"C1",x"E3",x"F7",x"FF", -- 0x06D0
+ x"E7",x"E7",x"E7",x"00",x"00",x"E7",x"E7",x"E7", -- 0x06D8
+ x"3F",x"3F",x"CF",x"CF",x"3F",x"3F",x"CF",x"CF", -- 0x06E0
+ x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x06E8
+ x"FF",x"FF",x"FC",x"C1",x"89",x"C9",x"C9",x"FF", -- 0x06F0
+ x"00",x"80",x"C0",x"E0",x"F0",x"F8",x"FC",x"FE", -- 0x06F8
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0700
+ x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x0708
+ x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"00",x"00", -- 0x0710
+ x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0718
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"00", -- 0x0720
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0728
+ x"33",x"33",x"CC",x"CC",x"33",x"33",x"CC",x"CC", -- 0x0730
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC", -- 0x0738
+ x"FF",x"FF",x"FF",x"FF",x"33",x"33",x"CC",x"CC", -- 0x0740
+ x"00",x"01",x"03",x"07",x"0F",x"1F",x"3F",x"7F", -- 0x0748
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC", -- 0x0750
+ x"E7",x"E7",x"E7",x"E0",x"E0",x"E7",x"E7",x"E7", -- 0x0758
+ x"FF",x"FF",x"FF",x"FF",x"F0",x"F0",x"F0",x"F0", -- 0x0760
+ x"E7",x"E7",x"E7",x"E0",x"E0",x"FF",x"FF",x"FF", -- 0x0768
+ x"FF",x"FF",x"FF",x"07",x"07",x"E7",x"E7",x"E7", -- 0x0770
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"00", -- 0x0778
+ x"FF",x"FF",x"FF",x"E0",x"E0",x"E7",x"E7",x"E7", -- 0x0780
+ x"E7",x"E7",x"E7",x"00",x"00",x"FF",x"FF",x"FF", -- 0x0788
+ x"FF",x"FF",x"FF",x"00",x"00",x"E7",x"E7",x"E7", -- 0x0790
+ x"E7",x"E7",x"E7",x"07",x"07",x"E7",x"E7",x"E7", -- 0x0798
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x07A0
+ x"1F",x"1F",x"1F",x"1F",x"1F",x"1F",x"1F",x"1F", -- 0x07A8
+ x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8", -- 0x07B0
+ x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x07B8
+ x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x07C0
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"00", -- 0x07C8
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"00",x"00", -- 0x07D0
+ x"FF",x"FF",x"FF",x"FF",x"0F",x"0F",x"0F",x"0F", -- 0x07D8
+ x"F0",x"F0",x"F0",x"F0",x"FF",x"FF",x"FF",x"FF", -- 0x07E0
+ x"E7",x"E7",x"E7",x"07",x"07",x"FF",x"FF",x"FF", -- 0x07E8
+ x"0F",x"0F",x"0F",x"0F",x"FF",x"FF",x"FF",x"FF", -- 0x07F0
+ x"0F",x"0F",x"0F",x"0F",x"F0",x"F0",x"F0",x"F0", -- 0x07F8
+ x"3C",x"66",x"6E",x"6E",x"60",x"62",x"3C",x"00", -- 0x0800
+ x"00",x"00",x"3C",x"06",x"3E",x"66",x"3E",x"00", -- 0x0808
+ x"00",x"60",x"60",x"7C",x"66",x"66",x"7C",x"00", -- 0x0810
+ x"00",x"00",x"3C",x"60",x"60",x"60",x"3C",x"00", -- 0x0818
+ x"00",x"06",x"06",x"3E",x"66",x"66",x"3E",x"00", -- 0x0820
+ x"00",x"00",x"3C",x"66",x"7E",x"60",x"3C",x"00", -- 0x0828
+ x"00",x"0E",x"18",x"3E",x"18",x"18",x"18",x"00", -- 0x0830
+ x"00",x"00",x"3E",x"66",x"66",x"3E",x"06",x"7C", -- 0x0838
+ x"00",x"60",x"60",x"7C",x"66",x"66",x"66",x"00", -- 0x0840
+ x"00",x"18",x"00",x"38",x"18",x"18",x"3C",x"00", -- 0x0848
+ x"00",x"06",x"00",x"06",x"06",x"06",x"06",x"3C", -- 0x0850
+ x"00",x"60",x"60",x"6C",x"78",x"6C",x"66",x"00", -- 0x0858
+ x"00",x"38",x"18",x"18",x"18",x"18",x"3C",x"00", -- 0x0860
+ x"00",x"00",x"66",x"7F",x"7F",x"6B",x"63",x"00", -- 0x0868
+ x"00",x"00",x"7C",x"66",x"66",x"66",x"66",x"00", -- 0x0870
+ x"00",x"00",x"3C",x"66",x"66",x"66",x"3C",x"00", -- 0x0878
+ x"00",x"00",x"7C",x"66",x"66",x"7C",x"60",x"60", -- 0x0880
+ x"00",x"00",x"3E",x"66",x"66",x"3E",x"06",x"06", -- 0x0888
+ x"00",x"00",x"7C",x"66",x"60",x"60",x"60",x"00", -- 0x0890
+ x"00",x"00",x"3E",x"60",x"3C",x"06",x"7C",x"00", -- 0x0898
+ x"00",x"18",x"7E",x"18",x"18",x"18",x"0E",x"00", -- 0x08A0
+ x"00",x"00",x"66",x"66",x"66",x"66",x"3E",x"00", -- 0x08A8
+ x"00",x"00",x"66",x"66",x"66",x"3C",x"18",x"00", -- 0x08B0
+ x"00",x"00",x"63",x"6B",x"7F",x"3E",x"36",x"00", -- 0x08B8
+ x"00",x"00",x"66",x"3C",x"18",x"3C",x"66",x"00", -- 0x08C0
+ x"00",x"00",x"66",x"66",x"66",x"3E",x"0C",x"78", -- 0x08C8
+ x"00",x"00",x"7E",x"0C",x"18",x"30",x"7E",x"00", -- 0x08D0
+ x"3C",x"30",x"30",x"30",x"30",x"30",x"3C",x"00", -- 0x08D8
+ x"0C",x"12",x"30",x"7C",x"30",x"62",x"FC",x"00", -- 0x08E0
+ x"3C",x"0C",x"0C",x"0C",x"0C",x"0C",x"3C",x"00", -- 0x08E8
+ x"00",x"18",x"3C",x"7E",x"18",x"18",x"18",x"18", -- 0x08F0
+ x"00",x"10",x"30",x"7F",x"7F",x"30",x"10",x"00", -- 0x08F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0900
+ x"18",x"18",x"18",x"18",x"00",x"00",x"18",x"00", -- 0x0908
+ x"66",x"66",x"66",x"00",x"00",x"00",x"00",x"00", -- 0x0910
+ x"66",x"66",x"FF",x"66",x"FF",x"66",x"66",x"00", -- 0x0918
+ x"18",x"3E",x"60",x"3C",x"06",x"7C",x"18",x"00", -- 0x0920
+ x"62",x"66",x"0C",x"18",x"30",x"66",x"46",x"00", -- 0x0928
+ x"3C",x"66",x"3C",x"38",x"67",x"66",x"3F",x"00", -- 0x0930
+ x"06",x"0C",x"18",x"00",x"00",x"00",x"00",x"00", -- 0x0938
+ x"0C",x"18",x"30",x"30",x"30",x"18",x"0C",x"00", -- 0x0940
+ x"30",x"18",x"0C",x"0C",x"0C",x"18",x"30",x"00", -- 0x0948
+ x"00",x"66",x"3C",x"FF",x"3C",x"66",x"00",x"00", -- 0x0950
+ x"00",x"18",x"18",x"7E",x"18",x"18",x"00",x"00", -- 0x0958
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"30", -- 0x0960
+ x"00",x"00",x"00",x"7E",x"00",x"00",x"00",x"00", -- 0x0968
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"00", -- 0x0970
+ x"00",x"03",x"06",x"0C",x"18",x"30",x"60",x"00", -- 0x0978
+ x"3C",x"66",x"6E",x"76",x"66",x"66",x"3C",x"00", -- 0x0980
+ x"18",x"18",x"38",x"18",x"18",x"18",x"7E",x"00", -- 0x0988
+ x"3C",x"66",x"06",x"0C",x"30",x"60",x"7E",x"00", -- 0x0990
+ x"3C",x"66",x"06",x"1C",x"06",x"66",x"3C",x"00", -- 0x0998
+ x"06",x"0E",x"1E",x"66",x"7F",x"06",x"06",x"00", -- 0x09A0
+ x"7E",x"60",x"7C",x"06",x"06",x"66",x"3C",x"00", -- 0x09A8
+ x"3C",x"66",x"60",x"7C",x"66",x"66",x"3C",x"00", -- 0x09B0
+ x"7E",x"66",x"0C",x"18",x"18",x"18",x"18",x"00", -- 0x09B8
+ x"3C",x"66",x"66",x"3C",x"66",x"66",x"3C",x"00", -- 0x09C0
+ x"3C",x"66",x"66",x"3E",x"06",x"66",x"3C",x"00", -- 0x09C8
+ x"00",x"00",x"18",x"00",x"00",x"18",x"00",x"00", -- 0x09D0
+ x"00",x"00",x"18",x"00",x"00",x"18",x"18",x"30", -- 0x09D8
+ x"0E",x"18",x"30",x"60",x"30",x"18",x"0E",x"00", -- 0x09E0
+ x"00",x"00",x"7E",x"00",x"7E",x"00",x"00",x"00", -- 0x09E8
+ x"70",x"18",x"0C",x"06",x"0C",x"18",x"70",x"00", -- 0x09F0
+ x"3C",x"66",x"06",x"0C",x"18",x"00",x"18",x"00", -- 0x09F8
+ x"00",x"00",x"00",x"FF",x"FF",x"00",x"00",x"00", -- 0x0A00
+ x"18",x"3C",x"66",x"7E",x"66",x"66",x"66",x"00", -- 0x0A08
+ x"7C",x"66",x"66",x"7C",x"66",x"66",x"7C",x"00", -- 0x0A10
+ x"3C",x"66",x"60",x"60",x"60",x"66",x"3C",x"00", -- 0x0A18
+ x"78",x"6C",x"66",x"66",x"66",x"6C",x"78",x"00", -- 0x0A20
+ x"7E",x"60",x"60",x"78",x"60",x"60",x"7E",x"00", -- 0x0A28
+ x"7E",x"60",x"60",x"78",x"60",x"60",x"60",x"00", -- 0x0A30
+ x"3C",x"66",x"60",x"6E",x"66",x"66",x"3C",x"00", -- 0x0A38
+ x"66",x"66",x"66",x"7E",x"66",x"66",x"66",x"00", -- 0x0A40
+ x"3C",x"18",x"18",x"18",x"18",x"18",x"3C",x"00", -- 0x0A48
+ x"1E",x"0C",x"0C",x"0C",x"0C",x"6C",x"38",x"00", -- 0x0A50
+ x"66",x"6C",x"78",x"70",x"78",x"6C",x"66",x"00", -- 0x0A58
+ x"60",x"60",x"60",x"60",x"60",x"60",x"7E",x"00", -- 0x0A60
+ x"63",x"77",x"7F",x"6B",x"63",x"63",x"63",x"00", -- 0x0A68
+ x"66",x"76",x"7E",x"7E",x"6E",x"66",x"66",x"00", -- 0x0A70
+ x"3C",x"66",x"66",x"66",x"66",x"66",x"3C",x"00", -- 0x0A78
+ x"7C",x"66",x"66",x"7C",x"60",x"60",x"60",x"00", -- 0x0A80
+ x"3C",x"66",x"66",x"66",x"66",x"3C",x"0E",x"00", -- 0x0A88
+ x"7C",x"66",x"66",x"7C",x"78",x"6C",x"66",x"00", -- 0x0A90
+ x"3C",x"66",x"60",x"3C",x"06",x"66",x"3C",x"00", -- 0x0A98
+ x"7E",x"18",x"18",x"18",x"18",x"18",x"18",x"00", -- 0x0AA0
+ x"66",x"66",x"66",x"66",x"66",x"66",x"3C",x"00", -- 0x0AA8
+ x"66",x"66",x"66",x"66",x"66",x"3C",x"18",x"00", -- 0x0AB0
+ x"63",x"63",x"63",x"6B",x"7F",x"77",x"63",x"00", -- 0x0AB8
+ x"66",x"66",x"3C",x"18",x"3C",x"66",x"66",x"00", -- 0x0AC0
+ x"66",x"66",x"66",x"3C",x"18",x"18",x"18",x"00", -- 0x0AC8
+ x"7E",x"06",x"0C",x"18",x"30",x"60",x"7E",x"00", -- 0x0AD0
+ x"18",x"18",x"18",x"FF",x"FF",x"18",x"18",x"18", -- 0x0AD8
+ x"C0",x"C0",x"30",x"30",x"C0",x"C0",x"30",x"30", -- 0x0AE0
+ x"18",x"18",x"18",x"18",x"18",x"18",x"18",x"18", -- 0x0AE8
+ x"33",x"33",x"CC",x"CC",x"33",x"33",x"CC",x"CC", -- 0x0AF0
+ x"33",x"99",x"CC",x"66",x"33",x"99",x"CC",x"66", -- 0x0AF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B00
+ x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x0B08
+ x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0B10
+ x"FF",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"FF", -- 0x0B20
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0", -- 0x0B28
+ x"CC",x"CC",x"33",x"33",x"CC",x"CC",x"33",x"33", -- 0x0B30
+ x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0B38
+ x"00",x"00",x"00",x"00",x"CC",x"CC",x"33",x"33", -- 0x0B40
+ x"CC",x"99",x"33",x"66",x"CC",x"99",x"33",x"66", -- 0x0B48
+ x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0B50
+ x"18",x"18",x"18",x"1F",x"1F",x"18",x"18",x"18", -- 0x0B58
+ x"00",x"00",x"00",x"00",x"0F",x"0F",x"0F",x"0F", -- 0x0B60
+ x"18",x"18",x"18",x"1F",x"1F",x"00",x"00",x"00", -- 0x0B68
+ x"00",x"00",x"00",x"F8",x"F8",x"18",x"18",x"18", -- 0x0B70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"FF",x"FF", -- 0x0B78
+ x"00",x"00",x"00",x"1F",x"1F",x"18",x"18",x"18", -- 0x0B80
+ x"18",x"18",x"18",x"FF",x"FF",x"00",x"00",x"00", -- 0x0B88
+ x"00",x"00",x"00",x"FF",x"FF",x"18",x"18",x"18", -- 0x0B90
+ x"18",x"18",x"18",x"F8",x"F8",x"18",x"18",x"18", -- 0x0B98
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0", -- 0x0BA0
+ x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x0BA8
+ x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"07", -- 0x0BB0
+ x"FF",x"FF",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB8
+ x"FF",x"FF",x"FF",x"00",x"00",x"00",x"00",x"00", -- 0x0BC0
+ x"00",x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF", -- 0x0BC8
+ x"01",x"03",x"06",x"6C",x"78",x"70",x"60",x"00", -- 0x0BD0
+ x"00",x"00",x"00",x"00",x"F0",x"F0",x"F0",x"F0", -- 0x0BD8
+ x"0F",x"0F",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x0BE0
+ x"18",x"18",x"18",x"F8",x"F8",x"00",x"00",x"00", -- 0x0BE8
+ x"F0",x"F0",x"F0",x"F0",x"00",x"00",x"00",x"00", -- 0x0BF0
+ x"F0",x"F0",x"F0",x"F0",x"0F",x"0F",x"0F",x"0F", -- 0x0BF8
+ x"C3",x"99",x"91",x"91",x"9F",x"99",x"C3",x"FF", -- 0x0C00
+ x"FF",x"FF",x"C3",x"F9",x"C1",x"99",x"C1",x"FF", -- 0x0C08
+ x"FF",x"9F",x"9F",x"83",x"99",x"99",x"83",x"FF", -- 0x0C10
+ x"FF",x"FF",x"C3",x"9F",x"9F",x"9F",x"C3",x"FF", -- 0x0C18
+ x"FF",x"F9",x"F9",x"C1",x"99",x"99",x"C1",x"FF", -- 0x0C20
+ x"FF",x"FF",x"C3",x"99",x"81",x"9F",x"C3",x"FF", -- 0x0C28
+ x"FF",x"F1",x"E7",x"C1",x"E7",x"E7",x"E7",x"FF", -- 0x0C30
+ x"FF",x"FF",x"C1",x"99",x"99",x"C1",x"F9",x"83", -- 0x0C38
+ x"FF",x"9F",x"9F",x"83",x"99",x"99",x"99",x"FF", -- 0x0C40
+ x"FF",x"E7",x"FF",x"C7",x"E7",x"E7",x"C3",x"FF", -- 0x0C48
+ x"FF",x"F9",x"FF",x"F9",x"F9",x"F9",x"F9",x"C3", -- 0x0C50
+ x"FF",x"9F",x"9F",x"93",x"87",x"93",x"99",x"FF", -- 0x0C58
+ x"FF",x"C7",x"E7",x"E7",x"E7",x"E7",x"C3",x"FF", -- 0x0C60
+ x"FF",x"FF",x"99",x"80",x"80",x"94",x"9C",x"FF", -- 0x0C68
+ x"FF",x"FF",x"83",x"99",x"99",x"99",x"99",x"FF", -- 0x0C70
+ x"FF",x"FF",x"C3",x"99",x"99",x"99",x"C3",x"FF", -- 0x0C78
+ x"FF",x"FF",x"83",x"99",x"99",x"83",x"9F",x"9F", -- 0x0C80
+ x"FF",x"FF",x"C1",x"99",x"99",x"C1",x"F9",x"F9", -- 0x0C88
+ x"FF",x"FF",x"83",x"99",x"9F",x"9F",x"9F",x"FF", -- 0x0C90
+ x"FF",x"FF",x"C1",x"9F",x"C3",x"F9",x"83",x"FF", -- 0x0C98
+ x"FF",x"E7",x"81",x"E7",x"E7",x"E7",x"F1",x"FF", -- 0x0CA0
+ x"FF",x"FF",x"99",x"99",x"99",x"99",x"C1",x"FF", -- 0x0CA8
+ x"FF",x"FF",x"99",x"99",x"99",x"C3",x"E7",x"FF", -- 0x0CB0
+ x"FF",x"FF",x"9C",x"94",x"80",x"C1",x"C9",x"FF", -- 0x0CB8
+ x"FF",x"FF",x"99",x"C3",x"E7",x"C3",x"99",x"FF", -- 0x0CC0
+ x"FF",x"FF",x"99",x"99",x"99",x"C1",x"F3",x"87", -- 0x0CC8
+ x"FF",x"FF",x"81",x"F3",x"E7",x"CF",x"81",x"FF", -- 0x0CD0
+ x"C3",x"CF",x"CF",x"CF",x"CF",x"CF",x"C3",x"FF", -- 0x0CD8
+ x"F3",x"ED",x"CF",x"83",x"CF",x"9D",x"03",x"FF", -- 0x0CE0
+ x"C3",x"F3",x"F3",x"F3",x"F3",x"F3",x"C3",x"FF", -- 0x0CE8
+ x"FF",x"E7",x"C3",x"81",x"E7",x"E7",x"E7",x"E7", -- 0x0CF0
+ x"FF",x"EF",x"CF",x"80",x"80",x"CF",x"EF",x"FF", -- 0x0CF8
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0D00
+ x"E7",x"E7",x"E7",x"E7",x"FF",x"FF",x"E7",x"FF", -- 0x0D08
+ x"99",x"99",x"99",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0D10
+ x"99",x"99",x"00",x"99",x"00",x"99",x"99",x"FF", -- 0x0D18
+ x"E7",x"C1",x"9F",x"C3",x"F9",x"83",x"E7",x"FF", -- 0x0D20
+ x"9D",x"99",x"F3",x"E7",x"CF",x"99",x"B9",x"FF", -- 0x0D28
+ x"C3",x"99",x"C3",x"C7",x"98",x"99",x"C0",x"FF", -- 0x0D30
+ x"F9",x"F3",x"E7",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0D38
+ x"F3",x"E7",x"CF",x"CF",x"CF",x"E7",x"F3",x"FF", -- 0x0D40
+ x"CF",x"E7",x"F3",x"F3",x"F3",x"E7",x"CF",x"FF", -- 0x0D48
+ x"FF",x"99",x"C3",x"00",x"C3",x"99",x"FF",x"FF", -- 0x0D50
+ x"FF",x"E7",x"E7",x"81",x"E7",x"E7",x"FF",x"FF", -- 0x0D58
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"E7",x"E7",x"CF", -- 0x0D60
+ x"FF",x"FF",x"FF",x"81",x"FF",x"FF",x"FF",x"FF", -- 0x0D68
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"E7",x"E7",x"FF", -- 0x0D70
+ x"FF",x"FC",x"F9",x"F3",x"E7",x"CF",x"9F",x"FF", -- 0x0D78
+ x"C3",x"99",x"91",x"89",x"99",x"99",x"C3",x"FF", -- 0x0D80
+ x"E7",x"E7",x"C7",x"E7",x"E7",x"E7",x"81",x"FF", -- 0x0D88
+ x"C3",x"99",x"F9",x"F3",x"CF",x"9F",x"81",x"FF", -- 0x0D90
+ x"C3",x"99",x"F9",x"E3",x"F9",x"99",x"C3",x"FF", -- 0x0D98
+ x"F9",x"F1",x"E1",x"99",x"80",x"F9",x"F9",x"FF", -- 0x0DA0
+ x"81",x"9F",x"83",x"F9",x"F9",x"99",x"C3",x"FF", -- 0x0DA8
+ x"C3",x"99",x"9F",x"83",x"99",x"99",x"C3",x"FF", -- 0x0DB0
+ x"81",x"99",x"F3",x"E7",x"E7",x"E7",x"E7",x"FF", -- 0x0DB8
+ x"C3",x"99",x"99",x"C3",x"99",x"99",x"C3",x"FF", -- 0x0DC0
+ x"C3",x"99",x"99",x"C1",x"F9",x"99",x"C3",x"FF", -- 0x0DC8
+ x"FF",x"FF",x"E7",x"FF",x"FF",x"E7",x"FF",x"FF", -- 0x0DD0
+ x"FF",x"FF",x"E7",x"FF",x"FF",x"E7",x"E7",x"CF", -- 0x0DD8
+ x"F1",x"E7",x"CF",x"9F",x"CF",x"E7",x"F1",x"FF", -- 0x0DE0
+ x"FF",x"FF",x"81",x"FF",x"81",x"FF",x"FF",x"FF", -- 0x0DE8
+ x"8F",x"E7",x"F3",x"F9",x"F3",x"E7",x"8F",x"FF", -- 0x0DF0
+ x"C3",x"99",x"F9",x"F3",x"E7",x"FF",x"E7",x"FF", -- 0x0DF8
+ x"FF",x"FF",x"FF",x"00",x"00",x"FF",x"FF",x"FF", -- 0x0E00
+ x"E7",x"C3",x"99",x"81",x"99",x"99",x"99",x"FF", -- 0x0E08
+ x"83",x"99",x"99",x"83",x"99",x"99",x"83",x"FF", -- 0x0E10
+ x"C3",x"99",x"9F",x"9F",x"9F",x"99",x"C3",x"FF", -- 0x0E18
+ x"87",x"93",x"99",x"99",x"99",x"93",x"87",x"FF", -- 0x0E20
+ x"81",x"9F",x"9F",x"87",x"9F",x"9F",x"81",x"FF", -- 0x0E28
+ x"81",x"9F",x"9F",x"87",x"9F",x"9F",x"9F",x"FF", -- 0x0E30
+ x"C3",x"99",x"9F",x"91",x"99",x"99",x"C3",x"FF", -- 0x0E38
+ x"99",x"99",x"99",x"81",x"99",x"99",x"99",x"FF", -- 0x0E40
+ x"C3",x"E7",x"E7",x"E7",x"E7",x"E7",x"C3",x"FF", -- 0x0E48
+ x"E1",x"F3",x"F3",x"F3",x"F3",x"93",x"C7",x"FF", -- 0x0E50
+ x"99",x"93",x"87",x"8F",x"87",x"93",x"99",x"FF", -- 0x0E58
+ x"9F",x"9F",x"9F",x"9F",x"9F",x"9F",x"81",x"FF", -- 0x0E60
+ x"9C",x"88",x"80",x"94",x"9C",x"9C",x"9C",x"FF", -- 0x0E68
+ x"99",x"89",x"81",x"81",x"91",x"99",x"99",x"FF", -- 0x0E70
+ x"C3",x"99",x"99",x"99",x"99",x"99",x"C3",x"FF", -- 0x0E78
+ x"83",x"99",x"99",x"83",x"9F",x"9F",x"9F",x"FF", -- 0x0E80
+ x"C3",x"99",x"99",x"99",x"99",x"C3",x"F1",x"FF", -- 0x0E88
+ x"83",x"99",x"99",x"83",x"87",x"93",x"99",x"FF", -- 0x0E90
+ x"C3",x"99",x"9F",x"C3",x"F9",x"99",x"C3",x"FF", -- 0x0E98
+ x"81",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"FF", -- 0x0EA0
+ x"99",x"99",x"99",x"99",x"99",x"99",x"C3",x"FF", -- 0x0EA8
+ x"99",x"99",x"99",x"99",x"99",x"C3",x"E7",x"FF", -- 0x0EB0
+ x"9C",x"9C",x"9C",x"94",x"80",x"88",x"9C",x"FF", -- 0x0EB8
+ x"99",x"99",x"C3",x"E7",x"C3",x"99",x"99",x"FF", -- 0x0EC0
+ x"99",x"99",x"99",x"C3",x"E7",x"E7",x"E7",x"FF", -- 0x0EC8
+ x"81",x"F9",x"F3",x"E7",x"CF",x"9F",x"81",x"FF", -- 0x0ED0
+ x"E7",x"E7",x"E7",x"00",x"00",x"E7",x"E7",x"E7", -- 0x0ED8
+ x"3F",x"3F",x"CF",x"CF",x"3F",x"3F",x"CF",x"CF", -- 0x0EE0
+ x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7",x"E7", -- 0x0EE8
+ x"CC",x"CC",x"33",x"33",x"CC",x"CC",x"33",x"33", -- 0x0EF0
+ x"CC",x"66",x"33",x"99",x"CC",x"66",x"33",x"99", -- 0x0EF8
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0F00
+ x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x0F08
+ x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"00",x"00", -- 0x0F10
+ x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0F18
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"00", -- 0x0F20
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0F28
+ x"33",x"33",x"CC",x"CC",x"33",x"33",x"CC",x"CC", -- 0x0F30
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC", -- 0x0F38
+ x"FF",x"FF",x"FF",x"FF",x"33",x"33",x"CC",x"CC", -- 0x0F40
+ x"33",x"66",x"CC",x"99",x"33",x"66",x"CC",x"99", -- 0x0F48
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC", -- 0x0F50
+ x"E7",x"E7",x"E7",x"E0",x"E0",x"E7",x"E7",x"E7", -- 0x0F58
+ x"FF",x"FF",x"FF",x"FF",x"F0",x"F0",x"F0",x"F0", -- 0x0F60
+ x"E7",x"E7",x"E7",x"E0",x"E0",x"FF",x"FF",x"FF", -- 0x0F68
+ x"FF",x"FF",x"FF",x"07",x"07",x"E7",x"E7",x"E7", -- 0x0F70
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"00", -- 0x0F78
+ x"FF",x"FF",x"FF",x"E0",x"E0",x"E7",x"E7",x"E7", -- 0x0F80
+ x"E7",x"E7",x"E7",x"00",x"00",x"FF",x"FF",x"FF", -- 0x0F88
+ x"FF",x"FF",x"FF",x"00",x"00",x"E7",x"E7",x"E7", -- 0x0F90
+ x"E7",x"E7",x"E7",x"07",x"07",x"E7",x"E7",x"E7", -- 0x0F98
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0FA0
+ x"1F",x"1F",x"1F",x"1F",x"1F",x"1F",x"1F",x"1F", -- 0x0FA8
+ x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8", -- 0x0FB0
+ x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0FB8
+ x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0FC0
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"00", -- 0x0FC8
+ x"FE",x"FC",x"F9",x"93",x"87",x"8F",x"9F",x"FF", -- 0x0FD0
+ x"FF",x"FF",x"FF",x"FF",x"0F",x"0F",x"0F",x"0F", -- 0x0FD8
+ x"F0",x"F0",x"F0",x"F0",x"FF",x"FF",x"FF",x"FF", -- 0x0FE0
+ x"E7",x"E7",x"E7",x"07",x"07",x"FF",x"FF",x"FF", -- 0x0FE8
+ x"0F",x"0F",x"0F",x"0F",x"FF",x"FF",x"FF",x"FF", -- 0x0FF0
+ x"0F",x"0F",x"0F",x"0F",x"F0",x"F0",x"F0",x"F0" -- 0x0FF8
+ );
+
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+end RTL;
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_data.vhd b/lib/VGA_ctrl/src/fonts/char_rom_data.vhd
new file mode 100644
index 0000000..c52e7f7
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_data.vhd
@@ -0,0 +1,539 @@
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(7 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(7 downto 0);
+ constant ROM : ROM_ARRAY := (
+ x"7C",x"40",x"7C",x"44",x"7C",x"0C",x"0C",x"7C", -- 0x0000
+ x"3C",x"24",x"7E",x"62",x"62",x"62",x"62",x"00", -- 0x0008
+ x"7C",x"24",x"3E",x"32",x"32",x"32",x"7E",x"00", -- 0x0010
+ x"7E",x"42",x"40",x"60",x"60",x"62",x"7E",x"00", -- 0x0018
+ x"7E",x"22",x"22",x"32",x"32",x"32",x"7E",x"00", -- 0x0020
+ x"7E",x"40",x"40",x"78",x"60",x"60",x"7E",x"00", -- 0x0028
+ x"7E",x"40",x"40",x"78",x"60",x"60",x"60",x"00", -- 0x0030
+ x"7E",x"42",x"40",x"6E",x"62",x"62",x"7E",x"00", -- 0x0038
+ x"42",x"42",x"42",x"7E",x"62",x"62",x"62",x"00", -- 0x0040
+ x"10",x"10",x"10",x"18",x"18",x"18",x"18",x"00", -- 0x0048
+ x"02",x"02",x"02",x"06",x"06",x"46",x"3C",x"00", -- 0x0050
+ x"42",x"44",x"48",x"7E",x"62",x"62",x"62",x"00", -- 0x0058
+ x"40",x"40",x"40",x"60",x"60",x"60",x"7E",x"00", -- 0x0060
+ x"66",x"5A",x"42",x"62",x"62",x"62",x"62",x"00", -- 0x0068
+ x"72",x"4A",x"4A",x"6A",x"6A",x"6A",x"66",x"00", -- 0x0070
+ x"7E",x"42",x"42",x"62",x"62",x"62",x"7E",x"00", -- 0x0078
+ x"7E",x"42",x"42",x"7E",x"60",x"60",x"60",x"00", -- 0x0080
+ x"7E",x"42",x"42",x"62",x"6A",x"64",x"7A",x"00", -- 0x0088
+ x"7E",x"42",x"42",x"7E",x"64",x"62",x"62",x"00", -- 0x0090
+ x"7E",x"42",x"40",x"7E",x"06",x"46",x"7E",x"00", -- 0x0098
+ x"7C",x"10",x"10",x"18",x"18",x"18",x"18",x"00", -- 0x00A0
+ x"42",x"42",x"42",x"62",x"62",x"62",x"7E",x"00", -- 0x00A8
+ x"42",x"42",x"42",x"24",x"24",x"18",x"18",x"00", -- 0x00B0
+ x"62",x"62",x"62",x"62",x"42",x"5A",x"66",x"00", -- 0x00B8
+ x"42",x"24",x"18",x"7C",x"62",x"62",x"62",x"00", -- 0x00C0
+ x"42",x"42",x"42",x"3C",x"18",x"18",x"18",x"00", -- 0x00C8
+ x"7E",x"02",x"1C",x"60",x"60",x"60",x"7E",x"00", -- 0x00D0
+ x"3C",x"20",x"20",x"30",x"30",x"30",x"3C",x"00", -- 0x00D8
+ x"18",x"20",x"20",x"78",x"60",x"60",x"7C",x"00", -- 0x00E0
+ x"3C",x"04",x"04",x"0C",x"0C",x"0C",x"3C",x"00", -- 0x00E8
+ x"08",x"1C",x"2A",x"08",x"08",x"08",x"08",x"00", -- 0x00F0
+ x"00",x"20",x"40",x"FE",x"40",x"20",x"00",x"00", -- 0x00F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0100
+ x"18",x"18",x"1C",x"1C",x"1C",x"00",x"1C",x"00", -- 0x0108
+ x"36",x"36",x"12",x"12",x"00",x"00",x"00",x"00", -- 0x0110
+ x"24",x"24",x"7E",x"34",x"7E",x"34",x"34",x"00", -- 0x0118
+ x"08",x"3E",x"28",x"3E",x"1A",x"3E",x"18",x"00", -- 0x0120
+ x"70",x"52",x"74",x"08",x"1E",x"2A",x"4E",x"00", -- 0x0128
+ x"78",x"48",x"30",x"70",x"6A",x"64",x"7A",x"00", -- 0x0130
+ x"38",x"38",x"08",x"08",x"00",x"00",x"00",x"00", -- 0x0138
+ x"0C",x"10",x"20",x"30",x"30",x"10",x"0C",x"00", -- 0x0140
+ x"30",x"08",x"04",x"0C",x"0C",x"08",x"30",x"00", -- 0x0148
+ x"08",x"2A",x"1C",x"3E",x"1C",x"2A",x"08",x"00", -- 0x0150
+ x"00",x"08",x"08",x"3E",x"3E",x"0C",x"0C",x"00", -- 0x0158
+ x"00",x"00",x"00",x"00",x"1C",x"1C",x"04",x"04", -- 0x0160
+ x"00",x"00",x"00",x"7E",x"7E",x"00",x"00",x"00", -- 0x0168
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"00", -- 0x0170
+ x"00",x"02",x"04",x"08",x"10",x"20",x"40",x"00", -- 0x0178
+ x"7E",x"42",x"46",x"6A",x"72",x"62",x"7E",x"00", -- 0x0180
+ x"38",x"08",x"08",x"18",x"18",x"18",x"3C",x"00", -- 0x0188
+ x"7E",x"42",x"02",x"7E",x"60",x"60",x"7E",x"00", -- 0x0190
+ x"3E",x"02",x"02",x"1E",x"06",x"06",x"7E",x"00", -- 0x0198
+ x"40",x"40",x"44",x"44",x"7E",x"0C",x"0C",x"00", -- 0x01A0
+ x"3E",x"20",x"20",x"3E",x"06",x"46",x"7E",x"00", -- 0x01A8
+ x"7E",x"40",x"40",x"7E",x"62",x"62",x"7E",x"00", -- 0x01B0
+ x"7E",x"42",x"04",x"08",x"18",x"18",x"18",x"00", -- 0x01B8
+ x"3C",x"24",x"24",x"7E",x"62",x"62",x"7E",x"00", -- 0x01C0
+ x"7E",x"42",x"42",x"7E",x"06",x"06",x"7E",x"00", -- 0x01C8
+ x"00",x"00",x"18",x"00",x"18",x"18",x"00",x"00", -- 0x01D0
+ x"00",x"00",x"1C",x"00",x"1C",x"1C",x"04",x"04", -- 0x01D8
+ x"0E",x"18",x"30",x"60",x"30",x"18",x"0E",x"00", -- 0x01E0
+ x"00",x"00",x"7E",x"00",x"7E",x"7E",x"00",x"00", -- 0x01E8
+ x"70",x"18",x"0C",x"06",x"0C",x"18",x"70",x"00", -- 0x01F0
+ x"7E",x"42",x"02",x"3E",x"30",x"00",x"30",x"00", -- 0x01F8
+ x"00",x"00",x"00",x"00",x"FF",x"00",x"00",x"00", -- 0x0200
+ x"18",x"3C",x"7E",x"7E",x"18",x"18",x"7E",x"00", -- 0x0208
+ x"10",x"10",x"10",x"10",x"10",x"10",x"10",x"10", -- 0x0210
+ x"00",x"00",x"00",x"FF",x"00",x"00",x"00",x"00", -- 0x0218
+ x"00",x"00",x"FF",x"00",x"00",x"00",x"00",x"00", -- 0x0220
+ x"00",x"FF",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0228
+ x"00",x"00",x"00",x"00",x"00",x"FF",x"00",x"00", -- 0x0230
+ x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20", -- 0x0238
+ x"04",x"04",x"04",x"04",x"04",x"04",x"04",x"04", -- 0x0240
+ x"00",x"00",x"00",x"C0",x"30",x"10",x"08",x"08", -- 0x0248
+ x"10",x"10",x"08",x"0C",x"03",x"00",x"00",x"00", -- 0x0250
+ x"08",x"08",x"10",x"30",x"C0",x"00",x"00",x"00", -- 0x0258
+ x"80",x"80",x"80",x"80",x"80",x"80",x"80",x"FF", -- 0x0260
+ x"80",x"40",x"20",x"10",x"08",x"04",x"02",x"01", -- 0x0268
+ x"01",x"02",x"04",x"08",x"10",x"20",x"40",x"80", -- 0x0270
+ x"FF",x"80",x"80",x"80",x"80",x"80",x"80",x"80", -- 0x0278
+ x"FF",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0280
+ x"3C",x"7E",x"7E",x"7E",x"7E",x"7E",x"3C",x"00", -- 0x0288
+ x"00",x"00",x"00",x"00",x"00",x"00",x"FF",x"00", -- 0x0290
+ x"24",x"7E",x"7E",x"7E",x"3C",x"18",x"18",x"00", -- 0x0298
+ x"40",x"40",x"40",x"40",x"40",x"40",x"40",x"40", -- 0x02A0
+ x"00",x"00",x"00",x"03",x"0C",x"08",x"10",x"10", -- 0x02A8
+ x"81",x"42",x"24",x"18",x"18",x"24",x"42",x"81", -- 0x02B0
+ x"3C",x"7E",x"66",x"42",x"66",x"7E",x"3C",x"00", -- 0x02B8
+ x"18",x"18",x"7E",x"7E",x"18",x"18",x"7E",x"00", -- 0x02C0
+ x"02",x"02",x"02",x"02",x"02",x"02",x"02",x"02", -- 0x02C8
+ x"00",x"18",x"3C",x"7E",x"7E",x"3C",x"18",x"00", -- 0x02D0
+ x"08",x"08",x"08",x"FF",x"08",x"08",x"08",x"08", -- 0x02D8
+ x"C0",x"30",x"C0",x"30",x"C0",x"30",x"C0",x"30", -- 0x02E0
+ x"08",x"08",x"08",x"08",x"08",x"08",x"08",x"08", -- 0x02E8
+ x"00",x"00",x"7C",x"24",x"64",x"64",x"66",x"00", -- 0x02F0
+ x"FF",x"7F",x"3F",x"1F",x"0F",x"07",x"03",x"01", -- 0x02F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0300
+ x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x0308
+ x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0310
+ x"FF",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0318
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"FF", -- 0x0320
+ x"80",x"80",x"80",x"80",x"80",x"80",x"80",x"80", -- 0x0328
+ x"CC",x"33",x"CC",x"33",x"CC",x"33",x"CC",x"33", -- 0x0330
+ x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0338
+ x"00",x"00",x"00",x"00",x"CC",x"33",x"CC",x"33", -- 0x0340
+ x"FF",x"FE",x"FC",x"F8",x"F0",x"E0",x"C0",x"80", -- 0x0348
+ x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0350
+ x"08",x"08",x"08",x"0F",x"08",x"08",x"08",x"08", -- 0x0358
+ x"00",x"00",x"00",x"00",x"0F",x"0F",x"0F",x"0F", -- 0x0360
+ x"08",x"08",x"08",x"0F",x"00",x"00",x"00",x"00", -- 0x0368
+ x"00",x"00",x"00",x"F8",x"08",x"08",x"08",x"08", -- 0x0370
+ x"00",x"00",x"00",x"00",x"00",x"00",x"FF",x"FF", -- 0x0378
+ x"00",x"00",x"00",x"0F",x"08",x"08",x"08",x"08", -- 0x0380
+ x"08",x"08",x"08",x"FF",x"00",x"00",x"00",x"00", -- 0x0388
+ x"00",x"00",x"00",x"FF",x"08",x"08",x"08",x"08", -- 0x0390
+ x"08",x"08",x"08",x"F8",x"08",x"08",x"08",x"08", -- 0x0398
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0", -- 0x03A0
+ x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x03A8
+ x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"07", -- 0x03B0
+ x"FF",x"FF",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8
+ x"FF",x"FF",x"FF",x"00",x"00",x"00",x"00",x"00", -- 0x03C0
+ x"00",x"00",x"00",x"00",x"00",x"FF",x"FF",x"FF", -- 0x03C8
+ x"01",x"01",x"01",x"01",x"01",x"01",x"01",x"FF", -- 0x03D0
+ x"00",x"00",x"00",x"00",x"F0",x"F0",x"F0",x"F0", -- 0x03D8
+ x"0F",x"0F",x"0F",x"0F",x"00",x"00",x"00",x"00", -- 0x03E0
+ x"08",x"08",x"08",x"F8",x"00",x"00",x"00",x"00", -- 0x03E8
+ x"F0",x"F0",x"F0",x"F0",x"00",x"00",x"00",x"00", -- 0x03F0
+ x"F0",x"F0",x"F0",x"F0",x"0F",x"0F",x"0F",x"0F", -- 0x03F8
+ x"83",x"BF",x"83",x"BB",x"83",x"F3",x"F3",x"83", -- 0x0400
+ x"C3",x"DB",x"81",x"9D",x"9D",x"9D",x"9D",x"FF", -- 0x0408
+ x"83",x"DB",x"C1",x"CD",x"CD",x"CD",x"81",x"FF", -- 0x0410
+ x"81",x"BD",x"BF",x"9F",x"9F",x"9D",x"81",x"FF", -- 0x0418
+ x"81",x"DD",x"DD",x"CD",x"CD",x"CD",x"81",x"FF", -- 0x0420
+ x"81",x"BF",x"BF",x"87",x"9F",x"9F",x"81",x"FF", -- 0x0428
+ x"81",x"BF",x"BF",x"87",x"9F",x"9F",x"9F",x"FF", -- 0x0430
+ x"81",x"BD",x"BF",x"91",x"9D",x"9D",x"81",x"FF", -- 0x0438
+ x"BD",x"BD",x"BD",x"81",x"9D",x"9D",x"9D",x"FF", -- 0x0440
+ x"EF",x"EF",x"EF",x"E7",x"E7",x"E7",x"E7",x"FF", -- 0x0448
+ x"FD",x"FD",x"FD",x"F9",x"F9",x"B9",x"C3",x"FF", -- 0x0450
+ x"BD",x"BB",x"B7",x"81",x"9D",x"9D",x"9D",x"FF", -- 0x0458
+ x"BF",x"BF",x"BF",x"9F",x"9F",x"9F",x"81",x"FF", -- 0x0460
+ x"99",x"A5",x"BD",x"9D",x"9D",x"9D",x"9D",x"FF", -- 0x0468
+ x"8D",x"B5",x"B5",x"95",x"95",x"95",x"99",x"FF", -- 0x0470
+ x"81",x"BD",x"BD",x"9D",x"9D",x"9D",x"81",x"FF", -- 0x0478
+ x"81",x"BD",x"BD",x"81",x"9F",x"9F",x"9F",x"FF", -- 0x0480
+ x"81",x"BD",x"BD",x"9D",x"95",x"9B",x"85",x"FF", -- 0x0488
+ x"81",x"BD",x"BD",x"81",x"9B",x"9D",x"9D",x"FF", -- 0x0490
+ x"81",x"BD",x"BF",x"81",x"F9",x"B9",x"81",x"FF", -- 0x0498
+ x"83",x"EF",x"EF",x"E7",x"E7",x"E7",x"E7",x"FF", -- 0x04A0
+ x"BD",x"BD",x"BD",x"9D",x"9D",x"9D",x"81",x"FF", -- 0x04A8
+ x"BD",x"BD",x"BD",x"DB",x"DB",x"E7",x"E7",x"FF", -- 0x04B0
+ x"9D",x"9D",x"9D",x"9D",x"BD",x"A5",x"99",x"FF", -- 0x04B8
+ x"BD",x"DB",x"E7",x"83",x"9D",x"9D",x"9D",x"FF", -- 0x04C0
+ x"BD",x"BD",x"BD",x"C3",x"E7",x"E7",x"E7",x"FF", -- 0x04C8
+ x"81",x"FD",x"E3",x"9F",x"9F",x"9F",x"81",x"FF", -- 0x04D0
+ x"C3",x"DF",x"DF",x"CF",x"CF",x"CF",x"C3",x"FF", -- 0x04D8
+ x"E7",x"DF",x"DF",x"87",x"9F",x"9F",x"83",x"FF", -- 0x04E0
+ x"C3",x"FB",x"FB",x"F3",x"F3",x"F3",x"C3",x"FF", -- 0x04E8
+ x"F7",x"E3",x"D5",x"F7",x"F7",x"F7",x"F7",x"FF", -- 0x04F0
+ x"FF",x"DF",x"BF",x"01",x"BF",x"DF",x"FF",x"FF", -- 0x04F8
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0500
+ x"E7",x"E7",x"E3",x"E3",x"E3",x"FF",x"E3",x"FF", -- 0x0508
+ x"C9",x"C9",x"ED",x"ED",x"FF",x"FF",x"FF",x"FF", -- 0x0510
+ x"DB",x"DB",x"81",x"CB",x"81",x"CB",x"CB",x"FF", -- 0x0518
+ x"F7",x"C1",x"D7",x"C1",x"E5",x"C1",x"E7",x"FF", -- 0x0520
+ x"8F",x"AD",x"8B",x"F7",x"E1",x"D5",x"B1",x"FF", -- 0x0528
+ x"87",x"B7",x"CF",x"8F",x"95",x"9B",x"85",x"FF", -- 0x0530
+ x"C7",x"C7",x"F7",x"F7",x"FF",x"FF",x"FF",x"FF", -- 0x0538
+ x"F3",x"EF",x"DF",x"CF",x"CF",x"EF",x"F3",x"FF", -- 0x0540
+ x"CF",x"F7",x"FB",x"F3",x"F3",x"F7",x"CF",x"FF", -- 0x0548
+ x"F7",x"D5",x"E3",x"C1",x"E3",x"D5",x"F7",x"FF", -- 0x0550
+ x"FF",x"F7",x"F7",x"C1",x"C1",x"F3",x"F3",x"FF", -- 0x0558
+ x"FF",x"FF",x"FF",x"FF",x"E3",x"E3",x"FB",x"FB", -- 0x0560
+ x"FF",x"FF",x"FF",x"81",x"81",x"FF",x"FF",x"FF", -- 0x0568
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"E7",x"E7",x"FF", -- 0x0570
+ x"FF",x"FD",x"FB",x"F7",x"EF",x"DF",x"BF",x"FF", -- 0x0578
+ x"81",x"BD",x"B9",x"95",x"8D",x"9D",x"81",x"FF", -- 0x0580
+ x"C7",x"F7",x"F7",x"E7",x"E7",x"E7",x"C3",x"FF", -- 0x0588
+ x"81",x"BD",x"FD",x"81",x"9F",x"9F",x"81",x"FF", -- 0x0590
+ x"C1",x"FD",x"FD",x"E1",x"F9",x"F9",x"81",x"FF", -- 0x0598
+ x"BF",x"BF",x"BB",x"BB",x"81",x"F3",x"F3",x"FF", -- 0x05A0
+ x"C1",x"DF",x"DF",x"C1",x"F9",x"B9",x"81",x"FF", -- 0x05A8
+ x"81",x"BF",x"BF",x"81",x"9D",x"9D",x"81",x"FF", -- 0x05B0
+ x"81",x"BD",x"FB",x"F7",x"E7",x"E7",x"E7",x"FF", -- 0x05B8
+ x"C3",x"DB",x"DB",x"81",x"9D",x"9D",x"81",x"FF", -- 0x05C0
+ x"81",x"BD",x"BD",x"81",x"F9",x"F9",x"81",x"FF", -- 0x05C8
+ x"FF",x"FF",x"E7",x"FF",x"E7",x"E7",x"FF",x"FF", -- 0x05D0
+ x"FF",x"FF",x"E3",x"FF",x"E3",x"E3",x"FB",x"FB", -- 0x05D8
+ x"F1",x"E7",x"CF",x"9F",x"CF",x"E7",x"F1",x"FF", -- 0x05E0
+ x"FF",x"FF",x"81",x"FF",x"81",x"81",x"FF",x"FF", -- 0x05E8
+ x"8F",x"E7",x"F3",x"F9",x"F3",x"E7",x"8F",x"FF", -- 0x05F0
+ x"81",x"BD",x"FD",x"C1",x"CF",x"FF",x"CF",x"FF", -- 0x05F8
+ x"FF",x"FF",x"FF",x"FF",x"00",x"FF",x"FF",x"FF", -- 0x0600
+ x"E7",x"C3",x"81",x"81",x"E7",x"E7",x"81",x"FF", -- 0x0608
+ x"EF",x"EF",x"EF",x"EF",x"EF",x"EF",x"EF",x"EF", -- 0x0610
+ x"FF",x"FF",x"FF",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0618
+ x"FF",x"FF",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0620
+ x"FF",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0628
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"FF",x"FF", -- 0x0630
+ x"DF",x"DF",x"DF",x"DF",x"DF",x"DF",x"DF",x"DF", -- 0x0638
+ x"FB",x"FB",x"FB",x"FB",x"FB",x"FB",x"FB",x"FB", -- 0x0640
+ x"FF",x"FF",x"FF",x"3F",x"CF",x"EF",x"F7",x"F7", -- 0x0648
+ x"EF",x"EF",x"F7",x"F3",x"FC",x"FF",x"FF",x"FF", -- 0x0650
+ x"F7",x"F7",x"EF",x"CF",x"3F",x"FF",x"FF",x"FF", -- 0x0658
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"00", -- 0x0660
+ x"7F",x"BF",x"DF",x"EF",x"F7",x"FB",x"FD",x"FE", -- 0x0668
+ x"FE",x"FD",x"FB",x"F7",x"EF",x"DF",x"BF",x"7F", -- 0x0670
+ x"00",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0678
+ x"00",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE", -- 0x0680
+ x"C3",x"81",x"81",x"81",x"81",x"81",x"C3",x"FF", -- 0x0688
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"FF", -- 0x0690
+ x"DB",x"81",x"81",x"81",x"C3",x"E7",x"E7",x"FF", -- 0x0698
+ x"BF",x"BF",x"BF",x"BF",x"BF",x"BF",x"BF",x"BF", -- 0x06A0
+ x"FF",x"FF",x"FF",x"FC",x"F3",x"F7",x"EF",x"EF", -- 0x06A8
+ x"7E",x"BD",x"DB",x"E7",x"E7",x"DB",x"BD",x"7E", -- 0x06B0
+ x"C3",x"81",x"99",x"BD",x"99",x"81",x"C3",x"FF", -- 0x06B8
+ x"E7",x"E7",x"81",x"81",x"E7",x"E7",x"81",x"FF", -- 0x06C0
+ x"FD",x"FD",x"FD",x"FD",x"FD",x"FD",x"FD",x"FD", -- 0x06C8
+ x"FF",x"E7",x"C3",x"81",x"81",x"C3",x"E7",x"FF", -- 0x06D0
+ x"F7",x"F7",x"F7",x"00",x"F7",x"F7",x"F7",x"F7", -- 0x06D8
+ x"3F",x"CF",x"3F",x"CF",x"3F",x"CF",x"3F",x"CF", -- 0x06E0
+ x"F7",x"F7",x"F7",x"F7",x"F7",x"F7",x"F7",x"F7", -- 0x06E8
+ x"FF",x"FF",x"83",x"DB",x"9B",x"9B",x"99",x"FF", -- 0x06F0
+ x"00",x"80",x"C0",x"E0",x"F0",x"F8",x"FC",x"FE", -- 0x06F8
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0700
+ x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x0708
+ x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"00",x"00", -- 0x0710
+ x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0718
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"00", -- 0x0720
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0728
+ x"33",x"CC",x"33",x"CC",x"33",x"CC",x"33",x"CC", -- 0x0730
+ x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE", -- 0x0738
+ x"FF",x"FF",x"FF",x"FF",x"33",x"CC",x"33",x"CC", -- 0x0740
+ x"00",x"01",x"03",x"07",x"0F",x"1F",x"3F",x"7F", -- 0x0748
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC", -- 0x0750
+ x"F7",x"F7",x"F7",x"F0",x"F7",x"F7",x"F7",x"F7", -- 0x0758
+ x"FF",x"FF",x"FF",x"FF",x"F0",x"F0",x"F0",x"F0", -- 0x0760
+ x"F7",x"F7",x"F7",x"F0",x"FF",x"FF",x"FF",x"FF", -- 0x0768
+ x"FF",x"FF",x"FF",x"07",x"F7",x"F7",x"F7",x"F7", -- 0x0770
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"00", -- 0x0778
+ x"FF",x"FF",x"FF",x"F0",x"F7",x"F7",x"F7",x"F7", -- 0x0780
+ x"F7",x"F7",x"F7",x"00",x"FF",x"FF",x"FF",x"FF", -- 0x0788
+ x"FF",x"FF",x"FF",x"00",x"F7",x"F7",x"F7",x"F7", -- 0x0790
+ x"F7",x"F7",x"F7",x"07",x"F7",x"F7",x"F7",x"F7", -- 0x0798
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x07A0
+ x"1F",x"1F",x"1F",x"1F",x"1F",x"1F",x"1F",x"1F", -- 0x07A8
+ x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8", -- 0x07B0
+ x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x07B8
+ x"00",x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x07C0
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"00",x"00",x"00", -- 0x07C8
+ x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"00", -- 0x07D0
+ x"FF",x"FF",x"FF",x"FF",x"0F",x"0F",x"0F",x"0F", -- 0x07D8
+ x"F0",x"F0",x"F0",x"F0",x"FF",x"FF",x"FF",x"FF", -- 0x07E0
+ x"F7",x"F7",x"F7",x"07",x"FF",x"FF",x"FF",x"FF", -- 0x07E8
+ x"0F",x"0F",x"0F",x"0F",x"FF",x"FF",x"FF",x"FF", -- 0x07F0
+ x"0F",x"0F",x"0F",x"0F",x"F0",x"F0",x"F0",x"00", -- 0x07F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0800
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0808
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0810
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0818
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0820
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0828
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0830
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0838
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0840
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0848
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0850
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0858
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0860
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0868
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0870
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0878
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0880
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0888
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0890
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0898
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0900
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0908
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0910
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0918
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0920
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0928
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0930
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0938
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0940
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0948
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0950
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0958
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0960
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0968
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0970
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0978
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0980
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0988
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0990
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0998
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0ED0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0ED8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x0FF8
+ );
+
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+end RTL;
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_datasoft.vhd b/lib/VGA_ctrl/src/fonts/char_rom_datasoft.vhd
new file mode 100644
index 0000000..95a9bd1
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_datasoft.vhd
@@ -0,0 +1,539 @@
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(7 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(7 downto 0);
+ constant ROM : ROM_ARRAY := (
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0000
+ x"08",x"14",x"14",x"22",x"3E",x"41",x"41",x"80", -- 0x0008
+ x"FC",x"42",x"42",x"7C",x"42",x"42",x"42",x"FC", -- 0x0010
+ x"3C",x"46",x"40",x"40",x"40",x"40",x"46",x"3C", -- 0x0018
+ x"FC",x"42",x"42",x"42",x"42",x"42",x"42",x"FC", -- 0x0020
+ x"FC",x"46",x"50",x"70",x"50",x"40",x"46",x"FC", -- 0x0028
+ x"FC",x"46",x"50",x"70",x"50",x"40",x"40",x"E0", -- 0x0030
+ x"3C",x"46",x"40",x"4E",x"44",x"44",x"44",x"3C", -- 0x0038
+ x"EE",x"44",x"44",x"7C",x"44",x"44",x"44",x"EE", -- 0x0040
+ x"1C",x"08",x"08",x"08",x"08",x"08",x"08",x"1C", -- 0x0048
+ x"1C",x"08",x"08",x"08",x"08",x"08",x"C8",x"70", -- 0x0050
+ x"E6",x"48",x"50",x"60",x"50",x"48",x"44",x"EE", -- 0x0058
+ x"E0",x"40",x"40",x"40",x"40",x"40",x"46",x"FC", -- 0x0060
+ x"C6",x"6C",x"6C",x"54",x"54",x"44",x"44",x"EE", -- 0x0068
+ x"CE",x"64",x"64",x"54",x"54",x"4C",x"4C",x"E6", -- 0x0070
+ x"3C",x"42",x"42",x"42",x"42",x"42",x"42",x"3C", -- 0x0078
+ x"FC",x"42",x"42",x"7C",x"40",x"40",x"40",x"E0", -- 0x0080
+ x"3C",x"42",x"42",x"42",x"42",x"4A",x"46",x"3D", -- 0x0088
+ x"FC",x"42",x"42",x"7C",x"50",x"48",x"44",x"EE", -- 0x0090
+ x"3C",x"42",x"40",x"20",x"1C",x"02",x"C2",x"7C", -- 0x0098
+ x"FE",x"92",x"10",x"10",x"10",x"10",x"10",x"38", -- 0x00A0
+ x"E7",x"42",x"42",x"42",x"42",x"42",x"42",x"3C", -- 0x00A8
+ x"E7",x"42",x"42",x"42",x"42",x"42",x"24",x"18", -- 0x00B0
+ x"C3",x"41",x"5D",x"49",x"49",x"55",x"63",x"41", -- 0x00B8
+ x"EE",x"44",x"28",x"10",x"10",x"28",x"44",x"EE", -- 0x00C0
+ x"EE",x"44",x"44",x"28",x"10",x"10",x"10",x"38", -- 0x00C8
+ x"FE",x"84",x"08",x"7C",x"24",x"40",x"82",x"FE", -- 0x00D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0100
+ x"10",x"10",x"10",x"10",x"10",x"00",x"10",x"10", -- 0x0108
+ x"CC",x"44",x"44",x"22",x"00",x"00",x"00",x"00", -- 0x0110
+ x"77",x"22",x"FF",x"22",x"22",x"FF",x"22",x"77", -- 0x0118
+ x"10",x"3E",x"50",x"3C",x"12",x"12",x"7C",x"10", -- 0x0120
+ x"87",x"42",x"04",x"08",x"10",x"20",x"44",x"E2", -- 0x0128
+ x"3C",x"66",x"3C",x"38",x"67",x"66",x"3F",x"00", -- 0x0130
+ x"1E",x"08",x"3C",x"00",x"00",x"00",x"00",x"00", -- 0x0138
+ x"0E",x"12",x"60",x"40",x"40",x"60",x"12",x"0E", -- 0x0140
+ x"70",x"48",x"06",x"02",x"02",x"06",x"48",x"70", -- 0x0148
+ x"42",x"24",x"99",x"7E",x"99",x"24",x"42",x"00", -- 0x0150
+ x"08",x"08",x"08",x"7F",x"08",x"08",x"08",x"00", -- 0x0158
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"30", -- 0x0160
+ x"00",x"00",x"00",x"7E",x"00",x"00",x"00",x"00", -- 0x0168
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"00", -- 0x0170
+ x"00",x"03",x"06",x"0C",x"18",x"30",x"60",x"00", -- 0x0178
+ x"7C",x"82",x"82",x"82",x"82",x"82",x"82",x"7C", -- 0x0180
+ x"10",x"30",x"50",x"10",x"10",x"10",x"10",x"7C", -- 0x0188
+ x"7C",x"C2",x"02",x"1C",x"60",x"80",x"86",x"FC", -- 0x0190
+ x"7C",x"C2",x"02",x"1C",x"02",x"02",x"C2",x"7C", -- 0x0198
+ x"08",x"18",x"28",x"48",x"FE",x"08",x"08",x"3E", -- 0x01A0
+ x"FE",x"80",x"80",x"FC",x"02",x"02",x"C2",x"7C", -- 0x01A8
+ x"7C",x"86",x"80",x"FC",x"82",x"82",x"82",x"7C", -- 0x01B0
+ x"7E",x"C2",x"04",x"08",x"10",x"10",x"10",x"7C", -- 0x01B8
+ x"7C",x"82",x"82",x"7C",x"82",x"82",x"82",x"7C", -- 0x01C0
+ x"7C",x"82",x"82",x"7E",x"02",x"02",x"C2",x"7C", -- 0x01C8
+ x"00",x"00",x"18",x"00",x"00",x"18",x"00",x"00", -- 0x01D0
+ x"00",x"00",x"18",x"00",x"00",x"18",x"18",x"30", -- 0x01D8
+ x"0E",x"18",x"30",x"60",x"30",x"18",x"0E",x"00", -- 0x01E0
+ x"00",x"00",x"7E",x"00",x"7E",x"00",x"00",x"00", -- 0x01E8
+ x"70",x"18",x"0C",x"06",x"0C",x"18",x"70",x"00", -- 0x01F0
+ x"3C",x"62",x"02",x"04",x"08",x"08",x"00",x"08", -- 0x01F8
+ x"3C",x"66",x"6E",x"6E",x"60",x"62",x"3C",x"00", -- 0x0200
+ x"FE",x"FE",x"C6",x"FE",x"C6",x"C6",x"C6",x"C6", -- 0x0208
+ x"FE",x"FE",x"C6",x"FC",x"C6",x"C6",x"FE",x"FE", -- 0x0210
+ x"FE",x"FE",x"C0",x"C0",x"C0",x"C0",x"FE",x"FE", -- 0x0218
+ x"FE",x"FE",x"C6",x"C6",x"C6",x"C6",x"FE",x"FE", -- 0x0220
+ x"FE",x"FE",x"C0",x"FE",x"C0",x"C0",x"FE",x"FE", -- 0x0228
+ x"FE",x"FE",x"C0",x"FE",x"C0",x"C0",x"C0",x"C0", -- 0x0230
+ x"FE",x"FE",x"C0",x"DE",x"C6",x"C6",x"FE",x"FE", -- 0x0238
+ x"C6",x"C6",x"C6",x"FE",x"C6",x"C6",x"C6",x"C6", -- 0x0240
+ x"18",x"18",x"18",x"18",x"18",x"18",x"18",x"18", -- 0x0248
+ x"18",x"18",x"18",x"18",x"18",x"18",x"78",x"78", -- 0x0250
+ x"C6",x"C6",x"DC",x"F0",x"D8",x"CC",x"C6",x"C6", -- 0x0258
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"FE",x"FE", -- 0x0260
+ x"FE",x"FE",x"D6",x"D6",x"D6",x"D6",x"D6",x"D6", -- 0x0268
+ x"E6",x"E6",x"F6",x"D6",x"D6",x"DE",x"CE",x"CE", -- 0x0270
+ x"FE",x"FE",x"C6",x"C6",x"C6",x"C6",x"FE",x"FE", -- 0x0278
+ x"FE",x"FE",x"C6",x"FE",x"C0",x"C0",x"C0",x"C0", -- 0x0280
+ x"FE",x"FE",x"C6",x"C6",x"C6",x"CE",x"FE",x"FF", -- 0x0288
+ x"FE",x"FE",x"C6",x"FE",x"D8",x"D8",x"C6",x"C6", -- 0x0290
+ x"FE",x"FE",x"C0",x"FE",x"06",x"06",x"FE",x"FE", -- 0x0298
+ x"FE",x"FE",x"18",x"18",x"18",x"18",x"18",x"18", -- 0x02A0
+ x"C6",x"C6",x"C6",x"C6",x"C6",x"C6",x"FE",x"FE", -- 0x02A8
+ x"C6",x"C6",x"C6",x"C6",x"C6",x"C6",x"FE",x"7C", -- 0x02B0
+ x"D6",x"D6",x"D6",x"D6",x"D6",x"D6",x"FE",x"FE", -- 0x02B8
+ x"C6",x"C6",x"6C",x"38",x"38",x"6C",x"C6",x"C6", -- 0x02C0
+ x"C6",x"C6",x"C6",x"FE",x"06",x"06",x"FE",x"FE", -- 0x02C8
+ x"FE",x"FE",x"0E",x"18",x"30",x"E0",x"FE",x"FE", -- 0x02D0
+ x"3C",x"30",x"30",x"30",x"30",x"30",x"3C",x"00", -- 0x02D8
+ x"0C",x"12",x"30",x"7C",x"30",x"62",x"FC",x"00", -- 0x02E0
+ x"3C",x"0C",x"0C",x"0C",x"0C",x"0C",x"3C",x"00", -- 0x02E8
+ x"00",x"18",x"3C",x"7E",x"18",x"18",x"18",x"18", -- 0x02F0
+ x"00",x"10",x"30",x"7F",x"7F",x"30",x"10",x"00", -- 0x02F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0300
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0308
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0310
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0318
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0320
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0328
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0330
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0338
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0340
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0348
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0350
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0358
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0360
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0368
+ x"00",x"00",x"00",x"07",x"1F",x"3F",x"3F",x"7F", -- 0x0370
+ x"00",x"00",x"00",x"E0",x"E0",x"E0",x"E0",x"E0", -- 0x0378
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0380
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0388
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0390
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0398
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0400
+ x"03",x"1F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0408
+ x"FC",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"0F", -- 0x0410
+ x"00",x"80",x"E0",x"F8",x"F8",x"FE",x"FE",x"FE", -- 0x0418
+ x"00",x"00",x"00",x"00",x"00",x"00",x"07",x"07", -- 0x0420
+ x"00",x"00",x"00",x"00",x"00",x"00",x"F8",x"FE", -- 0x0428
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0430
+ x"00",x"00",x"00",x"00",x"00",x"00",x"F0",x"F0", -- 0x0438
+ x"00",x"00",x"00",x"00",x"00",x"00",x"7F",x"7F", -- 0x0440
+ x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"E0", -- 0x0448
+ x"00",x"00",x"00",x"00",x"00",x"00",x"0F",x"3F", -- 0x0450
+ x"00",x"00",x"00",x"00",x"00",x"00",x"C0",x"C0", -- 0x0458
+ x"00",x"00",x"00",x"00",x"00",x"00",x"1F",x"7F", -- 0x0460
+ x"00",x"00",x"00",x"00",x"00",x"00",x"E0",x"F8", -- 0x0468
+ x"7E",x"7E",x"7E",x"7E",x"7E",x"7E",x"7F",x"7F", -- 0x0470
+ x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"FF",x"FF", -- 0x0478
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"FC",x"FC", -- 0x0480
+ x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"07", -- 0x0488
+ x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F1", -- 0x0490
+ x"00",x"00",x"00",x"00",x"00",x"00",x"7F",x"FF", -- 0x0498
+ x"00",x"00",x"00",x"00",x"00",x"00",x"80",x"E0", -- 0x04A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"0F",x"3F", -- 0x04A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"F0",x"F0", -- 0x04B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0500
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0508
+ x"03",x"01",x"01",x"01",x"01",x"01",x"01",x"01", -- 0x0510
+ x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE", -- 0x0518
+ x"07",x"07",x"07",x"00",x"00",x"07",x"0F",x"3F", -- 0x0520
+ x"FE",x"FF",x"FF",x"7F",x"3F",x"FF",x"FF",x"FF", -- 0x0528
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F", -- 0x0530
+ x"F0",x"F0",x"F0",x"00",x"00",x"00",x"00",x"03", -- 0x0538
+ x"7F",x"7F",x"7F",x"07",x"03",x"7F",x"FF",x"FF", -- 0x0540
+ x"E0",x"F0",x"F1",x"F1",x"F3",x"F3",x"F3",x"F1", -- 0x0548
+ x"7F",x"FF",x"FF",x"FC",x"F0",x"F0",x"F0",x"F8", -- 0x0550
+ x"C0",x"C1",x"C1",x"03",x"03",x"03",x"03",x"03", -- 0x0558
+ x"FF",x"FF",x"FF",x"FF",x"F8",x"F0",x"F0",x"F0", -- 0x0560
+ x"FC",x"FE",x"FE",x"FF",x"7F",x"3F",x"3F",x"3F", -- 0x0568
+ x"7F",x"7F",x"7F",x"7E",x"7E",x"7E",x"7E",x"7E", -- 0x0570
+ x"FF",x"FF",x"FF",x"0F",x"0F",x"0F",x"0F",x"0F", -- 0x0578
+ x"FC",x"FC",x"FC",x"C0",x"C0",x"C0",x"C0",x"C0", -- 0x0580
+ x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"07", -- 0x0588
+ x"F3",x"F3",x"F3",x"F3",x"F3",x"F3",x"F3",x"F3", -- 0x0590
+ x"FF",x"FF",x"FF",x"F3",x"F1",x"F1",x"F1",x"F1", -- 0x0598
+ x"F0",x"F0",x"F8",x"F9",x"F9",x"F9",x"F9",x"F9", -- 0x05A0
+ x"7F",x"FF",x"FF",x"FC",x"F8",x"F8",x"F8",x"F8", -- 0x05A8
+ x"F0",x"F0",x"F0",x"00",x"00",x"00",x"00",x"00", -- 0x05B0
+ x"3C",x"42",x"B9",x"A5",x"B9",x"A9",x"A5",x"42", -- 0x05B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0600
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0608
+ x"01",x"01",x"03",x"0F",x"7F",x"7F",x"7F",x"7F", -- 0x0610
+ x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FC",x"FC", -- 0x0618
+ x"3F",x"7F",x"7E",x"7C",x"7E",x"7F",x"3F",x"3F", -- 0x0620
+ x"FF",x"FF",x"3F",x"3F",x"3F",x"BF",x"BF",x"BF", -- 0x0628
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"1F", -- 0x0630
+ x"03",x"07",x"07",x"07",x"07",x"F7",x"F3",x"F3", -- 0x0638
+ x"FF",x"FF",x"E3",x"C3",x"E3",x"FB",x"FB",x"FB", -- 0x0640
+ x"F1",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0",x"F0", -- 0x0648
+ x"FC",x"FE",x"7F",x"3F",x"1F",x"0F",x"07",x"03", -- 0x0650
+ x"03",x"03",x"83",x"C3",x"E3",x"F1",x"F1",x"F0", -- 0x0658
+ x"F0",x"F0",x"F0",x"F0",x"F8",x"FF",x"FF",x"FF", -- 0x0660
+ x"3F",x"3F",x"3F",x"3F",x"7F",x"FE",x"FE",x"FC", -- 0x0668
+ x"7E",x"7E",x"7E",x"7E",x"7E",x"7E",x"7E",x"7E", -- 0x0670
+ x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"0F",x"07", -- 0x0678
+ x"C0",x"C0",x"C0",x"C0",x"C0",x"FC",x"FC",x"FC", -- 0x0680
+ x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"07", -- 0x0688
+ x"F3",x"F3",x"F3",x"F3",x"F3",x"F3",x"F3",x"F3", -- 0x0690
+ x"F1",x"F1",x"F1",x"F1",x"F1",x"F1",x"F1",x"F1", -- 0x0698
+ x"F9",x"F9",x"F9",x"F9",x"F9",x"F8",x"F8",x"F8", -- 0x06A0
+ x"F8",x"F8",x"F8",x"F8",x"FC",x"FF",x"FF",x"7F", -- 0x06A8
+ x"00",x"00",x"00",x"00",x"00",x"FC",x"FC",x"FC", -- 0x06B0
+ x"3C",x"00",x"00",x"00",x"78",x"FC",x"FC",x"FC", -- 0x06B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0700
+ x"7F",x"7F",x"7F",x"00",x"00",x"00",x"00",x"00", -- 0x0708
+ x"7F",x"7F",x"7F",x"00",x"00",x"00",x"00",x"00", -- 0x0710
+ x"F0",x"E0",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0718
+ x"0F",x"07",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0720
+ x"BF",x"BF",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0728
+ x"1F",x"07",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0730
+ x"F0",x"F0",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0738
+ x"FB",x"7B",x"03",x"01",x"00",x"00",x"00",x"00", -- 0x0740
+ x"F0",x"F8",x"FE",x"FF",x"FF",x"FF",x"3F",x"07", -- 0x0748
+ x"03",x"07",x"1F",x"FF",x"FF",x"FF",x"FE",x"F0", -- 0x0750
+ x"F0",x"F0",x"E0",x"E0",x"C0",x"80",x"00",x"00", -- 0x0758
+ x"7F",x"1F",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0760
+ x"F8",x"E0",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0768
+ x"7E",x"7E",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0770
+ x"07",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778
+ x"FC",x"FC",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0780
+ x"07",x"07",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0788
+ x"F3",x"F3",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0790
+ x"F1",x"F1",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0798
+ x"F8",x"F8",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07A0
+ x"3F",x"0F",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07A8
+ x"FC",x"FC",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B0
+ x"FC",x"78",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0800
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0808
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0810
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0818
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0820
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0828
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0830
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0838
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0840
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0848
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0850
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0858
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0860
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0868
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0870
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0878
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0880
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0888
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0890
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0898
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0900
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0908
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0910
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0918
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0920
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0928
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0930
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0938
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0940
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0948
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0950
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0958
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0960
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0968
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0970
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0978
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0980
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0988
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0990
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0998
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0ED0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0ED8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x0FF8
+ );
+
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+end RTL;
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_demo_maker_m.vhd b/lib/VGA_ctrl/src/fonts/char_rom_demo_maker_m.vhd
new file mode 100644
index 0000000..ce977b6
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_demo_maker_m.vhd
@@ -0,0 +1,539 @@
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(7 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(7 downto 0);
+ constant ROM : ROM_ARRAY := (
+ x"3C",x"66",x"6E",x"6A",x"6E",x"60",x"3C",x"00", -- 0x0000
+ x"00",x"00",x"3C",x"06",x"3E",x"66",x"3E",x"00", -- 0x0008
+ x"60",x"60",x"7C",x"66",x"66",x"66",x"7C",x"00", -- 0x0010
+ x"00",x"00",x"3C",x"66",x"60",x"66",x"3C",x"00", -- 0x0018
+ x"06",x"06",x"3E",x"66",x"66",x"66",x"3E",x"00", -- 0x0020
+ x"00",x"00",x"3C",x"66",x"7E",x"60",x"3C",x"00", -- 0x0028
+ x"1C",x"30",x"30",x"7C",x"30",x"30",x"30",x"00", -- 0x0030
+ x"00",x"00",x"3E",x"66",x"66",x"3E",x"06",x"3C", -- 0x0038
+ x"60",x"60",x"7C",x"66",x"66",x"66",x"66",x"00", -- 0x0040
+ x"18",x"00",x"38",x"18",x"18",x"18",x"3C",x"00", -- 0x0048
+ x"18",x"00",x"38",x"18",x"18",x"18",x"18",x"70", -- 0x0050
+ x"60",x"60",x"66",x"6C",x"78",x"6C",x"66",x"00", -- 0x0058
+ x"38",x"18",x"18",x"18",x"18",x"18",x"3C",x"00", -- 0x0060
+ x"00",x"00",x"36",x"7F",x"6B",x"6B",x"63",x"00", -- 0x0068
+ x"00",x"00",x"7C",x"66",x"66",x"66",x"66",x"00", -- 0x0070
+ x"00",x"00",x"3C",x"66",x"66",x"66",x"3C",x"00", -- 0x0078
+ x"00",x"00",x"7C",x"66",x"66",x"7C",x"60",x"60", -- 0x0080
+ x"00",x"00",x"3E",x"66",x"66",x"3E",x"06",x"07", -- 0x0088
+ x"00",x"00",x"6C",x"76",x"60",x"60",x"60",x"00", -- 0x0090
+ x"00",x"00",x"3E",x"60",x"3C",x"06",x"7C",x"00", -- 0x0098
+ x"30",x"30",x"7C",x"30",x"30",x"30",x"1C",x"00", -- 0x00A0
+ x"00",x"00",x"66",x"66",x"66",x"66",x"3E",x"00", -- 0x00A8
+ x"00",x"00",x"66",x"66",x"66",x"3C",x"18",x"00", -- 0x00B0
+ x"00",x"00",x"63",x"6B",x"6B",x"7F",x"36",x"00", -- 0x00B8
+ x"00",x"00",x"66",x"3C",x"18",x"3C",x"66",x"00", -- 0x00C0
+ x"00",x"00",x"66",x"66",x"66",x"3E",x"06",x"3C", -- 0x00C8
+ x"00",x"00",x"7E",x"0C",x"18",x"30",x"7E",x"00", -- 0x00D0
+ x"7C",x"60",x"60",x"60",x"60",x"60",x"7C",x"00", -- 0x00D8
+ x"1C",x"36",x"30",x"7C",x"30",x"30",x"7E",x"00", -- 0x00E0
+ x"3E",x"06",x"06",x"06",x"06",x"06",x"3E",x"00", -- 0x00E8
+ x"00",x"18",x"3C",x"7E",x"18",x"18",x"18",x"18", -- 0x00F0
+ x"00",x"10",x"30",x"7F",x"7F",x"30",x"10",x"00", -- 0x00F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0100
+ x"18",x"18",x"18",x"18",x"18",x"00",x"18",x"00", -- 0x0108
+ x"6C",x"6C",x"6C",x"00",x"00",x"00",x"00",x"00", -- 0x0110
+ x"36",x"36",x"7F",x"36",x"7F",x"36",x"36",x"00", -- 0x0118
+ x"0C",x"3F",x"68",x"3E",x"0B",x"7E",x"18",x"00", -- 0x0120
+ x"60",x"66",x"0C",x"18",x"30",x"66",x"06",x"00", -- 0x0128
+ x"38",x"6C",x"6C",x"38",x"6D",x"66",x"3B",x"00", -- 0x0130
+ x"0C",x"18",x"30",x"00",x"00",x"00",x"00",x"00", -- 0x0138
+ x"0C",x"18",x"30",x"30",x"30",x"18",x"0C",x"00", -- 0x0140
+ x"30",x"18",x"0C",x"0C",x"0C",x"18",x"30",x"00", -- 0x0148
+ x"00",x"18",x"7E",x"3C",x"7E",x"18",x"00",x"00", -- 0x0150
+ x"00",x"18",x"18",x"7E",x"18",x"18",x"00",x"00", -- 0x0158
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"30", -- 0x0160
+ x"00",x"00",x"00",x"7E",x"00",x"00",x"00",x"00", -- 0x0168
+ x"00",x"00",x"00",x"00",x"00",x"18",x"18",x"00", -- 0x0170
+ x"00",x"06",x"0C",x"18",x"30",x"60",x"00",x"00", -- 0x0178
+ x"3C",x"66",x"6E",x"7E",x"76",x"66",x"3C",x"00", -- 0x0180
+ x"18",x"38",x"18",x"18",x"18",x"18",x"7E",x"00", -- 0x0188
+ x"3C",x"66",x"06",x"0C",x"18",x"30",x"7E",x"00", -- 0x0190
+ x"3C",x"66",x"06",x"1C",x"06",x"66",x"3C",x"00", -- 0x0198
+ x"0C",x"1C",x"3C",x"6C",x"7E",x"0C",x"0C",x"00", -- 0x01A0
+ x"7E",x"60",x"7C",x"06",x"06",x"66",x"3C",x"00", -- 0x01A8
+ x"1C",x"30",x"60",x"7C",x"66",x"66",x"3C",x"00", -- 0x01B0
+ x"7E",x"06",x"0C",x"18",x"30",x"30",x"30",x"00", -- 0x01B8
+ x"3C",x"66",x"66",x"3C",x"66",x"66",x"3C",x"00", -- 0x01C0
+ x"3C",x"66",x"66",x"3E",x"06",x"0C",x"38",x"00", -- 0x01C8
+ x"00",x"00",x"18",x"18",x"00",x"18",x"18",x"00", -- 0x01D0
+ x"00",x"00",x"18",x"18",x"00",x"18",x"18",x"30", -- 0x01D8
+ x"0C",x"18",x"30",x"60",x"30",x"18",x"0C",x"00", -- 0x01E0
+ x"00",x"00",x"7E",x"00",x"7E",x"00",x"00",x"00", -- 0x01E8
+ x"30",x"18",x"0C",x"06",x"0C",x"18",x"30",x"00", -- 0x01F0
+ x"3C",x"66",x"0C",x"18",x"18",x"00",x"18",x"00", -- 0x01F8
+ x"00",x"00",x"00",x"FF",x"FF",x"00",x"00",x"00", -- 0x0200
+ x"3C",x"66",x"66",x"7E",x"66",x"66",x"66",x"00", -- 0x0208
+ x"7C",x"66",x"66",x"7C",x"66",x"66",x"7C",x"00", -- 0x0210
+ x"3C",x"66",x"60",x"60",x"60",x"66",x"3C",x"00", -- 0x0218
+ x"78",x"6C",x"66",x"66",x"66",x"6C",x"78",x"00", -- 0x0220
+ x"7E",x"60",x"60",x"7C",x"60",x"60",x"7E",x"00", -- 0x0228
+ x"7E",x"60",x"60",x"7C",x"60",x"60",x"60",x"00", -- 0x0230
+ x"3C",x"66",x"60",x"6E",x"66",x"66",x"3C",x"00", -- 0x0238
+ x"66",x"66",x"66",x"7E",x"66",x"66",x"66",x"00", -- 0x0240
+ x"7E",x"18",x"18",x"18",x"18",x"18",x"7E",x"00", -- 0x0248
+ x"3E",x"0C",x"0C",x"0C",x"0C",x"6C",x"38",x"00", -- 0x0250
+ x"66",x"6C",x"78",x"70",x"78",x"6C",x"66",x"00", -- 0x0258
+ x"60",x"60",x"60",x"60",x"60",x"60",x"7E",x"00", -- 0x0260
+ x"63",x"77",x"7F",x"6B",x"6B",x"63",x"63",x"00", -- 0x0268
+ x"66",x"66",x"76",x"7E",x"6E",x"66",x"66",x"00", -- 0x0270
+ x"3C",x"66",x"66",x"66",x"66",x"66",x"3C",x"00", -- 0x0278
+ x"7C",x"66",x"66",x"7C",x"60",x"60",x"60",x"00", -- 0x0280
+ x"3C",x"66",x"66",x"66",x"6A",x"6C",x"36",x"00", -- 0x0288
+ x"7C",x"66",x"66",x"7C",x"6C",x"66",x"66",x"00", -- 0x0290
+ x"3C",x"66",x"60",x"3C",x"06",x"66",x"3C",x"00", -- 0x0298
+ x"7E",x"18",x"18",x"18",x"18",x"18",x"18",x"00", -- 0x02A0
+ x"66",x"66",x"66",x"66",x"66",x"66",x"3C",x"00", -- 0x02A8
+ x"66",x"66",x"66",x"66",x"66",x"3C",x"18",x"00", -- 0x02B0
+ x"63",x"63",x"6B",x"00",x"00",x"00",x"00",x"00", -- 0x02B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0300
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0308
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0310
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0318
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0320
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0328
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0330
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0338
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0340
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0348
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0350
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0358
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0360
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0368
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0370
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0378
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0380
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0388
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0390
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0398
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0400
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0408
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0410
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0418
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0420
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0428
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0430
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0440
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0448
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0450
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0458
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0460
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0468
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0470
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0478
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0480
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0488
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0490
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0498
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0500
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0508
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0510
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0518
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0520
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0528
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0538
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0540
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0548
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0558
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0560
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0568
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0578
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0588
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0590
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0598
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0600
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0608
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0610
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0618
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0620
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0628
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0630
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0638
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0640
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0648
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0650
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0658
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0660
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0668
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0670
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0678
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0680
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0688
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0690
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0698
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0700
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0708
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0710
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0718
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0720
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0728
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0730
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0738
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0740
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0748
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0750
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0758
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0760
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0768
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0770
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0780
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0788
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0790
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0798
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0800
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0808
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0810
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0818
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0820
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0828
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0830
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0838
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0840
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0848
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0850
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0858
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0860
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0868
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0870
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0878
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0880
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0888
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0890
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0898
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0900
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0908
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0910
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0918
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0920
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0928
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0930
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0938
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0940
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0948
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0950
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0958
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0960
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0968
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0970
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0978
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0980
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0988
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0990
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0998
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0ED0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0ED8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x0FF8
+ );
+
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+end RTL;
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_8x15.vhd b/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_8x15.vhd
new file mode 100644
index 0000000..3b60051
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_8x15.vhd
@@ -0,0 +1,4383 @@
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port
+ (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(7 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(7 downto 0);
+ constant ROM : ROM_ARRAY :=
+ (
+ -- ASCII 032 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 033 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "00111100", -- | #### | 05
+ "00111100", -- | #### | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00000000", -- | | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 034 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 035 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110110", -- | ## ## | 03
+ "00110110", -- | ## ## | 04
+ "01111111", -- | #######| 05
+ "00110110", -- | ## ## | 06
+ "00110110", -- | ## ## | 07
+ "00110110", -- | ## ## | 08
+ "01111111", -- | #######| 09
+ "00110110", -- | ## ## | 10
+ "00110110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 036 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00011000", -- | ## | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00000110", -- | ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00011000", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00000000", -- | | 14
+ -- ASCII 037 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01110000", -- | ### | 02
+ "11011000", -- |## ## | 03
+ "11011010", -- |## ## # | 04
+ "01110110", -- | ### ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "01101110", -- | ## ### | 09
+ "01011011", -- | # ## ##| 10
+ "00011011", -- | ## ##| 11
+ "00001110", -- | ### | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 038 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "11111111", -- |########| 13
+ "00000000", -- | | 14
+ -- ASCII 039 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 040 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001100", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00110000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00000000", -- | | 14
+ -- ASCII 041 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00110000", -- | ## | 13
+ "00000000", -- | | 14
+ -- ASCII 042 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00110110", -- | ## ## | 05
+ "00011100", -- | ### | 06
+ "01111111", -- | #######| 07
+ "00011100", -- | ### | 08
+ "00110110", -- | ## ## | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 043 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "01111110", -- | ###### | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 044 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011100", -- | ### | 10
+ "00011100", -- | ### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00000000", -- | | 14
+ -- ASCII 045 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "01111110", -- | ###### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 046 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011100", -- | ### | 10
+ "00011100", -- | ### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 047 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000110", -- | ## | 03
+ "00000110", -- | ## | 04
+ "00001100", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "01100000", -- | ## | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 048 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011110", -- | #### | 03
+ "00110011", -- | ## ##| 04
+ "00110111", -- | ## ###| 05
+ "00110111", -- | ## ###| 06
+ "00110011", -- | ## ##| 07
+ "00111011", -- | ### ##| 08
+ "00111011", -- | ### ##| 09
+ "00110011", -- | ## ##| 10
+ "00011110", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 049 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001100", -- | ## | 03
+ "00011100", -- | ### | 04
+ "01111100", -- | ##### | 05
+ "00001100", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00001100", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 050 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00000110", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 051 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00000110", -- | ## | 06
+ "00011100", -- | ### | 07
+ "00000110", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 052 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110000", -- | ## | 03
+ "00110000", -- | ## | 04
+ "00110110", -- | ## ## | 05
+ "00110110", -- | ## ## | 06
+ "00110110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01111111", -- | #######| 09
+ "00000110", -- | ## | 10
+ "00000110", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 053 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "00000110", -- | ## | 08
+ "00000110", -- | ## | 09
+ "00001100", -- | ## | 10
+ "01111000", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 054 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011100", -- | ### | 03
+ "00011000", -- | ## | 04
+ "00110000", -- | ## | 05
+ "01111100", -- | ##### | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 055 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "00000110", -- | ## | 04
+ "00001100", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00110000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 056 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01110110", -- | ### ## | 06
+ "00111100", -- | #### | 07
+ "01101110", -- | ## ### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 057 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "00111110", -- | ##### | 08
+ "00001100", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111000", -- | ### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 058 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00011100", -- | ### | 05
+ "00011100", -- | ### | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011100", -- | ### | 10
+ "00011100", -- | ### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 059 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00011100", -- | ### | 05
+ "00011100", -- | ### | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011100", -- | ### | 10
+ "00011100", -- | ### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00000000", -- | | 14
+ -- ASCII 060 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000110", -- | ## | 03
+ "00001100", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00000110", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 061 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "01111110", -- | ###### | 06
+ "00000000", -- | | 07
+ "01111110", -- | ###### | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 062 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "00110000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 063 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00000000", -- | | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 064 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "11000011", -- |## ##| 04
+ "11000011", -- |## ##| 05
+ "11001111", -- |## ####| 06
+ "11011011", -- |## ## ##| 07
+ "11011011", -- |## ## ##| 08
+ "11001111", -- |## ####| 09
+ "11000000", -- |## | 10
+ "01111111", -- | #######| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 065 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 066 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111100", -- | ##### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01111100", -- | ##### | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 067 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 068 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111000", -- | #### | 03
+ "01101100", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01101100", -- | ## ## | 10
+ "01111000", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 069 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 070 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 071 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "01101110", -- | ## ### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 072 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01111110", -- | ###### | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 073 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 074 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000110", -- | ## | 03
+ "00000110", -- | ## | 04
+ "00000110", -- | ## | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00000110", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 075 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01101100", -- | ## ## | 05
+ "01101100", -- | ## ## | 06
+ "01111000", -- | #### | 07
+ "01101100", -- | ## ## | 08
+ "01101100", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 076 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 077 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100011", -- | ## ##| 03
+ "01100011", -- | ## ##| 04
+ "01110111", -- | ### ###| 05
+ "01101011", -- | ## # ##| 06
+ "01101011", -- | ## # ##| 07
+ "01101011", -- | ## # ##| 08
+ "01100011", -- | ## ##| 09
+ "01100011", -- | ## ##| 10
+ "01100011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 078 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100011", -- | ## ##| 03
+ "01100011", -- | ## ##| 04
+ "01110011", -- | ### ##| 05
+ "01111011", -- | #### ##| 06
+ "01101111", -- | ## ####| 07
+ "01100111", -- | ## ###| 08
+ "01100011", -- | ## ##| 09
+ "01100011", -- | ## ##| 10
+ "01100011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 079 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 080 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111100", -- | ##### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 081 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00001100", -- | ## | 12
+ "00000110", -- | ## | 13
+ "00000000", -- | | 14
+ -- ASCII 082 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111100", -- | ##### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01111100", -- | ##### | 07
+ "01101100", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 083 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00000110", -- | ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 084 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 085 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 086 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "00111100", -- | #### | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 087 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100011", -- | ## ##| 03
+ "01100011", -- | ## ##| 04
+ "01100011", -- | ## ##| 05
+ "01101011", -- | ## # ##| 06
+ "01101011", -- | ## # ##| 07
+ "01101011", -- | ## # ##| 08
+ "00110110", -- | ## ## | 09
+ "00110110", -- | ## ## | 10
+ "00110110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 088 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "00110100", -- | ## # | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00101100", -- | # ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 089 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "00111100", -- | #### | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 090 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "00000110", -- | ## | 04
+ "00000110", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 091 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00110000", -- | ## | 04
+ "00110000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00110000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00110000", -- | ## | 11
+ "00110000", -- | ## | 12
+ "00110000", -- | ## | 13
+ "00111100", -- | #### | 14
+ -- ASCII 092 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "00110000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00000110", -- | ## | 11
+ "00000110", -- | ## | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 093 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00001100", -- | ## | 04
+ "00001100", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00001100", -- | ## | 11
+ "00001100", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00111100", -- | #### | 14
+ -- ASCII 094 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 095 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "11111111", -- |########| 14
+ -- ASCII 096 ---------------
+ "00000000", -- | | 00
+ "00111000", -- | ### | 01
+ "00011000", -- | ## | 02
+ "00001100", -- | ## | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 097 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 098 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 099 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 100 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000110", -- | ## | 03
+ "00000110", -- | ## | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 101 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 102 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011110", -- | #### | 03
+ "00110000", -- | ## | 04
+ "00110000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "01111110", -- | ###### | 07
+ "00110000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00110000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 103 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000110", -- | ## | 12
+ "00000110", -- | ## | 13
+ "01111100", -- | ##### | 14
+ -- ASCII 104 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 105 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00011000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 106 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00001100", -- | ## | 02
+ "00001100", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00001100", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00001100", -- | ## | 11
+ "00001100", -- | ## | 12
+ "00001100", -- | ## | 13
+ "01111000", -- | #### | 14
+ -- ASCII 107 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01101100", -- | ## ## | 07
+ "01111000", -- | #### | 08
+ "01101100", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 108 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111000", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 109 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01111110", -- | ###### | 05
+ "01101011", -- | ## # ##| 06
+ "01101011", -- | ## # ##| 07
+ "01101011", -- | ## # ##| 08
+ "01101011", -- | ## # ##| 09
+ "01101011", -- | ## # ##| 10
+ "01100011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 110 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 111 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 112 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "01100000", -- | ## | 12
+ "01100000", -- | ## | 13
+ "01100000", -- | ## | 14
+ -- ASCII 113 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000110", -- | ## | 12
+ "00000110", -- | ## | 13
+ "00000110", -- | ## | 14
+ -- ASCII 114 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01101110", -- | ## ### | 06
+ "01110000", -- | ### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 115 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111110", -- | ##### | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "00111100", -- | #### | 08
+ "00000110", -- | ## | 09
+ "00000110", -- | ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 116 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110000", -- | ## | 03
+ "00110000", -- | ## | 04
+ "01111110", -- | ###### | 05
+ "00110000", -- | ## | 06
+ "00110000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00011110", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 117 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 118 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "00111100", -- | #### | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 119 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100011", -- | ## ##| 05
+ "01101011", -- | ## # ##| 06
+ "01101011", -- | ## # ##| 07
+ "01101011", -- | ## # ##| 08
+ "01101011", -- | ## # ##| 09
+ "00110110", -- | ## ## | 10
+ "00110110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 120 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "00111100", -- | #### | 07
+ "00011000", -- | ## | 08
+ "00111100", -- | #### | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 121 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "11110000", -- |#### | 14
+ -- ASCII 122 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01111110", -- | ###### | 05
+ "00000110", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 123 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001100", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00110000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00000000", -- | | 14
+ -- ASCII 124 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00011000", -- | ## | 14
+ -- ASCII 125 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00000110", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00110000", -- | ## | 13
+ "00000000", -- | | 14
+ -- ASCII 126 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01110001", -- | ### #| 03
+ "11011011", -- |## ## ##| 04
+ "10001110", -- |# ### | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 127 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 128 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 129 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 130 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 131 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 132 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 133 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 134 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 135 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 136 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 137 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 138 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 139 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 140 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 141 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 142 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 143 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 144 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 145 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001100", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011100", -- | ### | 05
+ "00011100", -- | ### | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 146 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011100", -- | ### | 03
+ "00011100", -- | ### | 04
+ "00001100", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 147 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 148 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 149 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 150 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 151 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 152 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 153 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 154 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 155 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 156 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 157 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 158 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 159 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 160 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 161 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00000000", -- | | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00111100", -- | #### | 12
+ "00111100", -- | #### | 13
+ "00011000", -- | ## | 14
+ -- ASCII 162 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "00111100", -- | #### | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 163 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "11111100", -- |###### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "11000000", -- |## | 10
+ "11111110", -- |####### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 164 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "01100110", -- | ## ## | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "00111100", -- | #### | 08
+ "01100110", -- | ## ## | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 165 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00111100", -- | #### | 06
+ "01111110", -- | ###### | 07
+ "00011000", -- | ## | 08
+ "01111110", -- | ###### | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 166 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00011000", -- | ## | 14
+ -- ASCII 167 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100000", -- | ## | 05
+ "00111000", -- | ### | 06
+ "00111100", -- | #### | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "00111100", -- | #### | 10
+ "00011100", -- | ### | 11
+ "00000110", -- | ## | 12
+ "01100110", -- | ## ## | 13
+ "00111100", -- | #### | 14
+ -- ASCII 168 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 169 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "11000011", -- |## ##| 04
+ "10011001", -- |# ## #| 05
+ "10100101", -- |# # # #| 06
+ "10100001", -- |# # #| 07
+ "10100101", -- |# # # #| 08
+ "10011001", -- |# ## #| 09
+ "11000011", -- |## ##| 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 170 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00000110", -- | ## | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "00111110", -- | ##### | 07
+ "00000000", -- | | 08
+ "01111110", -- | ###### | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 171 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00110011", -- | ## ##| 07
+ "01100110", -- | ## ## | 08
+ "11001100", -- |## ## | 09
+ "01100110", -- | ## ## | 10
+ "00110011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 172 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "01111110", -- | ###### | 07
+ "00000110", -- | ## | 08
+ "00000110", -- | ## | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 173 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "01111110", -- | ###### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 174 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "11000011", -- |## ##| 04
+ "10111001", -- |# ### #| 05
+ "10100101", -- |# # # #| 06
+ "10100101", -- |# # # #| 07
+ "10111001", -- |# ### #| 08
+ "10100101", -- |# # # #| 09
+ "11000011", -- |## ##| 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 175 ---------------
+ "11111111", -- |########| 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 176 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "00111100", -- | #### | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 177 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "01111110", -- | ###### | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00000000", -- | | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 178 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111000", -- | ### | 03
+ "00001100", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00111100", -- | #### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 179 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111000", -- | ### | 03
+ "00001100", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00111000", -- | ### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 180 ---------------
+ "00000000", -- | | 00
+ "00011100", -- | ### | 01
+ "00011000", -- | ## | 02
+ "00110000", -- | ## | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 181 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111011", -- | #### ##| 11
+ "01100000", -- | ## | 12
+ "01100000", -- | ## | 13
+ "11000000", -- |## | 14
+ -- ASCII 182 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011111", -- | #####| 03
+ "00111110", -- | ##### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "00111110", -- | ##### | 08
+ "00011110", -- | #### | 09
+ "00000110", -- | ## | 10
+ "00000110", -- | ## | 11
+ "00000110", -- | ## | 12
+ "00000110", -- | ## | 13
+ "00000110", -- | ## | 14
+ -- ASCII 183 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00011100", -- | ### | 06
+ "00011100", -- | ### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 184 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00111000", -- | ### | 14
+ -- ASCII 185 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111000", -- | ### | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 186 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "00111100", -- | #### | 07
+ "00000000", -- | | 08
+ "01111110", -- | ###### | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 187 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "11001100", -- |## ## | 07
+ "01100110", -- | ## ## | 08
+ "00110011", -- | ## ##| 09
+ "01100110", -- | ## ## | 10
+ "11001100", -- |## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 188 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100000", -- | ## | 02
+ "11100000", -- |### | 03
+ "01100011", -- | ## ##| 04
+ "01100110", -- | ## ## | 05
+ "01101100", -- | ## ## | 06
+ "00011000", -- | ## | 07
+ "00110111", -- | ## ###| 08
+ "01101111", -- | ## ####| 09
+ "11011011", -- |## ## ##| 10
+ "00011111", -- | #####| 11
+ "00000011", -- | ##| 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 189 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100000", -- | ## | 02
+ "11100000", -- |### | 03
+ "01100011", -- | ## ##| 04
+ "01100110", -- | ## ## | 05
+ "01101100", -- | ## ## | 06
+ "00011000", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100011", -- | ## ##| 09
+ "11000110", -- |## ## | 10
+ "00001100", -- | ## | 11
+ "00001111", -- | ####| 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 190 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "11100000", -- |### | 02
+ "00110000", -- | ## | 03
+ "01100011", -- | ## ##| 04
+ "00110110", -- | ## ## | 05
+ "11101100", -- |### ## | 06
+ "00011000", -- | ## | 07
+ "00110111", -- | ## ###| 08
+ "01101111", -- | ## ####| 09
+ "11011011", -- |## ## ##| 10
+ "00011111", -- | #####| 11
+ "00000011", -- | ##| 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 191 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00000000", -- | | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00110000", -- | ## | 11
+ "01100110", -- | ## ## | 12
+ "01100110", -- | ## ## | 13
+ "00111100", -- | #### | 14
+ -- ASCII 192 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 193 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 194 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 195 ---------------
+ "00111011", -- | ### ##| 00
+ "01101110", -- | ## ### | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 196 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 197 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00111100", -- | #### | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 198 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001111", -- | ####| 03
+ "00011100", -- | ### | 04
+ "00111100", -- | #### | 05
+ "01101100", -- | ## ## | 06
+ "01101111", -- | ## ####| 07
+ "01111100", -- | ##### | 08
+ "01101100", -- | ## ## | 09
+ "01101100", -- | ## ## | 10
+ "01101111", -- | ## ####| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 199 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00111000", -- | ### | 14
+ -- ASCII 200 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 201 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 202 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 203 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 204 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 205 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 206 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 207 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 208 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111000", -- | #### | 03
+ "01101100", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "11110110", -- |#### ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01101100", -- | ## ## | 10
+ "01111000", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 209 ---------------
+ "00111011", -- | ### ##| 00
+ "01101110", -- | ## ### | 01
+ "00000000", -- | | 02
+ "01100011", -- | ## ##| 03
+ "01100011", -- | ## ##| 04
+ "01110011", -- | ### ##| 05
+ "01111011", -- | #### ##| 06
+ "01101111", -- | ## ####| 07
+ "01100111", -- | ## ###| 08
+ "01100011", -- | ## ##| 09
+ "01100011", -- | ## ##| 10
+ "01100011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 210 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 211 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 212 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 213 ---------------
+ "00111011", -- | ### ##| 00
+ "01101110", -- | ## ### | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 214 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 215 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "01000010", -- | # # | 04
+ "01100110", -- | ## ## | 05
+ "00111100", -- | #### | 06
+ "00011000", -- | ## | 07
+ "00111100", -- | #### | 08
+ "01100110", -- | ## ## | 09
+ "01000010", -- | # # | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 216 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111110", -- | ##### | 03
+ "01100110", -- | ## ## | 04
+ "01101110", -- | ## ### | 05
+ "01101110", -- | ## ### | 06
+ "01111110", -- | ###### | 07
+ "01110110", -- | ### ## | 08
+ "01110110", -- | ### ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 217 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 218 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 219 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 220 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 221 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "00111100", -- | #### | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 222 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01111100", -- | ##### | 09
+ "01100000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 223 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111000", -- | ### | 03
+ "01101100", -- | ## ## | 04
+ "01101100", -- | ## ## | 05
+ "01101100", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01101100", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 224 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 225 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 226 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 227 ---------------
+ "00000000", -- | | 00
+ "01110001", -- | ### #| 01
+ "11011011", -- |## ## ##| 02
+ "10001110", -- |# ### | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 228 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 229 ---------------
+ "00000000", -- | | 00
+ "00111100", -- | #### | 01
+ "01100110", -- | ## ## | 02
+ "00111100", -- | #### | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 230 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01101110", -- | ## ### | 05
+ "00011011", -- | ## ##| 06
+ "00011011", -- | ## ##| 07
+ "01111111", -- | #######| 08
+ "11011000", -- |## ## | 09
+ "11011000", -- |## ## | 10
+ "01110111", -- | ### ###| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 231 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00111000", -- | ### | 14
+ -- ASCII 232 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 233 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 234 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 235 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 236 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 237 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 238 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 239 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 240 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110110", -- | ## ## | 03
+ "00011000", -- | ## | 04
+ "01101100", -- | ## ## | 05
+ "00011110", -- | #### | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 241 ---------------
+ "00000000", -- | | 00
+ "01110001", -- | ### #| 01
+ "11011011", -- |## ## ##| 02
+ "10001110", -- |# ### | 03
+ "00000000", -- | | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 242 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 243 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 244 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 245 ---------------
+ "00000000", -- | | 00
+ "01110001", -- | ### #| 01
+ "11011011", -- |## ## ##| 02
+ "10001110", -- |# ### | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 246 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 247 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00000000", -- | | 06
+ "01111110", -- | ###### | 07
+ "00000000", -- | | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 248 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01101110", -- | ## ### | 07
+ "01111110", -- | ###### | 08
+ "01110110", -- | ### ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 249 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 250 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 251 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 252 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 253 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "11110000", -- |#### | 14
+ -- ASCII 254 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01111100", -- | ##### | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "01100000", -- | ## | 12
+ "01100000", -- | ## | 13
+ "01100000", -- | ## | 14
+ -- ASCII 255 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "11110000", -- |#### | 14
+ -- ASCII 256 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 257 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 258 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 259 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 260 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 261 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 262 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 263 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 264 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 265 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 266 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 267 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 268 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 269 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 270 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 271 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 272 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 273 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 274 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 275 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 276 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 277 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 278 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 279 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 280 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 281 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 282 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 283 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 284 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 285 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 286 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- ASCII 287 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ -- Padding ---------------
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000", -- Padded
+ "00000000" -- Padded
+ );
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+
+end RTL;
+
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_8x16.vhd b/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_8x16.vhd
new file mode 100644
index 0000000..e46151c
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_8x16.vhd
@@ -0,0 +1,4382 @@
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port
+ (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(7 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(7 downto 0);
+ constant ROM : ROM_ARRAY :=
+ (
+ -- ASCII 032 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 033 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "00111100", -- | #### | 05
+ "00111100", -- | #### | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00000000", -- | | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 034 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 035 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110110", -- | ## ## | 03
+ "00110110", -- | ## ## | 04
+ "01111111", -- | #######| 05
+ "00110110", -- | ## ## | 06
+ "00110110", -- | ## ## | 07
+ "00110110", -- | ## ## | 08
+ "01111111", -- | #######| 09
+ "00110110", -- | ## ## | 10
+ "00110110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 036 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00011000", -- | ## | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00000110", -- | ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00011000", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 037 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01110000", -- | ### | 02
+ "11011000", -- |## ## | 03
+ "11011010", -- |## ## # | 04
+ "01110110", -- | ### ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "01101110", -- | ## ### | 09
+ "01011011", -- | # ## ##| 10
+ "00011011", -- | ## ##| 11
+ "00001110", -- | ### | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 038 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "11111111", -- |########| 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 039 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 040 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001100", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00110000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 041 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00110000", -- | ## | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 042 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00110110", -- | ## ## | 05
+ "00011100", -- | ### | 06
+ "01111111", -- | #######| 07
+ "00011100", -- | ### | 08
+ "00110110", -- | ## ## | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 043 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "01111110", -- | ###### | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 044 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011100", -- | ### | 10
+ "00011100", -- | ### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 045 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "01111110", -- | ###### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 046 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011100", -- | ### | 10
+ "00011100", -- | ### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 047 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000110", -- | ## | 03
+ "00000110", -- | ## | 04
+ "00001100", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "01100000", -- | ## | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 048 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011110", -- | #### | 03
+ "00110011", -- | ## ##| 04
+ "00110111", -- | ## ###| 05
+ "00110111", -- | ## ###| 06
+ "00110011", -- | ## ##| 07
+ "00111011", -- | ### ##| 08
+ "00111011", -- | ### ##| 09
+ "00110011", -- | ## ##| 10
+ "00011110", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 049 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001100", -- | ## | 03
+ "00011100", -- | ### | 04
+ "01111100", -- | ##### | 05
+ "00001100", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00001100", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 050 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00000110", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 051 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00000110", -- | ## | 06
+ "00011100", -- | ### | 07
+ "00000110", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 052 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110000", -- | ## | 03
+ "00110000", -- | ## | 04
+ "00110110", -- | ## ## | 05
+ "00110110", -- | ## ## | 06
+ "00110110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01111111", -- | #######| 09
+ "00000110", -- | ## | 10
+ "00000110", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 053 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "00000110", -- | ## | 08
+ "00000110", -- | ## | 09
+ "00001100", -- | ## | 10
+ "01111000", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 054 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011100", -- | ### | 03
+ "00011000", -- | ## | 04
+ "00110000", -- | ## | 05
+ "01111100", -- | ##### | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 055 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "00000110", -- | ## | 04
+ "00001100", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00110000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 056 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01110110", -- | ### ## | 06
+ "00111100", -- | #### | 07
+ "01101110", -- | ## ### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 057 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "00111110", -- | ##### | 08
+ "00001100", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111000", -- | ### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 058 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00011100", -- | ### | 05
+ "00011100", -- | ### | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011100", -- | ### | 10
+ "00011100", -- | ### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 059 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00011100", -- | ### | 05
+ "00011100", -- | ### | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011100", -- | ### | 10
+ "00011100", -- | ### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 060 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000110", -- | ## | 03
+ "00001100", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00000110", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 061 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "01111110", -- | ###### | 06
+ "00000000", -- | | 07
+ "01111110", -- | ###### | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 062 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "00110000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 063 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00000000", -- | | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 064 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "11000011", -- |## ##| 04
+ "11000011", -- |## ##| 05
+ "11001111", -- |## ####| 06
+ "11011011", -- |## ## ##| 07
+ "11011011", -- |## ## ##| 08
+ "11001111", -- |## ####| 09
+ "11000000", -- |## | 10
+ "01111111", -- | #######| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 065 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 066 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111100", -- | ##### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01111100", -- | ##### | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 067 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 068 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111000", -- | #### | 03
+ "01101100", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01101100", -- | ## ## | 10
+ "01111000", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 069 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 070 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 071 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "01101110", -- | ## ### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 072 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01111110", -- | ###### | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 073 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 074 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000110", -- | ## | 03
+ "00000110", -- | ## | 04
+ "00000110", -- | ## | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00000110", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 075 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01101100", -- | ## ## | 05
+ "01101100", -- | ## ## | 06
+ "01111000", -- | #### | 07
+ "01101100", -- | ## ## | 08
+ "01101100", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 076 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 077 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100011", -- | ## ##| 03
+ "01100011", -- | ## ##| 04
+ "01110111", -- | ### ###| 05
+ "01101011", -- | ## # ##| 06
+ "01101011", -- | ## # ##| 07
+ "01101011", -- | ## # ##| 08
+ "01100011", -- | ## ##| 09
+ "01100011", -- | ## ##| 10
+ "01100011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 078 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100011", -- | ## ##| 03
+ "01100011", -- | ## ##| 04
+ "01110011", -- | ### ##| 05
+ "01111011", -- | #### ##| 06
+ "01101111", -- | ## ####| 07
+ "01100111", -- | ## ###| 08
+ "01100011", -- | ## ##| 09
+ "01100011", -- | ## ##| 10
+ "01100011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 079 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 080 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111100", -- | ##### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 081 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00001100", -- | ## | 12
+ "00000110", -- | ## | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 082 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111100", -- | ##### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01111100", -- | ##### | 07
+ "01101100", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 083 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00000110", -- | ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 084 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 085 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 086 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "00111100", -- | #### | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 087 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100011", -- | ## ##| 03
+ "01100011", -- | ## ##| 04
+ "01100011", -- | ## ##| 05
+ "01101011", -- | ## # ##| 06
+ "01101011", -- | ## # ##| 07
+ "01101011", -- | ## # ##| 08
+ "00110110", -- | ## ## | 09
+ "00110110", -- | ## ## | 10
+ "00110110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 088 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "00110100", -- | ## # | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00101100", -- | # ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 089 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "00111100", -- | #### | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 090 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "00000110", -- | ## | 04
+ "00000110", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 091 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00110000", -- | ## | 04
+ "00110000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00110000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00110000", -- | ## | 11
+ "00110000", -- | ## | 12
+ "00110000", -- | ## | 13
+ "00111100", -- | #### | 14
+ "00000000", -- | | 15
+ -- ASCII 092 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "00110000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00000110", -- | ## | 11
+ "00000110", -- | ## | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 093 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00001100", -- | ## | 04
+ "00001100", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00001100", -- | ## | 11
+ "00001100", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00111100", -- | #### | 14
+ "00000000", -- | | 15
+ -- ASCII 094 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 095 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "11111111", -- |########| 14
+ "00000000", -- | | 15
+ -- ASCII 096 ---------------
+ "00000000", -- | | 00
+ "00111000", -- | ### | 01
+ "00011000", -- | ## | 02
+ "00001100", -- | ## | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 097 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 098 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 099 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 100 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000110", -- | ## | 03
+ "00000110", -- | ## | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 101 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 102 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011110", -- | #### | 03
+ "00110000", -- | ## | 04
+ "00110000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "01111110", -- | ###### | 07
+ "00110000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00110000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 103 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000110", -- | ## | 12
+ "00000110", -- | ## | 13
+ "01111100", -- | ##### | 14
+ "00000000", -- | | 15
+ -- ASCII 104 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 105 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00011000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 106 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00001100", -- | ## | 02
+ "00001100", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00001100", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00001100", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00001100", -- | ## | 10
+ "00001100", -- | ## | 11
+ "00001100", -- | ## | 12
+ "00001100", -- | ## | 13
+ "01111000", -- | #### | 14
+ "00000000", -- | | 15
+ -- ASCII 107 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01101100", -- | ## ## | 07
+ "01111000", -- | #### | 08
+ "01101100", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 108 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111000", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 109 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01111110", -- | ###### | 05
+ "01101011", -- | ## # ##| 06
+ "01101011", -- | ## # ##| 07
+ "01101011", -- | ## # ##| 08
+ "01101011", -- | ## # ##| 09
+ "01101011", -- | ## # ##| 10
+ "01100011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 110 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 111 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 112 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "01100000", -- | ## | 12
+ "01100000", -- | ## | 13
+ "01100000", -- | ## | 14
+ "00000000", -- | | 15
+ -- ASCII 113 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000110", -- | ## | 12
+ "00000110", -- | ## | 13
+ "00000110", -- | ## | 14
+ "00000000", -- | | 15
+ -- ASCII 114 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01101110", -- | ## ### | 06
+ "01110000", -- | ### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 115 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111110", -- | ##### | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "00111100", -- | #### | 08
+ "00000110", -- | ## | 09
+ "00000110", -- | ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 116 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110000", -- | ## | 03
+ "00110000", -- | ## | 04
+ "01111110", -- | ###### | 05
+ "00110000", -- | ## | 06
+ "00110000", -- | ## | 07
+ "00110000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00110000", -- | ## | 10
+ "00011110", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 117 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 118 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "00111100", -- | #### | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 119 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100011", -- | ## ##| 05
+ "01101011", -- | ## # ##| 06
+ "01101011", -- | ## # ##| 07
+ "01101011", -- | ## # ##| 08
+ "01101011", -- | ## # ##| 09
+ "00110110", -- | ## ## | 10
+ "00110110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 120 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "00111100", -- | #### | 07
+ "00011000", -- | ## | 08
+ "00111100", -- | #### | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 121 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "11110000", -- |#### | 14
+ "00000000", -- | | 15
+ -- ASCII 122 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01111110", -- | ###### | 05
+ "00000110", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 123 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001100", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00110000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "00110000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 124 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00011000", -- | ## | 14
+ "00000000", -- | | 15
+ -- ASCII 125 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00001100", -- | ## | 07
+ "00000110", -- | ## | 08
+ "00001100", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00110000", -- | ## | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 126 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01110001", -- | ### #| 03
+ "11011011", -- |## ## ##| 04
+ "10001110", -- |# ### | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 127 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 128 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 129 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 130 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 131 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 132 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 133 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 134 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 135 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 136 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 137 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 138 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 139 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 140 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 141 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 142 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 143 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 144 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 145 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001100", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011100", -- | ### | 05
+ "00011100", -- | ### | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 146 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011100", -- | ### | 03
+ "00011100", -- | ### | 04
+ "00001100", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 147 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 148 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 149 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 150 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 151 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 152 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 153 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 154 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 155 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 156 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 157 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 158 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 159 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01111110", -- | ###### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "01111110", -- | ###### | 08
+ "01111110", -- | ###### | 09
+ "01111110", -- | ###### | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 160 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 161 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00000000", -- | | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00111100", -- | #### | 12
+ "00111100", -- | #### | 13
+ "00011000", -- | ## | 14
+ "00000000", -- | | 15
+ -- ASCII 162 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "00111100", -- | #### | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 163 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "11111100", -- |###### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "11000000", -- |## | 10
+ "11111110", -- |####### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 164 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "01100110", -- | ## ## | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "00111100", -- | #### | 08
+ "01100110", -- | ## ## | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 165 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "00111100", -- | #### | 06
+ "01111110", -- | ###### | 07
+ "00011000", -- | ## | 08
+ "01111110", -- | ###### | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 166 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00011000", -- | ## | 12
+ "00011000", -- | ## | 13
+ "00011000", -- | ## | 14
+ "00000000", -- | | 15
+ -- ASCII 167 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100000", -- | ## | 05
+ "00111000", -- | ### | 06
+ "00111100", -- | #### | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "00111100", -- | #### | 10
+ "00011100", -- | ### | 11
+ "00000110", -- | ## | 12
+ "01100110", -- | ## ## | 13
+ "00111100", -- | #### | 14
+ "00000000", -- | | 15
+ -- ASCII 168 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 169 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "11000011", -- |## ##| 04
+ "10011001", -- |# ## #| 05
+ "10100101", -- |# # # #| 06
+ "10100001", -- |# # #| 07
+ "10100101", -- |# # # #| 08
+ "10011001", -- |# ## #| 09
+ "11000011", -- |## ##| 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 170 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00000110", -- | ## | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "00111110", -- | ##### | 07
+ "00000000", -- | | 08
+ "01111110", -- | ###### | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 171 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00110011", -- | ## ##| 07
+ "01100110", -- | ## ## | 08
+ "11001100", -- |## ## | 09
+ "01100110", -- | ## ## | 10
+ "00110011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 172 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "01111110", -- | ###### | 07
+ "00000110", -- | ## | 08
+ "00000110", -- | ## | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 173 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "01111110", -- | ###### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 174 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "11000011", -- |## ##| 04
+ "10111001", -- |# ### #| 05
+ "10100101", -- |# # # #| 06
+ "10100101", -- |# # # #| 07
+ "10111001", -- |# ### #| 08
+ "10100101", -- |# # # #| 09
+ "11000011", -- |## ##| 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 175 ---------------
+ "11111111", -- |########| 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 176 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "00111100", -- | #### | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 177 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "01111110", -- | ###### | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00000000", -- | | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 178 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111000", -- | ### | 03
+ "00001100", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00110000", -- | ## | 06
+ "00111100", -- | #### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 179 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111000", -- | ### | 03
+ "00001100", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00001100", -- | ## | 06
+ "00111000", -- | ### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 180 ---------------
+ "00000000", -- | | 00
+ "00011100", -- | ### | 01
+ "00011000", -- | ## | 02
+ "00110000", -- | ## | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 181 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111011", -- | #### ##| 11
+ "01100000", -- | ## | 12
+ "01100000", -- | ## | 13
+ "11000000", -- |## | 14
+ "00000000", -- | | 15
+ -- ASCII 182 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011111", -- | #####| 03
+ "00111110", -- | ##### | 04
+ "01111110", -- | ###### | 05
+ "01111110", -- | ###### | 06
+ "01111110", -- | ###### | 07
+ "00111110", -- | ##### | 08
+ "00011110", -- | #### | 09
+ "00000110", -- | ## | 10
+ "00000110", -- | ## | 11
+ "00000110", -- | ## | 12
+ "00000110", -- | ## | 13
+ "00000110", -- | ## | 14
+ "00000000", -- | | 15
+ -- ASCII 183 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00011100", -- | ### | 06
+ "00011100", -- | ### | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 184 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00111000", -- | ### | 14
+ "00000000", -- | | 15
+ -- ASCII 185 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111000", -- | ### | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 186 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "00111100", -- | #### | 07
+ "00000000", -- | | 08
+ "01111110", -- | ###### | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 187 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "11001100", -- |## ## | 07
+ "01100110", -- | ## ## | 08
+ "00110011", -- | ## ##| 09
+ "01100110", -- | ## ## | 10
+ "11001100", -- |## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 188 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100000", -- | ## | 02
+ "11100000", -- |### | 03
+ "01100011", -- | ## ##| 04
+ "01100110", -- | ## ## | 05
+ "01101100", -- | ## ## | 06
+ "00011000", -- | ## | 07
+ "00110111", -- | ## ###| 08
+ "01101111", -- | ## ####| 09
+ "11011011", -- |## ## ##| 10
+ "00011111", -- | #####| 11
+ "00000011", -- | ##| 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 189 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100000", -- | ## | 02
+ "11100000", -- |### | 03
+ "01100011", -- | ## ##| 04
+ "01100110", -- | ## ## | 05
+ "01101100", -- | ## ## | 06
+ "00011000", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100011", -- | ## ##| 09
+ "11000110", -- |## ## | 10
+ "00001100", -- | ## | 11
+ "00001111", -- | ####| 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 190 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "11100000", -- |### | 02
+ "00110000", -- | ## | 03
+ "01100011", -- | ## ##| 04
+ "00110110", -- | ## ## | 05
+ "11101100", -- |### ## | 06
+ "00011000", -- | ## | 07
+ "00110111", -- | ## ###| 08
+ "01101111", -- | ## ####| 09
+ "11011011", -- |## ## ##| 10
+ "00011111", -- | #####| 11
+ "00000011", -- | ##| 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 191 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00000000", -- | | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00110000", -- | ## | 11
+ "01100110", -- | ## ## | 12
+ "01100110", -- | ## ## | 13
+ "00111100", -- | #### | 14
+ "00000000", -- | | 15
+ -- ASCII 192 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 193 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 194 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 195 ---------------
+ "00111011", -- | ### ##| 00
+ "01101110", -- | ## ### | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 196 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 197 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00111100", -- | #### | 02
+ "00011000", -- | ## | 03
+ "00111100", -- | #### | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 198 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00001111", -- | ####| 03
+ "00011100", -- | ### | 04
+ "00111100", -- | #### | 05
+ "01101100", -- | ## ## | 06
+ "01101111", -- | ## ####| 07
+ "01111100", -- | ##### | 08
+ "01101100", -- | ## ## | 09
+ "01101100", -- | ## ## | 10
+ "01101111", -- | ## ####| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 199 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100000", -- | ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00111000", -- | ### | 14
+ "00000000", -- | | 15
+ -- ASCII 200 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 201 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 202 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 203 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "01111110", -- | ###### | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01100000", -- | ## | 06
+ "01111100", -- | ##### | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 204 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 205 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 206 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 207 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 208 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01111000", -- | #### | 03
+ "01101100", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "11110110", -- |#### ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01101100", -- | ## ## | 10
+ "01111000", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 209 ---------------
+ "00111011", -- | ### ##| 00
+ "01101110", -- | ## ### | 01
+ "00000000", -- | | 02
+ "01100011", -- | ## ##| 03
+ "01100011", -- | ## ##| 04
+ "01110011", -- | ### ##| 05
+ "01111011", -- | #### ##| 06
+ "01101111", -- | ## ####| 07
+ "01100111", -- | ## ###| 08
+ "01100011", -- | ## ##| 09
+ "01100011", -- | ## ##| 10
+ "01100011", -- | ## ##| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 210 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 211 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 212 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 213 ---------------
+ "00111011", -- | ### ##| 00
+ "01101110", -- | ## ### | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 214 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "00111100", -- | #### | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 215 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "01000010", -- | # # | 04
+ "01100110", -- | ## ## | 05
+ "00111100", -- | #### | 06
+ "00011000", -- | ## | 07
+ "00111100", -- | #### | 08
+ "01100110", -- | ## ## | 09
+ "01000010", -- | # # | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 216 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111110", -- | ##### | 03
+ "01100110", -- | ## ## | 04
+ "01101110", -- | ## ### | 05
+ "01101110", -- | ## ### | 06
+ "01111110", -- | ###### | 07
+ "01110110", -- | ### ## | 08
+ "01110110", -- | ### ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 217 ---------------
+ "00110000", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 218 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 219 ---------------
+ "00111100", -- | #### | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 220 ---------------
+ "01100110", -- | ## ## | 00
+ "01100110", -- | ## ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 221 ---------------
+ "00001100", -- | ## | 00
+ "00011000", -- | ## | 01
+ "00000000", -- | | 02
+ "01100110", -- | ## ## | 03
+ "01100110", -- | ## ## | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "00111100", -- | #### | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00011000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 222 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01111100", -- | ##### | 09
+ "01100000", -- | ## | 10
+ "01100000", -- | ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 223 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00111000", -- | ### | 03
+ "01101100", -- | ## ## | 04
+ "01101100", -- | ## ## | 05
+ "01101100", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01101100", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 224 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 225 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 226 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 227 ---------------
+ "00000000", -- | | 00
+ "01110001", -- | ### #| 01
+ "11011011", -- |## ## ##| 02
+ "10001110", -- |# ### | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 228 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 229 ---------------
+ "00000000", -- | | 00
+ "00111100", -- | #### | 01
+ "01100110", -- | ## ## | 02
+ "00111100", -- | #### | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "00000110", -- | ## | 06
+ "00000110", -- | ## | 07
+ "00111110", -- | ##### | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 230 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "01101110", -- | ## ### | 05
+ "00011011", -- | ## ##| 06
+ "00011011", -- | ## ##| 07
+ "01111111", -- | #######| 08
+ "11011000", -- |## ## | 09
+ "11011000", -- |## ## | 10
+ "01110111", -- | ### ###| 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 231 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100000", -- | ## | 07
+ "01100000", -- | ## | 08
+ "01100000", -- | ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00011000", -- | ## | 12
+ "00001100", -- | ## | 13
+ "00111000", -- | ### | 14
+ "00000000", -- | | 15
+ -- ASCII 232 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 233 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 234 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 235 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01111110", -- | ###### | 08
+ "01100000", -- | ## | 09
+ "01100000", -- | ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 236 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 237 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 238 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 239 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01111000", -- | #### | 05
+ "00011000", -- | ## | 06
+ "00011000", -- | ## | 07
+ "00011000", -- | ## | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "01111110", -- | ###### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 240 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00110110", -- | ## ## | 03
+ "00011000", -- | ## | 04
+ "01101100", -- | ## ## | 05
+ "00011110", -- | #### | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 241 ---------------
+ "00000000", -- | | 00
+ "01110001", -- | ### #| 01
+ "11011011", -- |## ## ##| 02
+ "10001110", -- |# ### | 03
+ "00000000", -- | | 04
+ "01111100", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01100110", -- | ## ## | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 242 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 243 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 244 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 245 ---------------
+ "00000000", -- | | 00
+ "01110001", -- | ### #| 01
+ "11011011", -- |## ## ##| 02
+ "10001110", -- |# ### | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 246 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "00111100", -- | #### | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 247 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00011000", -- | ## | 04
+ "00011000", -- | ## | 05
+ "00000000", -- | | 06
+ "01111110", -- | ###### | 07
+ "00000000", -- | | 08
+ "00011000", -- | ## | 09
+ "00011000", -- | ## | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 248 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00111110", -- | ##### | 05
+ "01100110", -- | ## ## | 06
+ "01101110", -- | ## ### | 07
+ "01111110", -- | ###### | 08
+ "01110110", -- | ### ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 249 ---------------
+ "00000000", -- | | 00
+ "01110000", -- | ### | 01
+ "00110000", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 250 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 251 ---------------
+ "00000000", -- | | 00
+ "00011000", -- | ## | 01
+ "00111100", -- | #### | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 252 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111110", -- | ##### | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 253 ---------------
+ "00000000", -- | | 00
+ "00001110", -- | ### | 01
+ "00001100", -- | ## | 02
+ "00011000", -- | ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "11110000", -- |#### | 14
+ "00000000", -- | | 15
+ -- ASCII 254 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "01100000", -- | ## | 03
+ "01100000", -- | ## | 04
+ "01100000", -- | ## | 05
+ "01111100", -- | ##### | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "01111100", -- | ##### | 11
+ "01100000", -- | ## | 12
+ "01100000", -- | ## | 13
+ "01100000", -- | ## | 14
+ "00000000", -- | | 15
+ -- ASCII 255 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "01100110", -- | ## ## | 02
+ "01100110", -- | ## ## | 03
+ "00000000", -- | | 04
+ "01100110", -- | ## ## | 05
+ "01100110", -- | ## ## | 06
+ "01100110", -- | ## ## | 07
+ "01100110", -- | ## ## | 08
+ "01100110", -- | ## ## | 09
+ "01100110", -- | ## ## | 10
+ "00111100", -- | #### | 11
+ "00001100", -- | ## | 12
+ "00011000", -- | ## | 13
+ "11110000", -- |#### | 14
+ "00000000", -- | | 15
+ -- ASCII 256 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 257 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 258 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 259 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 260 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 261 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 262 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 263 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 264 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 265 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 266 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 267 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 268 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 269 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 270 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 271 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 272 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 273 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 274 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 275 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 276 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 277 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 278 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 279 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 280 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 281 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 282 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 283 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 284 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 285 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 286 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "00000000", -- | | 12
+ "00000000", -- | | 13
+ "00000000", -- | | 14
+ "00000000", -- | | 15
+ -- ASCII 287 ---------------
+ "00000000", -- | | 00
+ "00000000", -- | | 01
+ "00000000", -- | | 02
+ "00000000", -- | | 03
+ "00000000", -- | | 04
+ "00000000", -- | | 05
+ "00000000", -- | | 06
+ "00000000", -- | | 07
+ "00000000", -- | | 08
+ "00000000", -- | | 09
+ "00000000", -- | | 10
+ "00000000", -- | | 11
+ "11111111", -- |########| 12
+ "11111111", -- |########| 13
+ "11111111", -- |########| 14
+ "00000000" -- | | 15
+ );
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+
+end RTL;
+
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_9x16.vhd b/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_9x16.vhd
new file mode 100644
index 0000000..9b32d16
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_fixedsys_9x16.vhd
@@ -0,0 +1,4351 @@
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port
+ (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(8 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(8 downto 0);
+ constant ROM : ROM_ARRAY :=
+ (
+ -- ASCII 032 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 033 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "001111000", -- | #### | 04
+ "001111000", -- | #### | 05
+ "001111000", -- | #### | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000000000", -- | | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 034 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 035 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001101100", -- | ## ## | 03
+ "001101100", -- | ## ## | 04
+ "011111110", -- | ####### | 05
+ "001101100", -- | ## ## | 06
+ "001101100", -- | ## ## | 07
+ "001101100", -- | ## ## | 08
+ "011111110", -- | ####### | 09
+ "001101100", -- | ## ## | 10
+ "001101100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 036 ---------------
+ "000000000", -- | | 00
+ "000110000", -- | ## | 01
+ "000110000", -- | ## | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011000000", -- | ## | 05
+ "001100000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000011000", -- | ## | 08
+ "000001100", -- | ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000110000", -- | ## | 12
+ "000110000", -- | ## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 037 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011100000", -- | ### | 02
+ "110110000", -- |## ## | 03
+ "110110100", -- |## ## # | 04
+ "011101100", -- | ### ## | 05
+ "000011000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "001100000", -- | ## | 08
+ "011011100", -- | ## ### | 09
+ "010110110", -- | # ## ## | 10
+ "000110110", -- | ## ## | 11
+ "000011100", -- | ### | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 038 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "111111110", -- |######## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 039 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 040 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000011000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "001100000", -- | ## | 06
+ "001100000", -- | ## | 07
+ "001100000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "001100000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000110000", -- | ## | 12
+ "000011000", -- | ## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 041 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001100000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000011000", -- | ## | 06
+ "000011000", -- | ## | 07
+ "000011000", -- | ## | 08
+ "000011000", -- | ## | 09
+ "000011000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000110000", -- | ## | 12
+ "001100000", -- | ## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 042 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001101100", -- | ## ## | 05
+ "000111000", -- | ### | 06
+ "011111110", -- | ####### | 07
+ "000111000", -- | ### | 08
+ "001101100", -- | ## ## | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 043 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "011111100", -- | ###### | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 044 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000111000", -- | ### | 10
+ "000111000", -- | ### | 11
+ "000011000", -- | ## | 12
+ "000110000", -- | ## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 045 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "011111100", -- | ###### | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 046 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000111000", -- | ### | 10
+ "000111000", -- | ### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 047 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000001100", -- | ## | 03
+ "000001100", -- | ## | 04
+ "000011000", -- | ## | 05
+ "000011000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "001100000", -- | ## | 10
+ "011000000", -- | ## | 11
+ "011000000", -- | ## | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 048 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000111100", -- | #### | 03
+ "001100110", -- | ## ## | 04
+ "001101110", -- | ## ### | 05
+ "001101110", -- | ## ### | 06
+ "001100110", -- | ## ## | 07
+ "001110110", -- | ### ## | 08
+ "001110110", -- | ### ## | 09
+ "001100110", -- | ## ## | 10
+ "000111100", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 049 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000011000", -- | ## | 03
+ "000111000", -- | ### | 04
+ "011111000", -- | ##### | 05
+ "000011000", -- | ## | 06
+ "000011000", -- | ## | 07
+ "000011000", -- | ## | 08
+ "000011000", -- | ## | 09
+ "000011000", -- | ## | 10
+ "000011000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 050 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "000001100", -- | ## | 06
+ "000011000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 051 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "000001100", -- | ## | 06
+ "000111000", -- | ### | 07
+ "000001100", -- | ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 052 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001100000", -- | ## | 03
+ "001100000", -- | ## | 04
+ "001101100", -- | ## ## | 05
+ "001101100", -- | ## ## | 06
+ "001101100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011111110", -- | ####### | 09
+ "000001100", -- | ## | 10
+ "000001100", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 053 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "011111000", -- | ##### | 07
+ "000001100", -- | ## | 08
+ "000001100", -- | ## | 09
+ "000011000", -- | ## | 10
+ "011110000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 054 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000111000", -- | ### | 03
+ "000110000", -- | ## | 04
+ "001100000", -- | ## | 05
+ "011111000", -- | ##### | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 055 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "000001100", -- | ## | 04
+ "000011000", -- | ## | 05
+ "000011000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "001100000", -- | ## | 10
+ "001100000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 056 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011101100", -- | ### ## | 06
+ "001111000", -- | #### | 07
+ "011011100", -- | ## ### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 057 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "001111100", -- | ##### | 08
+ "000011000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "001110000", -- | ### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 058 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000111000", -- | ### | 05
+ "000111000", -- | ### | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000111000", -- | ### | 10
+ "000111000", -- | ### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 059 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000111000", -- | ### | 05
+ "000111000", -- | ### | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000111000", -- | ### | 10
+ "000111000", -- | ### | 11
+ "000011000", -- | ## | 12
+ "000110000", -- | ## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 060 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000001100", -- | ## | 03
+ "000011000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "001100000", -- | ## | 06
+ "011000000", -- | ## | 07
+ "001100000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000011000", -- | ## | 10
+ "000001100", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 061 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "011111100", -- | ###### | 06
+ "000000000", -- | | 07
+ "011111100", -- | ###### | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 062 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000000", -- | ## | 03
+ "001100000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000011000", -- | ## | 06
+ "000001100", -- | ## | 07
+ "000011000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "001100000", -- | ## | 10
+ "011000000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 063 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "000011000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000000000", -- | | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 064 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "110000110", -- |## ## | 04
+ "110000110", -- |## ## | 05
+ "110011110", -- |## #### | 06
+ "110110110", -- |## ## ## | 07
+ "110110110", -- |## ## ## | 08
+ "110011110", -- |## #### | 09
+ "110000000", -- |## | 10
+ "011111110", -- | ####### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 065 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "001111000", -- | #### | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 066 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111000", -- | ##### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011111000", -- | ##### | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011111000", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 067 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011000000", -- | ## | 06
+ "011000000", -- | ## | 07
+ "011000000", -- | ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 068 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011110000", -- | #### | 03
+ "011011000", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011011000", -- | ## ## | 10
+ "011110000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 069 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "011111000", -- | ##### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 070 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "011111000", -- | ##### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011000000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 071 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011000000", -- | ## | 06
+ "011000000", -- | ## | 07
+ "011011100", -- | ## ### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 072 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011111100", -- | ###### | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 073 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 074 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000001100", -- | ## | 03
+ "000001100", -- | ## | 04
+ "000001100", -- | ## | 05
+ "000001100", -- | ## | 06
+ "000001100", -- | ## | 07
+ "000001100", -- | ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 075 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011011000", -- | ## ## | 05
+ "011011000", -- | ## ## | 06
+ "011110000", -- | #### | 07
+ "011011000", -- | ## ## | 08
+ "011011000", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 076 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000000", -- | ## | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "011000000", -- | ## | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 077 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000110", -- | ## ## | 03
+ "011000110", -- | ## ## | 04
+ "011101110", -- | ### ### | 05
+ "011010110", -- | ## # ## | 06
+ "011010110", -- | ## # ## | 07
+ "011010110", -- | ## # ## | 08
+ "011000110", -- | ## ## | 09
+ "011000110", -- | ## ## | 10
+ "011000110", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 078 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000110", -- | ## ## | 03
+ "011000110", -- | ## ## | 04
+ "011100110", -- | ### ## | 05
+ "011110110", -- | #### ## | 06
+ "011011110", -- | ## #### | 07
+ "011001110", -- | ## ### | 08
+ "011000110", -- | ## ## | 09
+ "011000110", -- | ## ## | 10
+ "011000110", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 079 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 080 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111000", -- | ##### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011111000", -- | ##### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011000000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 081 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000011000", -- | ## | 12
+ "000001100", -- | ## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 082 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111000", -- | ##### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011111000", -- | ##### | 07
+ "011011000", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 083 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011000000", -- | ## | 05
+ "001100000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000011000", -- | ## | 08
+ "000001100", -- | ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 084 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 085 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 086 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "001111000", -- | #### | 10
+ "000110000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 087 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000110", -- | ## ## | 03
+ "011000110", -- | ## ## | 04
+ "011000110", -- | ## ## | 05
+ "011010110", -- | ## # ## | 06
+ "011010110", -- | ## # ## | 07
+ "011010110", -- | ## # ## | 08
+ "001101100", -- | ## ## | 09
+ "001101100", -- | ## ## | 10
+ "001101100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 088 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "001101000", -- | ## # | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "001011000", -- | # ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 089 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "001111000", -- | #### | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 090 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "000001100", -- | ## | 04
+ "000001100", -- | ## | 05
+ "000011000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "001100000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 091 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "001100000", -- | ## | 04
+ "001100000", -- | ## | 05
+ "001100000", -- | ## | 06
+ "001100000", -- | ## | 07
+ "001100000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "001100000", -- | ## | 10
+ "001100000", -- | ## | 11
+ "001100000", -- | ## | 12
+ "001100000", -- | ## | 13
+ "001111000", -- | #### | 14
+ "000000000", -- | | 15
+ -- ASCII 092 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000000", -- | ## | 03
+ "011000000", -- | ## | 04
+ "001100000", -- | ## | 05
+ "001100000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000011000", -- | ## | 09
+ "000011000", -- | ## | 10
+ "000001100", -- | ## | 11
+ "000001100", -- | ## | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 093 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "000011000", -- | ## | 04
+ "000011000", -- | ## | 05
+ "000011000", -- | ## | 06
+ "000011000", -- | ## | 07
+ "000011000", -- | ## | 08
+ "000011000", -- | ## | 09
+ "000011000", -- | ## | 10
+ "000011000", -- | ## | 11
+ "000011000", -- | ## | 12
+ "000011000", -- | ## | 13
+ "001111000", -- | #### | 14
+ "000000000", -- | | 15
+ -- ASCII 094 ---------------
+ "000000000", -- | | 00
+ "000110000", -- | ## | 01
+ "001111000", -- | #### | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 095 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "111111110", -- |######## | 14
+ "000000000", -- | | 15
+ -- ASCII 096 ---------------
+ "000000000", -- | | 00
+ "001110000", -- | ### | 01
+ "000110000", -- | ## | 02
+ "000011000", -- | ## | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 097 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "000001100", -- | ## | 06
+ "000001100", -- | ## | 07
+ "001111100", -- | ##### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 098 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000000", -- | ## | 03
+ "011000000", -- | ## | 04
+ "011111000", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011111000", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 099 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011000000", -- | ## | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 100 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000001100", -- | ## | 03
+ "000001100", -- | ## | 04
+ "001111100", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 101 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 102 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000111100", -- | #### | 03
+ "001100000", -- | ## | 04
+ "001100000", -- | ## | 05
+ "001100000", -- | ## | 06
+ "011111100", -- | ###### | 07
+ "001100000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "001100000", -- | ## | 10
+ "001100000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 103 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111100", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000001100", -- | ## | 12
+ "000001100", -- | ## | 13
+ "011111000", -- | ##### | 14
+ "000000000", -- | | 15
+ -- ASCII 104 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000000", -- | ## | 03
+ "011000000", -- | ## | 04
+ "011111000", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 105 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000110000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "011110000", -- | #### | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 106 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000011000", -- | ## | 02
+ "000011000", -- | ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "000011000", -- | ## | 06
+ "000011000", -- | ## | 07
+ "000011000", -- | ## | 08
+ "000011000", -- | ## | 09
+ "000011000", -- | ## | 10
+ "000011000", -- | ## | 11
+ "000011000", -- | ## | 12
+ "000011000", -- | ## | 13
+ "011110000", -- | #### | 14
+ "000000000", -- | | 15
+ -- ASCII 107 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000000", -- | ## | 03
+ "011000000", -- | ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011011000", -- | ## ## | 07
+ "011110000", -- | #### | 08
+ "011011000", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 108 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011110000", -- | #### | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 109 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011111100", -- | ###### | 05
+ "011010110", -- | ## # ## | 06
+ "011010110", -- | ## # ## | 07
+ "011010110", -- | ## # ## | 08
+ "011010110", -- | ## # ## | 09
+ "011010110", -- | ## # ## | 10
+ "011000110", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 110 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011111000", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 111 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 112 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011111000", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011111000", -- | ##### | 11
+ "011000000", -- | ## | 12
+ "011000000", -- | ## | 13
+ "011000000", -- | ## | 14
+ "000000000", -- | | 15
+ -- ASCII 113 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111100", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000001100", -- | ## | 12
+ "000001100", -- | ## | 13
+ "000001100", -- | ## | 14
+ "000000000", -- | | 15
+ -- ASCII 114 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011011100", -- | ## ### | 06
+ "011100000", -- | ### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011000000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 115 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111100", -- | ##### | 05
+ "011000000", -- | ## | 06
+ "011000000", -- | ## | 07
+ "001111000", -- | #### | 08
+ "000001100", -- | ## | 09
+ "000001100", -- | ## | 10
+ "011111000", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 116 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001100000", -- | ## | 03
+ "001100000", -- | ## | 04
+ "011111100", -- | ###### | 05
+ "001100000", -- | ## | 06
+ "001100000", -- | ## | 07
+ "001100000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "001100000", -- | ## | 10
+ "000111100", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 117 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 118 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "001111000", -- | #### | 10
+ "000110000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 119 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011000110", -- | ## ## | 05
+ "011010110", -- | ## # ## | 06
+ "011010110", -- | ## # ## | 07
+ "011010110", -- | ## # ## | 08
+ "011010110", -- | ## # ## | 09
+ "001101100", -- | ## ## | 10
+ "001101100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 120 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "001111000", -- | #### | 07
+ "000110000", -- | ## | 08
+ "001111000", -- | #### | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 121 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000011000", -- | ## | 12
+ "000110000", -- | ## | 13
+ "111100000", -- |#### | 14
+ "000000000", -- | | 15
+ -- ASCII 122 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011111100", -- | ###### | 05
+ "000001100", -- | ## | 06
+ "000011000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 123 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000011000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "001100000", -- | ## | 07
+ "011000000", -- | ## | 08
+ "001100000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000110000", -- | ## | 12
+ "000011000", -- | ## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 124 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000110000", -- | ## | 12
+ "000110000", -- | ## | 13
+ "000110000", -- | ## | 14
+ "000000000", -- | | 15
+ -- ASCII 125 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001100000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000011000", -- | ## | 07
+ "000001100", -- | ## | 08
+ "000011000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000110000", -- | ## | 12
+ "001100000", -- | ## | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 126 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011100010", -- | ### # | 03
+ "110110110", -- |## ## ## | 04
+ "100011100", -- |# ### | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 127 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 128 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 129 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 130 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 131 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 132 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 133 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 134 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 135 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 136 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 137 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 138 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 139 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 140 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 141 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 142 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 143 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 144 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 145 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000011000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "000111000", -- | ### | 05
+ "000111000", -- | ### | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 146 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000111000", -- | ### | 03
+ "000111000", -- | ### | 04
+ "000011000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 147 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 148 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 149 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 150 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 151 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 152 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 153 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 154 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 155 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 156 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 157 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 158 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 159 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011111100", -- | ###### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "011111100", -- | ###### | 08
+ "011111100", -- | ###### | 09
+ "011111100", -- | ###### | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 160 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 161 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000000000", -- | | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "001111000", -- | #### | 12
+ "001111000", -- | #### | 13
+ "000110000", -- | ## | 14
+ "000000000", -- | | 15
+ -- ASCII 162 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011000000", -- | ## | 07
+ "011000000", -- | ## | 08
+ "011001100", -- | ## ## | 09
+ "001111000", -- | #### | 10
+ "000110000", -- | ## | 11
+ "000110000", -- | ## | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 163 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "111111000", -- |###### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "110000000", -- |## | 10
+ "111111100", -- |####### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 164 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "011001100", -- | ## ## | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "001111000", -- | #### | 08
+ "011001100", -- | ## ## | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 165 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "001111000", -- | #### | 06
+ "011111100", -- | ###### | 07
+ "000110000", -- | ## | 08
+ "011111100", -- | ###### | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 166 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000110000", -- | ## | 12
+ "000110000", -- | ## | 13
+ "000110000", -- | ## | 14
+ "000000000", -- | | 15
+ -- ASCII 167 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011000000", -- | ## | 05
+ "001110000", -- | ### | 06
+ "001111000", -- | #### | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "001111000", -- | #### | 10
+ "000111000", -- | ### | 11
+ "000001100", -- | ## | 12
+ "011001100", -- | ## ## | 13
+ "001111000", -- | #### | 14
+ "000000000", -- | | 15
+ -- ASCII 168 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011001100", -- | ## ## | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 169 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "110000110", -- |## ## | 04
+ "100110010", -- |# ## # | 05
+ "101001010", -- |# # # # | 06
+ "101000010", -- |# # # | 07
+ "101001010", -- |# # # # | 08
+ "100110010", -- |# ## # | 09
+ "110000110", -- |## ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 170 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "000001100", -- | ## | 04
+ "001111100", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "001111100", -- | ##### | 07
+ "000000000", -- | | 08
+ "011111100", -- | ###### | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 171 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "001100110", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "110011000", -- |## ## | 09
+ "011001100", -- | ## ## | 10
+ "001100110", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 172 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "011111100", -- | ###### | 07
+ "000001100", -- | ## | 08
+ "000001100", -- | ## | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 173 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "011111100", -- | ###### | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 174 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "110000110", -- |## ## | 04
+ "101110010", -- |# ### # | 05
+ "101001010", -- |# # # # | 06
+ "101001010", -- |# # # # | 07
+ "101110010", -- |# ### # | 08
+ "101001010", -- |# # # # | 09
+ "110000110", -- |## ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 175 ---------------
+ "111111110", -- |######## | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 176 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "001111000", -- | #### | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "001111000", -- | #### | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 177 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "011111100", -- | ###### | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000000000", -- | | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 178 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001110000", -- | ### | 03
+ "000011000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "001100000", -- | ## | 06
+ "001111000", -- | #### | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 179 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001110000", -- | ### | 03
+ "000011000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000011000", -- | ## | 06
+ "001110000", -- | ### | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 180 ---------------
+ "000000000", -- | | 00
+ "000111000", -- | ### | 01
+ "000110000", -- | ## | 02
+ "001100000", -- | ## | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 181 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011110110", -- | #### ## | 11
+ "011000000", -- | ## | 12
+ "011000000", -- | ## | 13
+ "110000000", -- |## | 14
+ "000000000", -- | | 15
+ -- ASCII 182 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000111110", -- | ##### | 03
+ "001111100", -- | ##### | 04
+ "011111100", -- | ###### | 05
+ "011111100", -- | ###### | 06
+ "011111100", -- | ###### | 07
+ "001111100", -- | ##### | 08
+ "000111100", -- | #### | 09
+ "000001100", -- | ## | 10
+ "000001100", -- | ## | 11
+ "000001100", -- | ## | 12
+ "000001100", -- | ## | 13
+ "000001100", -- | ## | 14
+ "000000000", -- | | 15
+ -- ASCII 183 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000111000", -- | ### | 06
+ "000111000", -- | ### | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 184 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "000000000", -- | | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000110000", -- | ## | 12
+ "000011000", -- | ## | 13
+ "001110000", -- | ### | 14
+ "000000000", -- | | 15
+ -- ASCII 185 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "001110000", -- | ### | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000000000", -- | | 08
+ "000000000", -- | | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 186 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "001111000", -- | #### | 07
+ "000000000", -- | | 08
+ "011111100", -- | ###### | 09
+ "000000000", -- | | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 187 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000000000", -- | | 06
+ "110011000", -- |## ## | 07
+ "011001100", -- | ## ## | 08
+ "001100110", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "110011000", -- |## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 188 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011000000", -- | ## | 02
+ "111000000", -- |### | 03
+ "011000110", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011011000", -- | ## ## | 06
+ "000110000", -- | ## | 07
+ "001101110", -- | ## ### | 08
+ "011011110", -- | ## #### | 09
+ "110110110", -- |## ## ## | 10
+ "000111110", -- | ##### | 11
+ "000000110", -- | ## | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 189 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011000000", -- | ## | 02
+ "111000000", -- |### | 03
+ "011000110", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011011000", -- | ## ## | 06
+ "000110000", -- | ## | 07
+ "001111100", -- | ##### | 08
+ "011000110", -- | ## ## | 09
+ "110001100", -- |## ## | 10
+ "000011000", -- | ## | 11
+ "000011110", -- | #### | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 190 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "111000000", -- |### | 02
+ "001100000", -- | ## | 03
+ "011000110", -- | ## ## | 04
+ "001101100", -- | ## ## | 05
+ "111011000", -- |### ## | 06
+ "000110000", -- | ## | 07
+ "001101110", -- | ## ### | 08
+ "011011110", -- | ## #### | 09
+ "110110110", -- |## ## ## | 10
+ "000111110", -- | ##### | 11
+ "000000110", -- | ## | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 191 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "000000000", -- | | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000000000", -- | | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "001100000", -- | ## | 11
+ "011001100", -- | ## ## | 12
+ "011001100", -- | ## ## | 13
+ "001111000", -- | #### | 14
+ "000000000", -- | | 15
+ -- ASCII 192 ---------------
+ "001100000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "001111000", -- | #### | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 193 ---------------
+ "000011000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "001111000", -- | #### | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 194 ---------------
+ "001111000", -- | #### | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "001111000", -- | #### | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 195 ---------------
+ "001110110", -- | ### ## | 00
+ "011011100", -- | ## ### | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "001111000", -- | #### | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 196 ---------------
+ "011001100", -- | ## ## | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "000110000", -- | ## | 03
+ "001111000", -- | #### | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 197 ---------------
+ "001111000", -- | #### | 00
+ "011001100", -- | ## ## | 01
+ "001111000", -- | #### | 02
+ "000110000", -- | ## | 03
+ "001111000", -- | #### | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 198 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000011110", -- | #### | 03
+ "000111000", -- | ### | 04
+ "001111000", -- | #### | 05
+ "011011000", -- | ## ## | 06
+ "011011110", -- | ## #### | 07
+ "011111000", -- | ##### | 08
+ "011011000", -- | ## ## | 09
+ "011011000", -- | ## ## | 10
+ "011011110", -- | ## #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 199 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011000000", -- | ## | 06
+ "011000000", -- | ## | 07
+ "011000000", -- | ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000110000", -- | ## | 12
+ "000011000", -- | ## | 13
+ "001110000", -- | ### | 14
+ "000000000", -- | | 15
+ -- ASCII 200 ---------------
+ "001100000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "011111000", -- | ##### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 201 ---------------
+ "000011000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "011111000", -- | ##### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 202 ---------------
+ "001111000", -- | #### | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "011111000", -- | ##### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 203 ---------------
+ "011001100", -- | ## ## | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "011111100", -- | ###### | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011000000", -- | ## | 06
+ "011111000", -- | ##### | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 204 ---------------
+ "001100000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 205 ---------------
+ "000011000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 206 ---------------
+ "001111000", -- | #### | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 207 ---------------
+ "011001100", -- | ## ## | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 208 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011110000", -- | #### | 03
+ "011011000", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "111101100", -- |#### ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011011000", -- | ## ## | 10
+ "011110000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 209 ---------------
+ "001110110", -- | ### ## | 00
+ "011011100", -- | ## ### | 01
+ "000000000", -- | | 02
+ "011000110", -- | ## ## | 03
+ "011000110", -- | ## ## | 04
+ "011100110", -- | ### ## | 05
+ "011110110", -- | #### ## | 06
+ "011011110", -- | ## #### | 07
+ "011001110", -- | ## ### | 08
+ "011000110", -- | ## ## | 09
+ "011000110", -- | ## ## | 10
+ "011000110", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 210 ---------------
+ "001100000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 211 ---------------
+ "000011000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 212 ---------------
+ "001111000", -- | #### | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 213 ---------------
+ "001110110", -- | ### ## | 00
+ "011011100", -- | ## ### | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 214 ---------------
+ "011001100", -- | ## ## | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "001111000", -- | #### | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 215 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "010000100", -- | # # | 04
+ "011001100", -- | ## ## | 05
+ "001111000", -- | #### | 06
+ "000110000", -- | ## | 07
+ "001111000", -- | #### | 08
+ "011001100", -- | ## ## | 09
+ "010000100", -- | # # | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 216 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001111100", -- | ##### | 03
+ "011001100", -- | ## ## | 04
+ "011011100", -- | ## ### | 05
+ "011011100", -- | ## ### | 06
+ "011111100", -- | ###### | 07
+ "011101100", -- | ### ## | 08
+ "011101100", -- | ### ## | 09
+ "011001100", -- | ## ## | 10
+ "011111000", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 217 ---------------
+ "001100000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 218 ---------------
+ "000011000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 219 ---------------
+ "001111000", -- | #### | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 220 ---------------
+ "011001100", -- | ## ## | 00
+ "011001100", -- | ## ## | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 221 ---------------
+ "000011000", -- | ## | 00
+ "000110000", -- | ## | 01
+ "000000000", -- | | 02
+ "011001100", -- | ## ## | 03
+ "011001100", -- | ## ## | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "001111000", -- | #### | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "000110000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 222 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000000", -- | ## | 03
+ "011000000", -- | ## | 04
+ "011111000", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011111000", -- | ##### | 09
+ "011000000", -- | ## | 10
+ "011000000", -- | ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 223 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001110000", -- | ### | 03
+ "011011000", -- | ## ## | 04
+ "011011000", -- | ## ## | 05
+ "011011000", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011011000", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 224 ---------------
+ "000000000", -- | | 00
+ "011100000", -- | ### | 01
+ "001100000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "000001100", -- | ## | 06
+ "000001100", -- | ## | 07
+ "001111100", -- | ##### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 225 ---------------
+ "000000000", -- | | 00
+ "000011100", -- | ### | 01
+ "000011000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "000001100", -- | ## | 06
+ "000001100", -- | ## | 07
+ "001111100", -- | ##### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 226 ---------------
+ "000000000", -- | | 00
+ "000110000", -- | ## | 01
+ "001111000", -- | #### | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "000001100", -- | ## | 06
+ "000001100", -- | ## | 07
+ "001111100", -- | ##### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 227 ---------------
+ "000000000", -- | | 00
+ "011100010", -- | ### # | 01
+ "110110110", -- |## ## ## | 02
+ "100011100", -- |# ### | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "000001100", -- | ## | 06
+ "000001100", -- | ## | 07
+ "001111100", -- | ##### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 228 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011001100", -- | ## ## | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "000001100", -- | ## | 06
+ "000001100", -- | ## | 07
+ "001111100", -- | ##### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 229 ---------------
+ "000000000", -- | | 00
+ "001111000", -- | #### | 01
+ "011001100", -- | ## ## | 02
+ "001111000", -- | #### | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "000001100", -- | ## | 06
+ "000001100", -- | ## | 07
+ "001111100", -- | ##### | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 230 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "011011100", -- | ## ### | 05
+ "000110110", -- | ## ## | 06
+ "000110110", -- | ## ## | 07
+ "011111110", -- | ####### | 08
+ "110110000", -- |## ## | 09
+ "110110000", -- |## ## | 10
+ "011101110", -- | ### ### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 231 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011000000", -- | ## | 07
+ "011000000", -- | ## | 08
+ "011000000", -- | ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000110000", -- | ## | 12
+ "000011000", -- | ## | 13
+ "001110000", -- | ### | 14
+ "000000000", -- | | 15
+ -- ASCII 232 ---------------
+ "000000000", -- | | 00
+ "011100000", -- | ### | 01
+ "001100000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 233 ---------------
+ "000000000", -- | | 00
+ "000011100", -- | ### | 01
+ "000011000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 234 ---------------
+ "000000000", -- | | 00
+ "000110000", -- | ## | 01
+ "001111000", -- | #### | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 235 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011001100", -- | ## ## | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011111100", -- | ###### | 08
+ "011000000", -- | ## | 09
+ "011000000", -- | ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 236 ---------------
+ "000000000", -- | | 00
+ "011100000", -- | ### | 01
+ "001100000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "011110000", -- | #### | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 237 ---------------
+ "000000000", -- | | 00
+ "000011100", -- | ### | 01
+ "000011000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "011110000", -- | #### | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 238 ---------------
+ "000000000", -- | | 00
+ "000110000", -- | ## | 01
+ "001111000", -- | #### | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "011110000", -- | #### | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 239 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011001100", -- | ## ## | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "011110000", -- | #### | 05
+ "000110000", -- | ## | 06
+ "000110000", -- | ## | 07
+ "000110000", -- | ## | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "011111100", -- | ###### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 240 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "001101100", -- | ## ## | 03
+ "000110000", -- | ## | 04
+ "011011000", -- | ## ## | 05
+ "000111100", -- | #### | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 241 ---------------
+ "000000000", -- | | 00
+ "011100010", -- | ### # | 01
+ "110110110", -- |## ## ## | 02
+ "100011100", -- |# ### | 03
+ "000000000", -- | | 04
+ "011111000", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011001100", -- | ## ## | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 242 ---------------
+ "000000000", -- | | 00
+ "011100000", -- | ### | 01
+ "001100000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 243 ---------------
+ "000000000", -- | | 00
+ "000011100", -- | ### | 01
+ "000011000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 244 ---------------
+ "000000000", -- | | 00
+ "000110000", -- | ## | 01
+ "001111000", -- | #### | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 245 ---------------
+ "000000000", -- | | 00
+ "011100010", -- | ### # | 01
+ "110110110", -- |## ## ## | 02
+ "100011100", -- |# ### | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 246 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011001100", -- | ## ## | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "001111000", -- | #### | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 247 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000110000", -- | ## | 04
+ "000110000", -- | ## | 05
+ "000000000", -- | | 06
+ "011111100", -- | ###### | 07
+ "000000000", -- | | 08
+ "000110000", -- | ## | 09
+ "000110000", -- | ## | 10
+ "000000000", -- | | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 248 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "000000000", -- | | 03
+ "000000000", -- | | 04
+ "001111100", -- | ##### | 05
+ "011001100", -- | ## ## | 06
+ "011011100", -- | ## ### | 07
+ "011111100", -- | ###### | 08
+ "011101100", -- | ### ## | 09
+ "011001100", -- | ## ## | 10
+ "011111000", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 249 ---------------
+ "000000000", -- | | 00
+ "011100000", -- | ### | 01
+ "001100000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 250 ---------------
+ "000000000", -- | | 00
+ "000011100", -- | ### | 01
+ "000011000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 251 ---------------
+ "000000000", -- | | 00
+ "000110000", -- | ## | 01
+ "001111000", -- | #### | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 252 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011001100", -- | ## ## | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111100", -- | ##### | 11
+ "000000000", -- | | 12
+ "000000000", -- | | 13
+ "000000000", -- | | 14
+ "000000000", -- | | 15
+ -- ASCII 253 ---------------
+ "000000000", -- | | 00
+ "000011100", -- | ### | 01
+ "000011000", -- | ## | 02
+ "000110000", -- | ## | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000011000", -- | ## | 12
+ "000110000", -- | ## | 13
+ "111100000", -- |#### | 14
+ "000000000", -- | | 15
+ -- ASCII 254 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "000000000", -- | | 02
+ "011000000", -- | ## | 03
+ "011000000", -- | ## | 04
+ "011000000", -- | ## | 05
+ "011111000", -- | ##### | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "011111000", -- | ##### | 11
+ "011000000", -- | ## | 12
+ "011000000", -- | ## | 13
+ "011000000", -- | ## | 14
+ "000000000", -- | | 15
+ -- ASCII 255 ---------------
+ "000000000", -- | | 00
+ "000000000", -- | | 01
+ "011001100", -- | ## ## | 02
+ "011001100", -- | ## ## | 03
+ "000000000", -- | | 04
+ "011001100", -- | ## ## | 05
+ "011001100", -- | ## ## | 06
+ "011001100", -- | ## ## | 07
+ "011001100", -- | ## ## | 08
+ "011001100", -- | ## ## | 09
+ "011001100", -- | ## ## | 10
+ "001111000", -- | #### | 11
+ "000011000", -- | ## | 12
+ "000110000", -- | ## | 13
+ "111100000", -- |#### | 14
+ "000000000", -- | | 15
+ -- Padding ---------------
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000", -- Padded
+ "000000000" -- Padded
+ );
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+
+end RTL;
+
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_system_16x16.vhd b/lib/VGA_ctrl/src/fonts/char_rom_system_16x16.vhd
new file mode 100644
index 0000000..d50d36f
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_system_16x16.vhd
@@ -0,0 +1,4382 @@
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port
+ (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(15 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(15 downto 0);
+ constant ROM : ROM_ARRAY :=
+ (
+ -- ASCII 032 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 033 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0000000000000000", -- | | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 034 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100110000000000", -- |## ## | 03
+ "1100110000000000", -- |## ## | 04
+ "1100110000000000", -- |## ## | 05
+ "1100110000000000", -- |## ## | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 035 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011011000000000", -- | ## ## | 03
+ "0011011000000000", -- | ## ## | 04
+ "0111111100000000", -- | ####### | 05
+ "0011011000000000", -- | ## ## | 06
+ "0011011000000000", -- | ## ## | 07
+ "0110110000000000", -- | ## ## | 08
+ "0110110000000000", -- | ## ## | 09
+ "1111111000000000", -- |####### | 10
+ "0110110000000000", -- | ## ## | 11
+ "0110110000000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 036 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001100000000000", -- | ## | 03
+ "0011110000000000", -- | #### | 04
+ "0110011000000000", -- | ## ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110000000000000", -- | ## | 07
+ "0011110000000000", -- | #### | 08
+ "0000011000000000", -- | ## | 09
+ "0000011000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0001100000000000", -- | ## | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 037 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111000001100000", -- | ### ## | 03
+ "1101100011000000", -- |## ## ## | 04
+ "1101100110000000", -- |## ## ## | 05
+ "1101101100000000", -- |## ## ## | 06
+ "0111011000000000", -- | ### ## | 07
+ "0000110111000000", -- | ## ### | 08
+ "0001101101100000", -- | ## ## ## | 09
+ "0011001101100000", -- | ## ## ## | 10
+ "0110001101100000", -- | ## ## ## | 11
+ "1100000111000000", -- |## ### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 038 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "1111000000000000", -- |#### | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 039 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 040 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "0011000000000000", -- | ## | 15
+ -- ASCII 041 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100000000000000", -- |## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "1100000000000000", -- |## | 15
+ -- ASCII 042 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011000000000000", -- | ## | 03
+ "1111110000000000", -- |###### | 04
+ "0011000000000000", -- | ## | 05
+ "0111100000000000", -- | #### | 06
+ "0100100000000000", -- | # # | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 043 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0001100000000000", -- | ## | 05
+ "0001100000000000", -- | ## | 06
+ "0001100000000000", -- | ## | 07
+ "0111111000000000", -- | ###### | 08
+ "0001100000000000", -- | ## | 09
+ "0001100000000000", -- | ## | 10
+ "0001100000000000", -- | ## | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 044 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "1100000000000000", -- |## | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 045 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "1111000000000000", -- |#### | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 046 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 047 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011000000000000", -- | ## | 03
+ "0011000000000000", -- | ## | 04
+ "0011000000000000", -- | ## | 05
+ "0011000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "1100000000000000", -- |## | 11
+ "1100000000000000", -- |## | 12
+ "1100000000000000", -- |## | 13
+ "1100000000000000", -- |## | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 048 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0110011000000000", -- | ## ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 049 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001100000000000", -- | ## | 03
+ "0111100000000000", -- | #### | 04
+ "0001100000000000", -- | ## | 05
+ "0001100000000000", -- | ## | 06
+ "0001100000000000", -- | ## | 07
+ "0001100000000000", -- | ## | 08
+ "0001100000000000", -- | ## | 09
+ "0001100000000000", -- | ## | 10
+ "0001100000000000", -- | ## | 11
+ "0001100000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 050 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0110011000000000", -- | ## ## | 05
+ "0000011000000000", -- | ## | 06
+ "0000110000000000", -- | ## | 07
+ "0001100000000000", -- | ## | 08
+ "0011000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0111111000000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 051 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000011000000000", -- | ## | 05
+ "0000011000000000", -- | ## | 06
+ "0001110000000000", -- | ### | 07
+ "0000011000000000", -- | ## | 08
+ "0000011000000000", -- | ## | 09
+ "0000011000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 052 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000011000000000", -- | ## | 03
+ "0000111000000000", -- | ### | 04
+ "0001111000000000", -- | #### | 05
+ "0001111000000000", -- | #### | 06
+ "0011011000000000", -- | ## ## | 07
+ "0011011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "0000011000000000", -- | ## | 11
+ "0000011000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 053 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111000000000", -- | ###### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0111110000000000", -- | ##### | 07
+ "0110011000000000", -- | ## ## | 08
+ "0000011000000000", -- | ## | 09
+ "0000011000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 054 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0111110000000000", -- | ##### | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 055 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111000000000", -- | ###### | 03
+ "0000011000000000", -- | ## | 04
+ "0000110000000000", -- | ## | 05
+ "0000110000000000", -- | ## | 06
+ "0001100000000000", -- | ## | 07
+ "0001100000000000", -- | ## | 08
+ "0001100000000000", -- | ## | 09
+ "0011000000000000", -- | ## | 10
+ "0011000000000000", -- | ## | 11
+ "0011000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 056 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0110011000000000", -- | ## ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "0011110000000000", -- | #### | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 057 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0110011000000000", -- | ## ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0011111000000000", -- | ##### | 08
+ "0000011000000000", -- | ## | 09
+ "0000011000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 058 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 059 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "1100000000000000", -- |## | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 060 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000011000000000", -- | ## | 04
+ "0000110000000000", -- | ## | 05
+ "0001100000000000", -- | ## | 06
+ "0011000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0011000000000000", -- | ## | 09
+ "0001100000000000", -- | ## | 10
+ "0000110000000000", -- | ## | 11
+ "0000011000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 061 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0111111000000000", -- | ###### | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0111111000000000", -- | ###### | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 062 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0011000000000000", -- | ## | 05
+ "0001100000000000", -- | ## | 06
+ "0000110000000000", -- | ## | 07
+ "0000011000000000", -- | ## | 08
+ "0000110000000000", -- | ## | 09
+ "0001100000000000", -- | ## | 10
+ "0011000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 063 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0110011000000000", -- | ## ## | 05
+ "0000011000000000", -- | ## | 06
+ "0000110000000000", -- | ## | 07
+ "0001100000000000", -- | ## | 08
+ "0001100000000000", -- | ## | 09
+ "0000000000000000", -- | | 10
+ "0001100000000000", -- | ## | 11
+ "0001100000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 064 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000011110000000", -- | #### | 02
+ "0001110011100000", -- | ### ### | 03
+ "0011000000110000", -- | ## ## | 04
+ "0011001110110000", -- | ## ### ## | 05
+ "0110011011011000", -- | ## ## ## ## | 06
+ "0110011011011000", -- | ## ## ## ## | 07
+ "0110110011011000", -- | ## ## ## ## | 08
+ "0110110110011000", -- | ## ## ## ## | 09
+ "0110110110011000", -- | ## ## ## ## | 10
+ "0011011011110000", -- | ## ## #### | 11
+ "0011000000000000", -- | ## | 12
+ "0001110001110000", -- | ### ### | 13
+ "0000011111000000", -- | ##### | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 065 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001100000000000", -- | ## | 03
+ "0001100000000000", -- | ## | 04
+ "0011110000000000", -- | #### | 05
+ "0011110000000000", -- | #### | 06
+ "0010010000000000", -- | # # | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "1100001100000000", -- |## ## | 11
+ "1100001100000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 066 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0111111100000000", -- | ####### | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0110000110000000", -- | ## ## | 11
+ "0111111100000000", -- | ####### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 067 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000100000000", -- | ## # | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000100000000", -- | ## # | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 068 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111000000000", -- | ###### | 03
+ "0110001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0110001100000000", -- | ## ## | 11
+ "0111111000000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 069 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0111111000000000", -- | ###### | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0111111100000000", -- | ####### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 070 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0111111000000000", -- | ###### | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 071 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001111100000000", -- | ##### | 03
+ "0011000110000000", -- | ## ## | 04
+ "0110000010000000", -- | ## # | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110011110000000", -- | ## #### | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011000110000000", -- | ## ## | 11
+ "0001111010000000", -- | #### # | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 072 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000110000000", -- | ## ## | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0111111110000000", -- | ######## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0110000110000000", -- | ## ## | 11
+ "0110000110000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 073 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 074 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000110000000000", -- | ## | 03
+ "0000110000000000", -- | ## | 04
+ "0000110000000000", -- | ## | 05
+ "0000110000000000", -- | ## | 06
+ "0000110000000000", -- | ## | 07
+ "0000110000000000", -- | ## | 08
+ "0000110000000000", -- | ## | 09
+ "1100110000000000", -- |## ## | 10
+ "1100110000000000", -- |## ## | 11
+ "0111100000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 075 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110001100000000", -- | ## ## | 03
+ "0110011000000000", -- | ## ## | 04
+ "0110110000000000", -- | ## ## | 05
+ "0111100000000000", -- | #### | 06
+ "0111000000000000", -- | ### | 07
+ "0111100000000000", -- | #### | 08
+ "0110110000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110001100000000", -- | ## ## | 11
+ "0110000110000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 076 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0111111100000000", -- | ####### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 077 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000001100000", -- | ## ## | 03
+ "0110000001100000", -- | ## ## | 04
+ "0111000011100000", -- | ### ### | 05
+ "0111000011100000", -- | ### ### | 06
+ "0111100111100000", -- | #### #### | 07
+ "0111100111100000", -- | #### #### | 08
+ "0110111101100000", -- | ## #### ## | 09
+ "0110111101100000", -- | ## #### ## | 10
+ "0110011001100000", -- | ## ## ## | 11
+ "0110011001100000", -- | ## ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 078 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000110000000", -- | ## ## | 03
+ "0111000110000000", -- | ### ## | 04
+ "0111100110000000", -- | #### ## | 05
+ "0111100110000000", -- | #### ## | 06
+ "0110110110000000", -- | ## ## ## | 07
+ "0110110110000000", -- | ## ## ## | 08
+ "0110011110000000", -- | ## #### | 09
+ "0110011110000000", -- | ## #### | 10
+ "0110001110000000", -- | ## ### | 11
+ "0110000110000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 079 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 080 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0111111100000000", -- | ####### | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 081 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110011110000000", -- | ## #### | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111110000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 082 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0111111100000000", -- | ####### | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0110000110000000", -- | ## ## | 11
+ "0110000011000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 083 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011111000000000", -- | ##### | 03
+ "0110001100000000", -- | ## ## | 04
+ "0110001100000000", -- | ## ## | 05
+ "0110000000000000", -- | ## | 06
+ "0011100000000000", -- | ### | 07
+ "0000111000000000", -- | ### | 08
+ "0000001100000000", -- | ## | 09
+ "0110001100000000", -- | ## ## | 10
+ "0110001100000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 084 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1111111100000000", -- |######## | 03
+ "0001100000000000", -- | ## | 04
+ "0001100000000000", -- | ## | 05
+ "0001100000000000", -- | ## | 06
+ "0001100000000000", -- | ## | 07
+ "0001100000000000", -- | ## | 08
+ "0001100000000000", -- | ## | 09
+ "0001100000000000", -- | ## | 10
+ "0001100000000000", -- | ## | 11
+ "0001100000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 085 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000110000000", -- | ## ## | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 086 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100001100000000", -- |## ## | 03
+ "1100001100000000", -- |## ## | 04
+ "0110011000000000", -- | ## ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0010010000000000", -- | # # | 08
+ "0011110000000000", -- | #### | 09
+ "0011110000000000", -- | #### | 10
+ "0001100000000000", -- | ## | 11
+ "0001100000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 087 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100001100001100", -- |## ## ## | 03
+ "1100001100001100", -- |## ## ## | 04
+ "1100001100001100", -- |## ## ## | 05
+ "0110011110011000", -- | ## #### ## | 06
+ "0110011110011000", -- | ## #### ## | 07
+ "0011010010110000", -- | ## # # ## | 08
+ "0011110011110000", -- | #### #### | 09
+ "0001100001100000", -- | ## ## | 10
+ "0001100001100000", -- | ## ## | 11
+ "0001100001100000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 088 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100000110000000", -- |## ## | 03
+ "1100000110000000", -- |## ## | 04
+ "0110001100000000", -- | ## ## | 05
+ "0011011000000000", -- | ## ## | 06
+ "0001110000000000", -- | ### | 07
+ "0001110000000000", -- | ### | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110001100000000", -- | ## ## | 10
+ "1100000110000000", -- |## ## | 11
+ "1100000110000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 089 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100000011000000", -- |## ## | 03
+ "1100000011000000", -- |## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0011001100000000", -- | ## ## | 06
+ "0001111000000000", -- | #### | 07
+ "0000110000000000", -- | ## | 08
+ "0000110000000000", -- | ## | 09
+ "0000110000000000", -- | ## | 10
+ "0000110000000000", -- | ## | 11
+ "0000110000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 090 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1111111110000000", -- |######### | 03
+ "0000000110000000", -- | ## | 04
+ "0000001100000000", -- | ## | 05
+ "0000011000000000", -- | ## | 06
+ "0000110000000000", -- | ## | 07
+ "0001100000000000", -- | ## | 08
+ "0011000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "1100000000000000", -- |## | 11
+ "1111111110000000", -- |######### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 091 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111000000000000", -- | ### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "0111000000000000", -- | ### | 15
+ -- ASCII 092 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100000000000000", -- |## | 03
+ "1100000000000000", -- |## | 04
+ "1100000000000000", -- |## | 05
+ "1100000000000000", -- |## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0011000000000000", -- | ## | 11
+ "0011000000000000", -- | ## | 12
+ "0011000000000000", -- | ## | 13
+ "0011000000000000", -- | ## | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 093 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1110000000000000", -- |### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "1110000000000000", -- |### | 15
+ -- ASCII 094 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0010000000000000", -- | # | 03
+ "0111000000000000", -- | ### | 04
+ "1101100000000000", -- |## ## | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 095 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "1111111100000000", -- |######## | 15
+ -- ASCII 096 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0111000000000000", -- | ### | 02
+ "0011000000000000", -- | ## | 03
+ "0001100000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 097 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0001111000000000", -- | #### | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 098 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0111110000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0111110000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 099 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 100 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000011000000000", -- | ## | 03
+ "0000011000000000", -- | ## | 04
+ "0000011000000000", -- | ## | 05
+ "0011111000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 101 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0111111000000000", -- | ###### | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 102 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "1111000000000000", -- |#### | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 103 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011111000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000011000000000", -- | ## | 13
+ "0110011000000000", -- | ## ## | 14
+ "0011110000000000", -- | #### | 15
+ -- ASCII 104 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0111110000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0110011000000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 105 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 106 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "1100000000000000", -- |## | 15
+ -- ASCII 107 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110110000000000", -- | ## ## | 07
+ "0111100000000000", -- | #### | 08
+ "0111000000000000", -- | ### | 09
+ "0111100000000000", -- | #### | 10
+ "0110110000000000", -- | ## ## | 11
+ "0110011000000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 108 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 109 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0111111111000000", -- | ######### | 06
+ "0110011001100000", -- | ## ## ## | 07
+ "0110011001100000", -- | ## ## ## | 08
+ "0110011001100000", -- | ## ## ## | 09
+ "0110011001100000", -- | ## ## ## | 10
+ "0110011001100000", -- | ## ## ## | 11
+ "0110011001100000", -- | ## ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 110 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0111110000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0110011000000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 111 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 112 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0111110000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0111110000000000", -- | ##### | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "0110000000000000", -- | ## | 15
+ -- ASCII 113 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011111000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000011000000000", -- | ## | 13
+ "0000011000000000", -- | ## | 14
+ "0000011000000000", -- | ## | 15
+ -- ASCII 114 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0111100000000000", -- | #### | 06
+ "0111000000000000", -- | ### | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 115 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110000000000000", -- | ## | 08
+ "0011110000000000", -- | #### | 09
+ "0000011000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 116 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "1111000000000000", -- |#### | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0011000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 117 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 118 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "1100001100000000", -- |## ## | 06
+ "1100001100000000", -- |## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0011110000000000", -- | #### | 10
+ "0001100000000000", -- | ## | 11
+ "0001100000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 119 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "1100000011000000", -- |## ## | 06
+ "1100110011000000", -- |## ## ## | 07
+ "0110110110000000", -- | ## ## ## | 08
+ "0110110110000000", -- | ## ## ## | 09
+ "0111111110000000", -- | ######## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0011001100000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 120 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "1100001100000000", -- |## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0011110000000000", -- | #### | 08
+ "0001100000000000", -- | ## | 09
+ "0011110000000000", -- | #### | 10
+ "0110011000000000", -- | ## ## | 11
+ "1100001100000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 121 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "1100001100000000", -- |## ## | 06
+ "1100001100000000", -- |## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0011110000000000", -- | #### | 10
+ "0011110000000000", -- | #### | 11
+ "0001100000000000", -- | ## | 12
+ "0001100000000000", -- | ## | 13
+ "0011000000000000", -- | ## | 14
+ "0110000000000000", -- | ## | 15
+ -- ASCII 122 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0111111000000000", -- | ###### | 06
+ "0000011000000000", -- | ## | 07
+ "0000110000000000", -- | ## | 08
+ "0001100000000000", -- | ## | 09
+ "0011000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0111111000000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 123 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001100000000000", -- | ## | 03
+ "0011000000000000", -- | ## | 04
+ "0011000000000000", -- | ## | 05
+ "0011000000000000", -- | ## | 06
+ "0011000000000000", -- | ## | 07
+ "0011000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0011000000000000", -- | ## | 10
+ "0011000000000000", -- | ## | 11
+ "0011000000000000", -- | ## | 12
+ "0011000000000000", -- | ## | 13
+ "0011000000000000", -- | ## | 14
+ "0001100000000000", -- | ## | 15
+ -- ASCII 124 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "0110000000000000", -- | ## | 15
+ -- ASCII 125 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100000000000000", -- |## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0011000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "1100000000000000", -- |## | 15
+ -- ASCII 126 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1110100000000000", -- |### # | 03
+ "1011100000000000", -- |# ### | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 127 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 128 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 129 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 130 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 131 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 132 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 133 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 134 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 135 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 136 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 137 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 138 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 139 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 140 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 141 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 142 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 143 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 144 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 145 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0011000000000000", -- | ## | 02
+ "0110000000000000", -- | ## | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 146 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0110000000000000", -- | ## | 02
+ "1100000000000000", -- |## | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 147 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 148 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 149 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 150 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 151 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 152 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 153 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 154 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 155 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 156 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 157 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 158 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 159 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 160 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 161 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 162 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000110000000000", -- | ## | 05
+ "0011110000000000", -- | #### | 06
+ "0110111000000000", -- | ## ### | 07
+ "0110100000000000", -- | ## # | 08
+ "0110100000000000", -- | ## # | 09
+ "0111000000000000", -- | ### | 10
+ "0111011000000000", -- | ### ## | 11
+ "0011110000000000", -- | #### | 12
+ "0011000000000000", -- | ## | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 163 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011100000000000", -- | ### | 03
+ "0110110000000000", -- | ## ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0011000000000000", -- | ## | 07
+ "0111100000000000", -- | #### | 08
+ "0011000000000000", -- | ## | 09
+ "0011000000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0111110000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 164 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110011000000000", -- | ## ## | 03
+ "0011110000000000", -- | #### | 04
+ "0010010000000000", -- | # # | 05
+ "0010010000000000", -- | # # | 06
+ "0011110000000000", -- | #### | 07
+ "0110011000000000", -- | ## ## | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 165 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1100001100000000", -- |## ## | 03
+ "1100001100000000", -- |## ## | 04
+ "0110011000000000", -- | ## ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "1111111100000000", -- |######## | 07
+ "0001100000000000", -- | ## | 08
+ "1111111100000000", -- |######## | 09
+ "0001100000000000", -- | ## | 10
+ "0001100000000000", -- | ## | 11
+ "0001100000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 166 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0000000000000000", -- | | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "0110000000000000", -- | ## | 15
+ -- ASCII 167 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0011100000000000", -- | ### | 05
+ "0011100000000000", -- | ### | 06
+ "0110110000000000", -- | ## ## | 07
+ "0011011000000000", -- | ## ## | 08
+ "0001110000000000", -- | ### | 09
+ "0001110000000000", -- | ### | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 168 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1101100000000000", -- |## ## | 03
+ "1101100000000000", -- |## ## | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 169 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011111100000000", -- | ###### | 03
+ "0110000110000000", -- | ## ## | 04
+ "1100110011000000", -- |## ## ## | 05
+ "1101001011000000", -- |## # # ## | 06
+ "1101000011000000", -- |## # ## | 07
+ "1101000011000000", -- |## # ## | 08
+ "1101001011000000", -- |## # # ## | 09
+ "1100110011000000", -- |## ## ## | 10
+ "0110000110000000", -- | ## ## | 11
+ "0011111100000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 170 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0010000000000000", -- | # | 03
+ "0001000000000000", -- | # | 04
+ "0011000000000000", -- | ## | 05
+ "0101000000000000", -- | # # | 06
+ "0011000000000000", -- | ## | 07
+ "0000000000000000", -- | | 08
+ "0111000000000000", -- | ### | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 171 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0011011000000000", -- | ## ## | 07
+ "0110110000000000", -- | ## ## | 08
+ "1101100000000000", -- |## ## | 09
+ "0110110000000000", -- | ## ## | 10
+ "0011011000000000", -- | ## ## | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 172 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0111111000000000", -- | ###### | 07
+ "0000011000000000", -- | ## | 08
+ "0000011000000000", -- | ## | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 173 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "1111000000000000", -- |#### | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 174 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011111100000000", -- | ###### | 03
+ "0110000110000000", -- | ## ## | 04
+ "1101110011000000", -- |## ### ## | 05
+ "1101001011000000", -- |## # # ## | 06
+ "1101001011000000", -- |## # # ## | 07
+ "1101110011000000", -- |## ### ## | 08
+ "1101010011000000", -- |## # # ## | 09
+ "1101001011000000", -- |## # # ## | 10
+ "0110000110000000", -- | ## ## | 11
+ "0011111100000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 175 ---------------
+ "0000000000000000", -- | | 00
+ "1111111100000000", -- |######## | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 176 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111000000000000", -- | ### | 03
+ "0101000000000000", -- | # # | 04
+ "0101000000000000", -- | # # | 05
+ "0111000000000000", -- | ### | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 177 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0001100000000000", -- | ## | 06
+ "0001100000000000", -- | ## | 07
+ "0111111000000000", -- | ###### | 08
+ "0001100000000000", -- | ## | 09
+ "0001100000000000", -- | ## | 10
+ "0000000000000000", -- | | 11
+ "0111111000000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 178 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "1011000000000000", -- |# ## | 04
+ "0011000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "1111000000000000", -- |#### | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 179 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "1011000000000000", -- |# ## | 04
+ "0110000000000000", -- | ## | 05
+ "1011000000000000", -- |# ## | 06
+ "0110000000000000", -- | ## | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 180 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0011100000000000", -- | ### | 02
+ "0011000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 181 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0110011000000000", -- | ## ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0111111100000000", -- | ####### | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "0110000000000000", -- | ## | 15
+ -- ASCII 182 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0111110000000000", -- | ##### | 04
+ "0111110000000000", -- | ##### | 05
+ "0111110000000000", -- | ##### | 06
+ "0111110000000000", -- | ##### | 07
+ "0011110000000000", -- | #### | 08
+ "0000110000000000", -- | ## | 09
+ "0000110000000000", -- | ## | 10
+ "0000110000000000", -- | ## | 11
+ "0000110000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 183 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 184 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0011000000000000", -- | ## | 13
+ "0001100000000000", -- | ## | 14
+ "0111000000000000", -- | ### | 15
+ -- ASCII 185 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "1110000000000000", -- |### | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 186 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111000000000000", -- | ### | 03
+ "0101000000000000", -- | # # | 04
+ "0101000000000000", -- | # # | 05
+ "0101000000000000", -- | # # | 06
+ "0111000000000000", -- | ### | 07
+ "0000000000000000", -- | | 08
+ "0111000000000000", -- | ### | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 187 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "1101100000000000", -- |## ## | 07
+ "0110110000000000", -- | ## ## | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110110000000000", -- | ## ## | 10
+ "1101100000000000", -- |## ## | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 188 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011000001100000", -- | ## ## | 03
+ "0111000011000000", -- | ### ## | 04
+ "0011000110000000", -- | ## ## | 05
+ "0011001100000000", -- | ## ## | 06
+ "0011011000000000", -- | ## ## | 07
+ "0000110011000000", -- | ## ## | 08
+ "0001100111000000", -- | ## ### | 09
+ "0011001101000000", -- | ## ## # | 10
+ "0110001111000000", -- | ## #### | 11
+ "1100000011000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 189 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011000001100000", -- | ## ## | 03
+ "0111000011000000", -- | ### ## | 04
+ "0011000110000000", -- | ## ## | 05
+ "0011001100000000", -- | ## ## | 06
+ "0011011000000000", -- | ## ## | 07
+ "0000110110000000", -- | ## ## | 08
+ "0001101011000000", -- | ## # ## | 09
+ "0011000011000000", -- | ## ## | 10
+ "0110000110000000", -- | ## ## | 11
+ "1100001111000000", -- |## #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 190 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011000001100000", -- | ## ## | 03
+ "0101100011000000", -- | # ## ## | 04
+ "0011000110000000", -- | ## ## | 05
+ "0101101100000000", -- | # ## ## | 06
+ "0011011000000000", -- | ## ## | 07
+ "0000110011000000", -- | ## ## | 08
+ "0001100111000000", -- | ## ### | 09
+ "0011001101000000", -- | ## ## # | 10
+ "0110001111000000", -- | ## #### | 11
+ "1100000011000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 191 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001100000000000", -- | ## | 03
+ "0001100000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0001100000000000", -- | ## | 06
+ "0001100000000000", -- | ## | 07
+ "0011000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 192 ---------------
+ "0011100000000000", -- | ### | 00
+ "0001100000000000", -- | ## | 01
+ "0000110000000000", -- | ## | 02
+ "0001100000000000", -- | ## | 03
+ "0001100000000000", -- | ## | 04
+ "0011110000000000", -- | #### | 05
+ "0011110000000000", -- | #### | 06
+ "0010010000000000", -- | # # | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "1100001100000000", -- |## ## | 11
+ "1100001100000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 193 ---------------
+ "0001110000000000", -- | ### | 00
+ "0001100000000000", -- | ## | 01
+ "0011000000000000", -- | ## | 02
+ "0001100000000000", -- | ## | 03
+ "0001100000000000", -- | ## | 04
+ "0011110000000000", -- | #### | 05
+ "0011110000000000", -- | #### | 06
+ "0010010000000000", -- | # # | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "1100001100000000", -- |## ## | 11
+ "1100001100000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 194 ---------------
+ "0001100000000000", -- | ## | 00
+ "0011110000000000", -- | #### | 01
+ "0110011000000000", -- | ## ## | 02
+ "0001100000000000", -- | ## | 03
+ "0001100000000000", -- | ## | 04
+ "0011110000000000", -- | #### | 05
+ "0011110000000000", -- | #### | 06
+ "0010010000000000", -- | # # | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "1100001100000000", -- |## ## | 11
+ "1100001100000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 195 ---------------
+ "0111101000000000", -- | #### # | 00
+ "0101111000000000", -- | # #### | 01
+ "0000000000000000", -- | | 02
+ "0001100000000000", -- | ## | 03
+ "0001100000000000", -- | ## | 04
+ "0011110000000000", -- | #### | 05
+ "0011110000000000", -- | #### | 06
+ "0010010000000000", -- | # # | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "1100001100000000", -- |## ## | 11
+ "1100001100000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 196 ---------------
+ "0110011000000000", -- | ## ## | 00
+ "0110011000000000", -- | ## ## | 01
+ "0000000000000000", -- | | 02
+ "0001100000000000", -- | ## | 03
+ "0001100000000000", -- | ## | 04
+ "0011110000000000", -- | #### | 05
+ "0011110000000000", -- | #### | 06
+ "0010010000000000", -- | # # | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "1100001100000000", -- |## ## | 11
+ "1100001100000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 197 ---------------
+ "0001100000000000", -- | ## | 00
+ "0011110000000000", -- | #### | 01
+ "0001100000000000", -- | ## | 02
+ "0000000000000000", -- | | 03
+ "0001100000000000", -- | ## | 04
+ "0001100000000000", -- | ## | 05
+ "0011110000000000", -- | #### | 06
+ "0010010000000000", -- | # # | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "1100001100000000", -- |## ## | 11
+ "1100001100000000", -- |## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 198 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001111111110000", -- | ######### | 03
+ "0001111000000000", -- | #### | 04
+ "0011011000000000", -- | ## ## | 05
+ "0011011000000000", -- | ## ## | 06
+ "0011011111100000", -- | ## ###### | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "1100011000000000", -- |## ## | 11
+ "1100011111110000", -- |## ####### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 199 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000100000000", -- | ## # | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000100000000", -- | ## # | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000110000000000", -- | ## | 13
+ "0000011000000000", -- | ## | 14
+ "0001110000000000", -- | ### | 15
+ -- ASCII 200 ---------------
+ "0001110000000000", -- | ### | 00
+ "0000110000000000", -- | ## | 01
+ "0000011000000000", -- | ## | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0111111000000000", -- | ###### | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0111111100000000", -- | ####### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 201 ---------------
+ "0000111000000000", -- | ### | 00
+ "0000110000000000", -- | ## | 01
+ "0001100000000000", -- | ## | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0111111000000000", -- | ###### | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0111111100000000", -- | ####### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 202 ---------------
+ "0000110000000000", -- | ## | 00
+ "0001111000000000", -- | #### | 01
+ "0011001100000000", -- | ## ## | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0111111000000000", -- | ###### | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0111111100000000", -- | ####### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 203 ---------------
+ "0011001100000000", -- | ## ## | 00
+ "0011001100000000", -- | ## ## | 01
+ "0000000000000000", -- | | 02
+ "0111111100000000", -- | ####### | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0111111000000000", -- | ###### | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0111111100000000", -- | ####### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 204 ---------------
+ "1100000000000000", -- |## | 00
+ "0110000000000000", -- | ## | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 205 ---------------
+ "0011000000000000", -- | ## | 00
+ "0110000000000000", -- | ## | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 206 ---------------
+ "0110000000000000", -- | ## | 00
+ "1001000000000000", -- |# # | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 207 ---------------
+ "1001000000000000", -- |# # | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 208 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111111000000000", -- | ###### | 03
+ "0110001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "1111100110000000", -- |##### ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0110001100000000", -- | ## ## | 11
+ "0111111000000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 209 ---------------
+ "0011110100000000", -- | #### # | 00
+ "0010111100000000", -- | # #### | 01
+ "0000000000000000", -- | | 02
+ "0110000110000000", -- | ## ## | 03
+ "0111000110000000", -- | ### ## | 04
+ "0111100110000000", -- | #### ## | 05
+ "0111100110000000", -- | #### ## | 06
+ "0110110110000000", -- | ## ## ## | 07
+ "0110110110000000", -- | ## ## ## | 08
+ "0110011110000000", -- | ## #### | 09
+ "0110011110000000", -- | ## #### | 10
+ "0110001110000000", -- | ## ### | 11
+ "0110000110000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 210 ---------------
+ "0001110000000000", -- | ### | 00
+ "0000110000000000", -- | ## | 01
+ "0000011000000000", -- | ## | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 211 ---------------
+ "0000111000000000", -- | ### | 00
+ "0000110000000000", -- | ## | 01
+ "0001100000000000", -- | ## | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 212 ---------------
+ "0000110000000000", -- | ## | 00
+ "0001111000000000", -- | #### | 01
+ "0011001100000000", -- | ## ## | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 213 ---------------
+ "0011110100000000", -- | #### # | 00
+ "0010111100000000", -- | # #### | 01
+ "0000000000000000", -- | | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 214 ---------------
+ "0011001100000000", -- | ## ## | 00
+ "0011001100000000", -- | ## ## | 01
+ "0000000000000000", -- | | 02
+ "0001111000000000", -- | #### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 215 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0110011000000000", -- | ## ## | 07
+ "0011110000000000", -- | #### | 08
+ "0001100000000000", -- | ## | 09
+ "0011110000000000", -- | #### | 10
+ "0110011000000000", -- | ## ## | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 216 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0001111110000000", -- | ###### | 03
+ "0011001100000000", -- | ## ## | 04
+ "0110001110000000", -- | ## ### | 05
+ "0110011110000000", -- | ## #### | 06
+ "0110110110000000", -- | ## ## ## | 07
+ "0110110110000000", -- | ## ## ## | 08
+ "0111100110000000", -- | #### ## | 09
+ "0111000110000000", -- | ### ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0111111000000000", -- | ###### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 217 ---------------
+ "0001110000000000", -- | ### | 00
+ "0000110000000000", -- | ## | 01
+ "0000011000000000", -- | ## | 02
+ "0110000110000000", -- | ## ## | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 218 ---------------
+ "0000111000000000", -- | ### | 00
+ "0000110000000000", -- | ## | 01
+ "0001100000000000", -- | ## | 02
+ "0110000110000000", -- | ## ## | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 219 ---------------
+ "0000110000000000", -- | ## | 00
+ "0001111000000000", -- | #### | 01
+ "0011001100000000", -- | ## ## | 02
+ "0000000000000000", -- | | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 220 ---------------
+ "0011001100000000", -- | ## ## | 00
+ "0011001100000000", -- | ## ## | 01
+ "0000000000000000", -- | | 02
+ "0110000110000000", -- | ## ## | 03
+ "0110000110000000", -- | ## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0110000110000000", -- | ## ## | 06
+ "0110000110000000", -- | ## ## | 07
+ "0110000110000000", -- | ## ## | 08
+ "0110000110000000", -- | ## ## | 09
+ "0110000110000000", -- | ## ## | 10
+ "0011001100000000", -- | ## ## | 11
+ "0001111000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 221 ---------------
+ "0000111000000000", -- | ### | 00
+ "0000110000000000", -- | ## | 01
+ "0001100000000000", -- | ## | 02
+ "1100000011000000", -- |## ## | 03
+ "1100000011000000", -- |## ## | 04
+ "0110000110000000", -- | ## ## | 05
+ "0011001100000000", -- | ## ## | 06
+ "0001111000000000", -- | #### | 07
+ "0000110000000000", -- | ## | 08
+ "0000110000000000", -- | ## | 09
+ "0000110000000000", -- | ## | 10
+ "0000110000000000", -- | ## | 11
+ "0000110000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 222 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0111111000000000", -- | ###### | 05
+ "0110001100000000", -- | ## ## | 06
+ "0110001100000000", -- | ## ## | 07
+ "0110001100000000", -- | ## ## | 08
+ "0110001100000000", -- | ## ## | 09
+ "0111111000000000", -- | ###### | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 223 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0110011000000000", -- | ## ## | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110110000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0110110000000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 224 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0011100000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0000110000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0001111000000000", -- | #### | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 225 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001110000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0011000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0001111000000000", -- | #### | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 226 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001100000000000", -- | ## | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0001111000000000", -- | #### | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 227 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111101000000000", -- | #### # | 03
+ "0101111000000000", -- | # #### | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0001111000000000", -- | #### | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 228 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110011000000000", -- | ## ## | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0001111000000000", -- | #### | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 229 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001100000000000", -- | ## | 02
+ "0011110000000000", -- | #### | 03
+ "0001100000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0001111000000000", -- | #### | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 230 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011111111000000", -- | ######## | 06
+ "0110011001100000", -- | ## ## ## | 07
+ "0001111111100000", -- | ######## | 08
+ "0011011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011001100000", -- | ## ## ## | 11
+ "0011111111000000", -- | ######## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 231 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0001100000000000", -- | ## | 13
+ "0000110000000000", -- | ## | 14
+ "0011100000000000", -- | ### | 15
+ -- ASCII 232 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0011100000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0000110000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0111111000000000", -- | ###### | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 233 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001110000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0011000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0111111000000000", -- | ###### | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 234 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001100000000000", -- | ## | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0111111000000000", -- | ###### | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 235 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110011000000000", -- | ## ## | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0111111000000000", -- | ###### | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 236 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "1110000000000000", -- |### | 02
+ "0110000000000000", -- | ## | 03
+ "0011000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 237 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0111000000000000", -- | ### | 02
+ "0110000000000000", -- | ## | 03
+ "1100000000000000", -- |## | 04
+ "0000000000000000", -- | | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 238 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0110000000000000", -- | ## | 02
+ "1111000000000000", -- |#### | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 239 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "1001000000000000", -- |# # | 03
+ "1001000000000000", -- |# # | 04
+ "0000000000000000", -- | | 05
+ "0110000000000000", -- | ## | 06
+ "0110000000000000", -- | ## | 07
+ "0110000000000000", -- | ## | 08
+ "0110000000000000", -- | ## | 09
+ "0110000000000000", -- | ## | 10
+ "0110000000000000", -- | ## | 11
+ "0110000000000000", -- | ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 240 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111011000000000", -- | ### ## | 03
+ "0001100000000000", -- | ## | 04
+ "0110110000000000", -- | ## ## | 05
+ "0000110000000000", -- | ## | 06
+ "0011111000000000", -- | ##### | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 241 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111101000000000", -- | #### # | 03
+ "0101111000000000", -- | # #### | 04
+ "0000000000000000", -- | | 05
+ "0111110000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0110011000000000", -- | ## ## | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 242 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0011100000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0000110000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 243 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001110000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0011000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 244 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001100000000000", -- | ## | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 245 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0111101000000000", -- | #### # | 03
+ "0101111000000000", -- | # #### | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 246 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110011000000000", -- | ## ## | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "0011110000000000", -- | #### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011110000000000", -- | #### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 247 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0011000000000000", -- | ## | 05
+ "0011000000000000", -- | ## | 06
+ "0000000000000000", -- | | 07
+ "0111100000000000", -- | #### | 08
+ "0000000000000000", -- | | 09
+ "0011000000000000", -- | ## | 10
+ "0011000000000000", -- | ## | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 248 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0011111000000000", -- | ##### | 06
+ "0110111000000000", -- | ## ### | 07
+ "0110111000000000", -- | ## ### | 08
+ "0110011000000000", -- | ## ## | 09
+ "0111011000000000", -- | ### ## | 10
+ "0111011000000000", -- | ### ## | 11
+ "0111110000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 249 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0011100000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0000110000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 250 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001110000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0011000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 251 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001100000000000", -- | ## | 02
+ "0011110000000000", -- | #### | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 252 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110011000000000", -- | ## ## | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "0110011000000000", -- | ## ## | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0011111000000000", -- | ##### | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 253 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0001110000000000", -- | ### | 02
+ "0001100000000000", -- | ## | 03
+ "0011000000000000", -- | ## | 04
+ "0000000000000000", -- | | 05
+ "1100001100000000", -- |## ## | 06
+ "1100001100000000", -- |## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0011110000000000", -- | #### | 10
+ "0011110000000000", -- | #### | 11
+ "0001100000000000", -- | ## | 12
+ "0001100000000000", -- | ## | 13
+ "0011000000000000", -- | ## | 14
+ "0110000000000000", -- | ## | 15
+ -- ASCII 254 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110000000000000", -- | ## | 03
+ "0110000000000000", -- | ## | 04
+ "0110000000000000", -- | ## | 05
+ "0111110000000000", -- | ##### | 06
+ "0110011000000000", -- | ## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0110011000000000", -- | ## ## | 10
+ "0110011000000000", -- | ## ## | 11
+ "0111110000000000", -- | ##### | 12
+ "0110000000000000", -- | ## | 13
+ "0110000000000000", -- | ## | 14
+ "0110000000000000", -- | ## | 15
+ -- ASCII 255 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0110011000000000", -- | ## ## | 03
+ "0110011000000000", -- | ## ## | 04
+ "0000000000000000", -- | | 05
+ "1100001100000000", -- |## ## | 06
+ "1100001100000000", -- |## ## | 07
+ "0110011000000000", -- | ## ## | 08
+ "0110011000000000", -- | ## ## | 09
+ "0011110000000000", -- | #### | 10
+ "0011110000000000", -- | #### | 11
+ "0001100000000000", -- | ## | 12
+ "0001100000000000", -- | ## | 13
+ "0011000000000000", -- | ## | 14
+ "0110000000000000", -- | ## | 15
+ -- ASCII 256 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 257 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 258 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 259 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 260 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 261 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 262 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 263 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 264 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 265 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 266 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 267 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 268 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 269 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 270 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 271 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 272 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 273 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 274 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 275 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 276 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 277 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 278 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 279 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 280 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 281 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 282 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 283 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 284 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 285 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 286 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000", -- | | 15
+ -- ASCII 287 ---------------
+ "0000000000000000", -- | | 00
+ "0000000000000000", -- | | 01
+ "0000000000000000", -- | | 02
+ "0000000000000000", -- | | 03
+ "0000000000000000", -- | | 04
+ "0000000000000000", -- | | 05
+ "0000000000000000", -- | | 06
+ "0000000000000000", -- | | 07
+ "0000000000000000", -- | | 08
+ "0000000000000000", -- | | 09
+ "0000000000000000", -- | | 10
+ "0000000000000000", -- | | 11
+ "0000000000000000", -- | | 12
+ "0000000000000000", -- | | 13
+ "0000000000000000", -- | | 14
+ "0000000000000000" -- | | 15
+ );
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+
+end RTL;
+
diff --git a/lib/VGA_ctrl/src/fonts/char_rom_the_goonies.vhd b/lib/VGA_ctrl/src/fonts/char_rom_the_goonies.vhd
new file mode 100644
index 0000000..f5bbcc5
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/char_rom_the_goonies.vhd
@@ -0,0 +1,539 @@
+library ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity char_rom is
+ port (
+ CLK : in std_logic;
+ ADDR : in unsigned(11 downto 0);
+ DATA : out unsigned(7 downto 0)
+ );
+end;
+
+architecture RTL of char_rom is
+
+
+ type ROM_ARRAY is array(0 to 4095) of unsigned(7 downto 0);
+ constant ROM : ROM_ARRAY := (
+ x"00",x"00",x"01",x"03",x"07",x"0F",x"0F",x"0F", -- 0x0000
+ x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0008
+ x"00",x"00",x"E0",x"F0",x"F8",x"FC",x"FC",x"FC", -- 0x0010
+ x"00",x"00",x"01",x"07",x"1F",x"3F",x"7F",x"7F", -- 0x0018
+ x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0020
+ x"00",x"00",x"E0",x"F0",x"F8",x"F8",x"F8",x"F8", -- 0x0028
+ x"00",x"00",x"07",x"1F",x"7F",x"FF",x"FF",x"FF", -- 0x0030
+ x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"8F", -- 0x0038
+ x"00",x"00",x"C3",x"E3",x"F1",x"F1",x"F1",x"F1", -- 0x0040
+ x"00",x"00",x"F8",x"FC",x"FE",x"FE",x"FE",x"FE", -- 0x0048
+ x"00",x"00",x"1F",x"1F",x"0F",x"0F",x"0F",x"0F", -- 0x0050
+ x"00",x"00",x"81",x"C3",x"E2",x"E2",x"E2",x"E2", -- 0x0058
+ x"00",x"00",x"FC",x"06",x"FA",x"72",x"DA",x"FA", -- 0x0060
+ x"00",x"00",x"03",x"0F",x"3F",x"7F",x"7F",x"7F", -- 0x0068
+ x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"C7", -- 0x0070
+ x"00",x"00",x"E0",x"F0",x"F8",x"F8",x"F8",x"F8", -- 0x0078
+ x"00",x"00",x"07",x"1F",x"7F",x"FF",x"FF",x"FF", -- 0x0080
+ x"00",x"00",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0088
+ x"00",x"00",x"80",x"C0",x"C0",x"E0",x"E0",x"F0", -- 0x0090
+ x"00",x"00",x"3F",x"3F",x"06",x"06",x"06",x"06", -- 0x0098
+ x"00",x"00",x"D8",x"D8",x"18",x"1F",x"1F",x"18", -- 0x00A0
+ x"00",x"00",x"DF",x"DF",x"D8",x"DE",x"DE",x"D8", -- 0x00A8
+ x"00",x"00",x"80",x"80",x"00",x"00",x"00",x"00", -- 0x00B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x00F8
+ x"1F",x"1F",x"1F",x"1F",x"1F",x"1F",x"1F",x"3F", -- 0x0100
+ x"C1",x"C0",x"C0",x"C0",x"C0",x"C0",x"C0",x"80", -- 0x0108
+ x"FC",x"F8",x"F0",x"00",x"00",x"00",x"00",x"00", -- 0x0110
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0118
+ x"FF",x"C3",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0120
+ x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8", -- 0x0128
+ x"FF",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE", -- 0x0130
+ x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"07", -- 0x0138
+ x"F1",x"F1",x"F1",x"F1",x"F1",x"F1",x"F1",x"F1", -- 0x0140
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0148
+ x"0F",x"0F",x"0F",x"8F",x"8F",x"8F",x"DF",x"FF", -- 0x0150
+ x"E3",x"E3",x"E1",x"E0",x"E1",x"E1",x"E1",x"E3", -- 0x0158
+ x"56",x"8E",x"FC",x"00",x"FF",x"FE",x"FE",x"FC", -- 0x0160
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0168
+ x"83",x"03",x"03",x"0F",x"3F",x"FF",x"FF",x"FC", -- 0x0170
+ x"F8",x"F8",x"F8",x"F8",x"F0",x"C0",x"00",x"00", -- 0x0178
+ x"FF",x"FF",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE", -- 0x0180
+ x"E7",x"87",x"07",x"07",x"07",x"00",x"00",x"FF", -- 0x0188
+ x"F0",x"F0",x"F0",x"E0",x"80",x"00",x"00",x"80", -- 0x0190
+ x"06",x"06",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0198
+ x"18",x"18",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A0
+ x"DF",x"DF",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01A8
+ x"80",x"80",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x01F8
+ x"3F",x"3F",x"3F",x"3F",x"3F",x"3F",x"7F",x"7F", -- 0x0200
+ x"80",x"80",x"80",x"83",x"87",x"87",x"07",x"06", -- 0x0208
+ x"00",x"1C",x"7C",x"FC",x"FC",x"FC",x"F0",x"F0", -- 0x0210
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0218
+ x"03",x"03",x"03",x"03",x"03",x"03",x"03",x"03", -- 0x0220
+ x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8", -- 0x0228
+ x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE",x"FE", -- 0x0230
+ x"07",x"07",x"07",x"07",x"07",x"07",x"07",x"0F", -- 0x0238
+ x"F1",x"F1",x"F1",x"F1",x"F1",x"F1",x"F1",x"F1", -- 0x0240
+ x"FF",x"FF",x"FF",x"FF",x"FE",x"FC",x"FC",x"FC", -- 0x0248
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"7F",x"7F",x"7F", -- 0x0250
+ x"E3",x"E3",x"E3",x"E3",x"E3",x"E3",x"E3",x"E3", -- 0x0258
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FC", -- 0x0260
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0268
+ x"F0",x"C0",x"03",x"07",x"07",x"07",x"03",x"01", -- 0x0270
+ x"18",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8", -- 0x0278
+ x"FF",x"FF",x"FF",x"FC",x"E0",x"06",x"1E",x"FE", -- 0x0280
+ x"FF",x"FF",x"FF",x"0F",x"07",x"07",x"07",x"07", -- 0x0288
+ x"C0",x"C0",x"E0",x"E0",x"F0",x"F0",x"F0",x"F0", -- 0x0290
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0298
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x02F8
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"3F",x"1F",x"0F", -- 0x0300
+ x"00",x"00",x"00",x"80",x"FF",x"FF",x"FF",x"FF", -- 0x0308
+ x"F0",x"78",x"7C",x"FC",x"FC",x"F8",x"F0",x"E0", -- 0x0310
+ x"7F",x"7F",x"7F",x"7F",x"3F",x"1F",x"0F",x"07", -- 0x0318
+ x"8F",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0320
+ x"F8",x"F8",x"F8",x"F8",x"F8",x"F0",x"E0",x"C0", -- 0x0328
+ x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"7F",x"3F", -- 0x0330
+ x"1F",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0338
+ x"F1",x"F1",x"F1",x"F1",x"E1",x"C1",x"81",x"03", -- 0x0340
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"FE",x"FF", -- 0x0348
+ x"7F",x"3F",x"3F",x"3F",x"3F",x"1F",x"1F",x"1F", -- 0x0350
+ x"E3",x"E3",x"E3",x"E3",x"E3",x"E3",x"E3",x"C7", -- 0x0358
+ x"FC",x"FC",x"FC",x"FC",x"FC",x"FC",x"F8",x"F0", -- 0x0360
+ x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F",x"7F", -- 0x0368
+ x"01",x"03",x"07",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0370
+ x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8",x"F8", -- 0x0378
+ x"FE",x"FE",x"FE",x"FF",x"FF",x"7F",x"1F",x"07", -- 0x0380
+ x"07",x"07",x"0F",x"FF",x"FF",x"FF",x"FF",x"FF", -- 0x0388
+ x"F0",x"F0",x"F0",x"F0",x"FF",x"EF",x"C3",x"83", -- 0x0390
+ x"00",x"00",x"00",x"00",x"DB",x"DF",x"1F",x"1B", -- 0x0398
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x03F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0400
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0408
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0410
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0418
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0420
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0428
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0430
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0438
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0440
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0448
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0450
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0458
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0460
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0468
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0470
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0478
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0480
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0488
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0490
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0498
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x04F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0500
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0508
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0510
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0518
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0520
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0528
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0530
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0538
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0540
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0548
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0550
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0558
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0560
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0568
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0570
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0578
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0580
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0588
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0590
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0598
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x05F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0600
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0608
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0610
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0618
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0620
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0628
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0630
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0638
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0640
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0648
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0650
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0658
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0660
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0668
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0670
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0678
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0680
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0688
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0690
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0698
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x06F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0700
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0708
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0710
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0718
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0720
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0728
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0730
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0738
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0740
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0748
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0750
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0758
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0760
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0768
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0770
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0778
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0780
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0788
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0790
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0798
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x07F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0800
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0808
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0810
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0818
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0820
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0828
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0830
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0838
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0840
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0848
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0850
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0858
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0860
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0868
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0870
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0878
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0880
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0888
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0890
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0898
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x08F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0900
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0908
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0910
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0918
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0920
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0928
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0930
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0938
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0940
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0948
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0950
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0958
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0960
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0968
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0970
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0978
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0980
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0988
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0990
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0998
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09A8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09B8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09C8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09D8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09E8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x09F8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0A98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0AF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0B98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0BF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0C98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0CF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0D98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0DF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0E98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0ED0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0ED8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0EF8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F00
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F08
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F10
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F18
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F20
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F28
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F30
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F38
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F40
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F48
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F50
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F58
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F60
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F68
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F70
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F78
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F80
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F88
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F90
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0F98
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FA8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FB8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FC8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FD8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FE8
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00", -- 0x0FF0
+ x"00",x"00",x"00",x"00",x"00",x"00",x"00",x"00" -- 0x0FF8
+ );
+
+begin
+
+ p_rom : process
+ begin
+ wait until rising_edge(CLK);
+ DATA <= ROM(to_integer(unsigned(ADDR)));
+ end process;
+end RTL;
diff --git a/lib/VGA_ctrl/src/fonts/make_rom.bat b/lib/VGA_ctrl/src/fonts/make_rom.bat
new file mode 100644
index 0000000..9cfa61b
--- /dev/null
+++ b/lib/VGA_ctrl/src/fonts/make_rom.bat
@@ -0,0 +1,6 @@
+@echo off
+
+bff2rom fixedsys_8x15.bff y >char_rom_fixedsys_8x15.vhd
+bff2rom fixedsys_8x16.bff y >char_rom_fixedsys_8x16.vhd
+bff2rom fixedsys_9x16.bff y >char_rom_fixedsys_9x16.vhd
+bff2rom System_16x16.bff y >char_rom_system_16x16.vhd
diff --git a/lib/VGA_ctrl/src/linefifo.vhd b/lib/VGA_ctrl/src/linefifo.vhd
new file mode 100644
index 0000000..4336ede
--- /dev/null
+++ b/lib/VGA_ctrl/src/linefifo.vhd
@@ -0,0 +1,121 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: Dual-ported register file with asynchrous read
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+use work.vga_types.all;
+
+entity linefifo is
+ Generic
+ (
+ depth : natural := 64;
+ almost_full_thresh : natural := 60;
+ almost_empty_thresh : natural := 4
+ );
+ Port
+ (
+ rst : in STD_LOGIC;
+ clk_w : in STD_LOGIC;
+ clk_r : in STD_LOGIC;
+ we_w : in STD_LOGIC;
+ re_r : in STD_LOGIC;
+ fifo_full : out STD_LOGIC;
+ fifo_empty : out STD_LOGIC;
+ fifo_afull : out STD_LOGIC;
+ fifo_aempty : out STD_LOGIC;
+ color_w : in color_t;
+ color_r : out color_t
+ );
+end linefifo;
+
+architecture Behavioral of linefifo is
+
+ constant data_width : integer := 8;
+ constant addr_width : integer := NextExpBaseTwo(depth);
+
+ signal buf_we_w : STD_LOGIC;
+ signal ptr_w : unsigned (ADDR_WIDTH-1 downto 0);
+ signal ptr_r : unsigned (ADDR_WIDTH-1 downto 0);
+ signal full : STD_LOGIC;
+ signal empty : STD_LOGIC;
+ signal almost_full : STD_LOGIC;
+ signal almost_empty : STD_LOGIC;
+
+begin
+
+ buf_we_w <= we_w;
+ fifo_full <= full;
+ fifo_empty <= empty;
+ fifo_afull <= almost_full;
+ fifo_aempty <= almost_empty;
+
+gen_line:
+ for c in color_range_t generate
+ begin
+ inst_dpram: entity work.dpram
+ GENERIC MAP
+ (
+ addr_width => addr_width,
+ data_width => data_width
+ )
+ PORT MAP(
+ clka => clk_w,
+ clkb => clk_r,
+ en_a => '1',
+ en_b => '1',
+ we_a => buf_we_w,
+ addr_a => ptr_w,
+ addr_b => ptr_r,
+ din_a => color_w(c),
+ dout_b => color_r(c)
+ );
+ end generate;
+
+ inst_fifo_ctrl: entity work.async_fifo_ctrl
+ GENERIC MAP
+ (
+ addr_width => ADDR_WIDTH,
+ almost_full_thresh => almost_full_thresh,
+ almost_empty_thresh => almost_empty_thresh
+ )
+ PORT MAP
+ (
+ rst => rst,
+ clk_w => clk_w,
+ clk_r => clk_r,
+ we => we_w,
+ re => re_r,
+ ptr_w => ptr_w,
+ ptr_r => ptr_r,
+ fifo_full => full,
+ fifo_empty => empty,
+ fifo_afull => almost_full,
+ fifo_aempty => almost_empty
+
+ );
+
+end Behavioral;
+
diff --git a/lib/VGA_ctrl/src/vga_backend.vhd b/lib/VGA_ctrl/src/vga_backend.vhd
new file mode 100644
index 0000000..2994eec
--- /dev/null
+++ b/lib/VGA_ctrl/src/vga_backend.vhd
@@ -0,0 +1,223 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 11:25:45 10/15/05
+-- Design Name:
+-- Module Name: vga_backend - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+use work.vga_types.all;
+
+entity vga_backend is
+ Generic
+ (
+ sys_freq : integer := 100E6;
+ fifo_depth : integer := 2048;
+ fifo_almost_full_thresh : natural := 2000;
+ fifo_almost_empty_thresh : natural := 48;
+ tsvga : vga_timespec_t := ts_vga_800_600_72
+ );
+ Port
+ (
+ -- System signals
+ sys_rst : in std_logic;
+ sys_clk : in std_logic;
+ vga_ready : out std_logic;
+
+ -- Buffered channel (Graphics plane)
+ color_in : in color_t;
+ color_fifo_we : in std_logic;
+ color_fifo_full : out std_logic;
+ color_fifo_afull : out std_logic;
+
+ -- Direct channel (Character plane)
+ direct_color_in : in color_t;
+ direct_draw_en : in std_logic;
+
+ -- Status signals
+ stat_hsync : out std_logic;
+ stat_vsync : out std_logic;
+ stat_hready : out std_logic;
+ stat_vready : out std_logic;
+ stat_hscan : out std_logic;
+ stat_vscan : out std_logic;
+ stat_hpos : out natural range 0 to tsvga.ts_h.ncyc_scan-1;
+ stat_vpos : out natural range 0 to tsvga.ts_v.ncyc_scan-1;
+
+ -- VGA domain signals
+ vga_clk_out : out std_logic;
+ vga_color_out : out color_t;
+ vga_blank_n : out std_logic;
+ vga_sync_n : out std_logic;
+ vga_hsync : out std_logic;
+ vga_vsync : out std_logic
+ );
+end vga_backend;
+
+architecture Behavioral of vga_backend is
+
+ signal scan_enable : std_logic;
+ signal fifo_full : std_logic;
+ signal fifo_empty : std_logic;
+ signal fifo_almost_empty : std_logic;
+ signal fifo_almost_full : std_logic;
+ signal is_scan : std_logic;
+ signal is_hscan : std_logic;
+ signal is_vscan : std_logic;
+ signal hsync : std_logic;
+ signal vsync : std_logic;
+ signal hready : std_logic;
+ signal vready : std_logic;
+ signal color : color_t;
+ signal vga_clk : std_logic;
+ signal dcm_locked : std_logic;
+ signal rst : std_logic;
+
+begin
+
+ vga_clk_out <= vga_clk;
+ vga_ready <= dcm_locked;
+
+ inst_clkgen: entity work.clkgen
+ GENERIC MAP
+ (
+ sys_freq => sys_freq,
+ tsvga => tsvga
+ )
+ PORT MAP
+ (
+ rst => sys_rst,
+ clk => sys_clk,
+ vga_clk => vga_clk,
+ dcm_locked => dcm_locked
+ );
+
+ inst_vga_timing: entity work.vga_timing
+ GENERIC MAP
+ (
+ tsvga => tsvga
+ )
+ PORT MAP
+ (
+ sys_rst => sys_rst,
+ vga_clk => vga_clk,
+ vga_ce => dcm_locked,
+ sync_h => hsync,
+ sync_v => vsync,
+ scan_pos_h => stat_hpos,
+ scan_pos_v => stat_vpos,
+ is_scan_h => is_hscan,
+ is_scan_v => is_vscan,
+ scan_rdy_h => hready,
+ scan_rdy_v => vready
+ );
+
+ inst_linefifo: entity work.linefifo
+ GENERIC MAP
+ (
+ depth => fifo_depth,
+ almost_full_thresh => fifo_almost_full_thresh,
+ almost_empty_thresh => fifo_almost_empty_thresh
+ )
+ PORT MAP(
+ rst => sys_rst,
+ clk_w => sys_clk,
+ clk_r => vga_clk,
+ we_w => color_fifo_we,
+ re_r => is_scan,
+ color_w => color_in,
+ color_r => color,
+ fifo_full => fifo_full,
+ fifo_empty => fifo_empty,
+ fifo_afull => fifo_almost_full,
+ fifo_aempty => fifo_almost_empty
+
+ );
+
+ ---------------------------------------------------------------------------------------------
+ rst <= not dcm_locked;
+ stat_hsync <= hsync;
+ stat_vsync <= vsync;
+ stat_hscan <= is_hscan;
+ stat_vscan <= is_vscan;
+ stat_hready <= hready;
+ stat_vready <= vready;
+
+ vga_blank_n <= '1';
+ vga_sync_n <= '0';
+ is_scan <= is_hscan and is_vscan and scan_enable;
+
+ color_fifo_full <= fifo_full;
+ color_fifo_afull <= fifo_almost_full;
+
+ ---------------------------------------------------------------------------------------------
+ proc_vga_start:
+ process (rst, vga_clk)
+ begin
+ if rst = '1' then
+ scan_enable <= '0';
+ elsif rising_edge(vga_clk) then
+ if vsync = '1' then
+ if fifo_empty = '0' then
+ scan_enable <= '1';
+ else
+ scan_enable <= '0';
+ end if;
+ end if;
+ end if;
+ end process;
+
+ proc_vga_color_out:
+ process (rst, vga_clk)
+ variable do_scan : std_logic;
+ begin
+ if rst = '1' then
+ do_scan := '0';
+ elsif rising_edge(vga_clk) then
+ vga_color_out <= (X"00", X"00", X"00");
+ if do_scan = '1' then
+ if direct_draw_en = '1' then
+ vga_color_out <= direct_color_in;
+ else
+ vga_color_out <= color;
+ end if;
+ end if;
+ do_scan := is_scan;
+ end if;
+ end process;
+
+ ---------------------------------------------------------------------------------------------
+ proc_vga_sync_out:
+ process (rst, vga_clk)
+ variable hsync_r : std_logic;
+ variable vsync_r : std_logic;
+ begin
+ if rst = '1' then
+ vga_hsync <= tsvga.ts_h.sync_polarity;
+ vga_vsync <= tsvga.ts_v.sync_polarity;
+ hsync_r := tsvga.ts_h.sync_polarity;
+ vsync_r := tsvga.ts_v.sync_polarity;
+ elsif rising_edge(vga_clk) then
+ vga_hsync <= hsync_r;
+ vga_vsync <= vsync_r;
+ hsync_r := hsync xor (not tsvga.ts_h.sync_polarity);
+ vsync_r := vsync xor (not tsvga.ts_v.sync_polarity);
+ end if;
+ end process;
+
+end Behavioral;
diff --git a/lib/VGA_ctrl/src/vga_sync.vhd b/lib/VGA_ctrl/src/vga_sync.vhd
new file mode 100644
index 0000000..56e4384
--- /dev/null
+++ b/lib/VGA_ctrl/src/vga_sync.vhd
@@ -0,0 +1,127 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 11:15:39 10/21/05
+-- Design Name:
+-- Module Name: fsm_scan - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+use work.vga_types.all;
+
+entity vga_sync is
+ Generic
+ (
+ ts : scan_timespec_t := (4,2,1,3,'0')
+ );
+ Port
+ (
+ rst : in std_logic;
+ clk : in std_logic;
+ ce : in std_logic;
+ pos : out natural range 0 to ts.ncyc_scan-1;
+ sync : out std_logic;
+ is_scan : out std_logic;
+ rdy_scan : out std_logic
+ );
+ end vga_sync;
+
+architecture Behavioral of vga_sync is
+
+ type timing_state_t is (st_init, st_scan, st_front, st_sync, st_back);
+
+ -- Counter
+ signal state, next_state : timing_state_t;
+ signal count_srst : std_logic;
+ signal count : natural range 0 to ts.ncyc_scan-1;
+
+begin
+
+ pos <= count;
+
+---------------------------------------------------------------------------------------------
+counter:
+ process (clk)
+ begin
+ if rising_edge(clk) then
+ if ce = '1' then
+ if count_srst = '1' then
+ count <= 0;
+ else
+ count <= count + 1;
+ end if;
+ end if;
+ end if;
+ end process;
+
+---------------------------------------------------------------------------------------------
+SYNC_TIMING:
+process (state, count)
+ begin
+ count_srst <= '0';
+ rdy_scan <= '0';
+ is_scan <= '0';
+ sync <= '0';
+
+ next_state <= state; --default is to stay in current state
+
+ case (state) is
+
+ when st_init =>
+ count_srst <= '1';
+ next_state <= st_front;
+ when st_front =>
+ if count = ts.ncyc_porch_front - 1 then
+ count_srst <= '1';
+ next_state <= st_sync;
+ end if;
+ when st_sync =>
+ sync <= '1';
+ if count = ts.ncyc_sync_pulse - 1 then
+ count_srst <= '1';
+ next_state <= st_back;
+ end if;
+ when st_back =>
+ if count = ts.ncyc_porch_back - 1 then
+ count_srst <= '1';
+ next_state <= st_scan;
+ end if;
+ when st_scan =>
+ is_scan <= '1';
+ if count = ts.ncyc_scan - 1 then
+ count_srst <= '1';
+ rdy_scan <= '1';
+ next_state <= st_front;
+ end if;
+ when others =>
+ next_state <= st_init;
+
+ end case;
+ end process;
+
+SYNC_TIMING_NEXT:
+ process (rst, clk)
+ begin
+ if rst = '1' then
+ state <= st_init;
+ elsif rising_edge(clk) and ce = '1' then
+ state <= next_state;
+ end if;
+ end process;
+
+---------------------------------------------------------------------------------------------
+end Behavioral;
diff --git a/lib/VGA_ctrl/src/vga_timing.vhd b/lib/VGA_ctrl/src/vga_timing.vhd
new file mode 100644
index 0000000..c110652
--- /dev/null
+++ b/lib/VGA_ctrl/src/vga_timing.vhd
@@ -0,0 +1,102 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 11:25:45 10/15/05
+-- Design Name:
+-- Module Name: vga_ctrl_core - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+use work.vga_types.all;
+
+entity vga_timing is
+ Generic
+ (
+ tsvga : vga_timespec_t := ts_vga_800_600_72
+ );
+ Port
+ (
+ sys_rst : in std_logic;
+ vga_clk : in std_logic;
+ vga_ce : in std_logic;
+ sync_h : out std_logic;
+ sync_v : out std_logic;
+ scan_pos_h : out natural range 0 to tsvga.ts_h.ncyc_scan-1;
+ scan_pos_v : out natural range 0 to tsvga.ts_v.ncyc_scan-1;
+ is_scan_h : out std_logic;
+ is_scan_v : out std_logic;
+ scan_rdy_h : out std_logic;
+ scan_rdy_v : out std_logic
+ );
+end vga_timing;
+
+architecture Behavioral of vga_timing is
+
+ ---------------------------------------------------------------------------------------------
+ signal is_scan_h_i : std_logic;
+ signal is_scan_v_i : std_logic;
+ signal scan_rdy_h_i : std_logic;
+ signal scan_rdy_v_i : std_logic;
+ signal sync_h_i : std_logic;
+ signal sync_v_i : std_logic;
+
+ ---------------------------------------------------------------------------------------------
+begin
+
+ is_scan_h <= is_scan_h_i;
+ is_scan_v <= is_scan_v_i;
+ scan_rdy_h <= scan_rdy_h_i;
+ scan_rdy_v <= scan_rdy_v_i;
+ sync_h <= sync_h_i;
+ sync_v <= sync_v_i;
+
+ ---------------------------------------------------------------------------------------------
+ inst_vga_sync_h: entity work.vga_sync
+ GENERIC MAP
+ (
+ ts => tsvga.ts_h
+ )
+ PORT MAP
+ (
+ rst => sys_rst,
+ clk => vga_clk,
+ ce => vga_ce,
+ pos => scan_pos_h,
+ sync => sync_h_i,
+ is_scan => is_scan_h_i,
+ rdy_scan => scan_rdy_h_i
+ );
+
+ inst_vga_sync_v: entity work.vga_sync
+ GENERIC MAP
+ (
+ ts => tsvga.ts_v
+ )
+ PORT MAP
+ (
+ rst => sys_rst,
+ clk => vga_clk,
+ ce => scan_rdy_h_i,
+ pos => scan_pos_v,
+ sync => sync_v_i,
+ is_scan => is_scan_v_i,
+ rdy_scan => scan_rdy_v_i
+ );
+
+---------------------------------------------------------------------------------------------
+
+end Behavioral;
diff --git a/lib/VGA_ctrl/src/vga_types.vhd b/lib/VGA_ctrl/src/vga_types.vhd
new file mode 100644
index 0000000..44cecbd
--- /dev/null
+++ b/lib/VGA_ctrl/src/vga_types.vhd
@@ -0,0 +1,213 @@
+-- Package File Template
+--
+-- Purpose: This package defines supplemental types, subtypes,
+-- constants, and functions
+
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+use IEEE.MATH_REAL.ALL;
+
+package vga_types is
+
+ -- Constants
+
+ -- Types
+ type color_range_t is (r, g, b);
+ type color_t is array (color_range_t) of unsigned(7 downto 0);
+
+ type scan_timespec_t is
+ record
+ ncyc_scan : integer;
+ ncyc_porch_front : integer;
+ ncyc_sync_pulse : integer;
+ ncyc_porch_back : integer;
+ sync_polarity : std_logic;
+ end record;
+
+ type vga_timespec_t is
+ record
+ f_pxl_clk : integer;
+ nfps : integer;
+ ts_h : scan_timespec_t;
+ ts_v : scan_timespec_t;
+ end record;
+
+ -----------------------------------------------------------------------
+ -- Common timimg specifications
+ -----------------------------------------------------------------------
+ -- For test bench (not for H/W use)
+ constant ts_vga_testbench : vga_timespec_t :=
+ (
+ f_pxl_clk => 100E6,
+ nfps => 6,
+ ts_h => (8,5,2,3,'0'),
+ ts_v => (6,4,2,3,'0')
+ );
+
+ -- 640 x 480 @ 60 Hz (not recommended)
+ constant ts_vga_640_480_60 : vga_timespec_t :=
+ (
+ f_pxl_clk => 25175000,
+ nfps => 60,
+ ts_h => (640,16,96,48,'0'),
+ ts_v => (480,11,2,31,'0')
+ );
+
+ -- 640 x 480 @ 72 Hz (not recommended)
+ constant ts_vga_640_480_72 : vga_timespec_t :=
+ (
+ f_pxl_clk => 31500000,
+ nfps => 72,
+ ts_h => (640,24,40,128,'0'),
+ ts_v => (480,9,3,28,'0')
+ );
+
+ -- 800 x 600 @ 60 Hz (OK)
+ constant ts_vga_800_600_60 : vga_timespec_t :=
+ (
+ f_pxl_clk => 40000000,
+ nfps => 60,
+ ts_h => (800,40,128,88,'0'),
+ ts_v => (600,1,4,23,'0')
+ );
+
+ -- 800 x 600 @ 72 Hz (OK)
+ constant ts_vga_800_600_72 : vga_timespec_t :=
+ (
+ f_pxl_clk => 50000000,
+ nfps => 72,
+ ts_h => (800,56,120,64,'0'),
+ ts_v => (600,37,6,23,'0')
+ );
+
+ -- 1024 x 768 @ 60 Hz (Noisy)
+ constant ts_vga_1024_768_60 : vga_timespec_t :=
+ (
+ f_pxl_clk => 65000000,
+ nfps => 60,
+ ts_h => (1024,24,136,160,'0'),
+ ts_v => (768,3,6,29,'0')
+ );
+
+ -- 1024 x 768 @ 70 Hz (OK)
+ constant ts_vga_1024_768_70 : vga_timespec_t :=
+ (
+ f_pxl_clk => 75000000,
+ nfps => 70,
+ ts_h => (1024,24,136,144,'0'),
+ ts_v => (768,3,6,29,'0')
+ );
+
+ -- 1280 x 1024 @ 70 Hz (Noisy)
+ constant ts_vga_1280_1024_70 : vga_timespec_t :=
+ (
+ f_pxl_clk => 125000000,
+ nfps => 70,
+ ts_h => (1280,16,176,192,'0'),
+ ts_v => (1024,3,3,42,'0')
+ );
+
+ -- 1280 x 1024 @ 72 Hz (OK)
+ constant ts_vga_1280_1024_72 : vga_timespec_t :=
+ (
+ f_pxl_clk => 130000000,
+ nfps => 72,
+ ts_h => (1280,32,160,224,'0'),
+ ts_v => (1024,2,2,33,'0')
+ );
+
+ -- Functions
+ function NextPowerOfTwo(x : natural) return natural;
+ function NextExpBaseTwo(x : natural) return natural;
+ function GCD(a, b : natural) return natural;
+ function LCM(a, b : natural) return natural;
+ function DCM_PERIOD(f_sys_hz : natural) return real;
+ function DCM_FREQ_M(f_sys_hz, f_vga_hz : natural) return natural;
+ function DCM_FREQ_D(f_sys_hz, f_vga_hz : natural) return natural;
+
+end vga_types;
+
+
+package body vga_types is
+
+ function NextExpBaseTwo(x : natural) return natural is
+ begin
+ return natural(ceil(log2(real(x))));
+ end NextExpBaseTwo;
+
+ function NextPowerOfTwo(x : natural) return natural is
+ begin
+
+ return 2**NextExpBaseTwo(x);
+ end NextPowerOfTwo;
+
+ function GCD(a, b : natural) return natural is
+ variable aa : natural;
+ variable bb : natural;
+ begin
+ aa := a;
+ bb := b;
+ while bb /= 0 loop
+ if aa > bb then
+ aa := aa - bb;
+ else
+ bb := bb - aa;
+ end if;
+ end loop;
+
+ return aa;
+
+ end GCD;
+
+ function LCM(a, b : natural) return natural is
+ begin
+
+ return (a * b)/GCD(a, b);
+
+ end LCM;
+
+ function DCM_FREQ_M(f_sys_hz, f_vga_hz : natural) return natural is
+ variable f_sys_mhz : natural;
+ variable f_vga_mhz : natural;
+ variable m : natural;
+ begin
+ f_sys_mhz := f_sys_hz/1E6;
+ f_vga_mhz := f_vga_hz/1E6;
+ m := f_vga_mhz/GCD(f_sys_mhz, f_vga_mhz);
+
+ if m = 1 then
+ m := 2;
+ end if;
+
+ return m;
+
+ end DCM_FREQ_M;
+
+ function DCM_FREQ_D(f_sys_hz, f_vga_hz : natural) return natural is
+ variable f_sys_mhz : natural;
+ variable f_vga_mhz : natural;
+ variable m : natural;
+ variable d : natural;
+ begin
+ m := DCM_FREQ_M(f_sys_hz, f_vga_hz);
+ f_sys_mhz := f_sys_hz/1E6;
+ f_vga_mhz := f_vga_hz/1E6;
+ d := m*f_sys_mhz/f_vga_mhz;
+
+ return d;
+
+ end DCM_FREQ_D;
+
+ function DCM_PERIOD(f_sys_hz : natural) return real is
+ begin
+
+ return 1.0E9/real(f_sys_hz);
+
+ end DCM_PERIOD;
+
+
+end vga_types;
+
+
diff --git a/lib/filter/sim/eval_lowpass.m b/lib/filter/sim/eval_lowpass.m
new file mode 100644
index 0000000..ccac021
--- /dev/null
+++ b/lib/filter/sim/eval_lowpass.m
@@ -0,0 +1,37 @@
+function eval_filter(N)
+omega_lp = 0.15
+omega_hp = 0.05
+
+omega_bp_m = 0.02;
+bw2_bp = 0.02;
+
+lp = lowpass(N, omega_lp, 1.0);
+coef_lp = hann(N)'.*lp./sum(lp.^2);
+
+hp = lowpass(N, 0.5-omega_hp, 1.0).*cos(pi*(0:N-1));
+coef_hp = hp./sum(hp.^2).*hann(N)';
+
+bp = lowpass(N, bw2_bp/2, 1.0).*cos(2*pi*omega_bp_m*(0:N-1));
+coef_bp = bp./sum(bp.^2).*hann(N)';
+
+abs_lp = 20*log10(abs(fft(coef_lp)));
+abs_hp = 20*log10(abs(fft(coef_hp)));
+abs_bp = 20*log10(abs(fft(coef_bp)));
+
+close all;
+plot((0:N/2)/N, abs_lp(1:N/2+1));grid;
+figure
+plot((0:N/2)/N, abs_hp(1:N/2+1));grid;
+figure
+plot((0:N/2)/N, abs_bp(1:N/2+1));grid;
+
+figure
+plot((0:N-1), coef_lp);grid;
+figure
+plot((0:N-1), coef_hp);grid;
+figure
+plot((0:N-1), coef_bp);grid;
+
+mean_lp = mean(coef_lp-mean(coef_lp))
+mean_hp = mean(coef_hp)
+mean_bp = mean(coef_bp)
diff --git a/lib/filter/sim/lowpass.m b/lib/filter/sim/lowpass.m
new file mode 100644
index 0000000..292964d
--- /dev/null
+++ b/lib/filter/sim/lowpass.m
@@ -0,0 +1,20 @@
+function coef = lowpass(N, omega, scale)
+
+phi = 0;
+dphi = 2*omega;
+if (mod(N, 2) == 0)
+ M = N/2;
+ for i=0:M-1,
+ phi = phi + dphi;
+ coef(M+i+1) = scale*sinc(phi);
+ coef(M-i-1+1) = coef(M+i+1);
+ end;
+else
+ M = (N-1)/2;
+ for i=1:M,
+ phi = phi + dphi;
+ coef(M+i+1) = scale*sinc(phi);
+ coef(M-i+1) = coef(M+i+1);
+ end;
+ coef(M+1) = scale*Sinc(0.0);
+end;
diff --git a/lib/filter/sim/tb_fir_iterative.fdo b/lib/filter/sim/tb_fir_iterative.fdo
new file mode 100644
index 0000000..d4f35ff
--- /dev/null
+++ b/lib/filter/sim/tb_fir_iterative.fdo
@@ -0,0 +1,16 @@
+vlib work
+vcom -explicit -93 "../../../lib/fixed/fixed_pkg_c.vhd"
+vcom -explicit -93 "../../../lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd"
+vcom -explicit -93 "../../../lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd"
+vcom -explicit -93 "../src/filter_pkg.vhd"
+vcom -explicit -93 "../src/fir_stage_pkg.vhd"
+vcom -explicit -93 "../src/fir_stage.vhd"
+vcom -explicit -93 "../src/fir_iterative_pkg.vhd"
+vcom -explicit -93 "../src/fir_iterative.vhd"
+vcom -explicit -93 "../src/tb_fir_iterative.vhd"
+vsim -t 1ps -lib work tb_fir_iterative
+do {tb_fir_iterative.wdo}
+view wave
+view structure
+view signals
+run 20us
diff --git a/lib/filter/sim/tb_fir_iterative.wdo b/lib/filter/sim/tb_fir_iterative.wdo
new file mode 100644
index 0000000..1832c4e
--- /dev/null
+++ b/lib/filter/sim/tb_fir_iterative.wdo
@@ -0,0 +1,86 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/srst
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/clk
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/h_addr
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/ready
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/x_din
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/s
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/xo
+add wave -noupdate -format Literal /tb_fir_iterative/coeffs
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/xtap_cnt_w
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/xtap_cnt_r
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/htap_cnt
+add wave -noupdate -format Literal /tb_fir_iterative/xi
+add wave -noupdate -format Literal /tb_fir_iterative/yo
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/stage_en
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/fir_stage_clr
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/fir_stage_en
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/cnt_reset
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/x_valid
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/valid
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/y_valid
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/y_dout
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/new_round
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/x_stage
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/h_din
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/ymem
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/xmem
+add wave -noupdate -divider {Xmem Dual}
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/srst
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/clk
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/h_addr
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/ready
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/x_din
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/s
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/xo
+add wave -noupdate -format Literal /tb_fir_iterative/coeffs
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/xtap_cnt_w
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/xtap_cnt_r
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/htap_cnt
+add wave -noupdate -format Analog-Step -scale 10.0 /tb_fir_iterative/xi
+add wave -noupdate -format Analog-Step -scale 10.0 /tb_fir_iterative/yo
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/stage_en
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/valid
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/y_valid
+add wave -noupdate -format Logic /tb_fir_iterative/y_valid
+add wave -noupdate -format Analog-Step -radix decimal -scale 0.00061037000000000005 /tb_fir_iterative/uut_fir_iterative/y_dout
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/x_valid
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/new_round
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/x_stage
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/h_din
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/y_stage
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/ymem
+add wave -noupdate -divider {FIR Stage}
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/clk
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/in_valid
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/y_out_clr
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/x_in
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/h_in
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/y_in
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/xin
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/hin
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/yin
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/prod
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/x_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/y_out
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/valid
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/p_valid
+add wave -noupdate -format Literal /tb_fir_iterative/uut_fir_iterative/s
+add wave -noupdate -format Logic /tb_fir_iterative/uut_fir_iterative/inst_fir_stage/out_valid
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {1892287 ps} 0}
+configure wave -namecolwidth 140
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+update
+WaveRestoreZoom {1750644 ps} {2771198 ps}
diff --git a/lib/filter/sim/tb_fir_parallel b/lib/filter/sim/tb_fir_parallel
new file mode 100644
index 0000000..f784c1a
Binary files /dev/null and b/lib/filter/sim/tb_fir_parallel differ
diff --git a/lib/filter/sim/tb_fir_parallel.fdo b/lib/filter/sim/tb_fir_parallel.fdo
new file mode 100644
index 0000000..9e15809
--- /dev/null
+++ b/lib/filter/sim/tb_fir_parallel.fdo
@@ -0,0 +1,16 @@
+vlib work
+vcom -explicit -93 "../../../lib/fixed/fixed_pkg_c.vhd"
+vcom -explicit -93 "../../../lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd"
+vcom -explicit -93 "../../../lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd"
+vcom -explicit -93 "../src/filter_pkg.vhd"
+vcom -explicit -93 "../src/fir_stage_pkg.vhd"
+vcom -explicit -93 "../src/fir_stage.vhd"
+vcom -explicit -93 "../src/fir_parallel_pkg.vhd"
+vcom -explicit -93 "../src/fir_parallel.vhd"
+vcom -explicit -93 "../src/tb_fir_parallel.vhd"
+vsim -t 1ps -lib work tb_fir_parallel
+do {tb_fir_parallel.wdo}
+view wave
+view structure
+view signals
+run 1000us
diff --git a/lib/filter/sim/tb_fir_parallel.wdo b/lib/filter/sim/tb_fir_parallel.wdo
new file mode 100644
index 0000000..f0e20ce
--- /dev/null
+++ b/lib/filter/sim/tb_fir_parallel.wdo
@@ -0,0 +1,29 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_fir_parallel/clk
+add wave -noupdate -format Logic /tb_fir_parallel/srst
+add wave -noupdate -format Logic /tb_fir_parallel/in_valid
+add wave -noupdate -format Literal -radix decimal /tb_fir_parallel/x_in
+add wave -noupdate -format Literal -radix decimal /tb_fir_parallel/y_out
+add wave -noupdate -format Logic /tb_fir_parallel/out_valid
+add wave -noupdate -format Logic /tb_fir_parallel/fileout_enable
+add wave -noupdate -format Analog-Interpolated -scale 10.0 /tb_fir_parallel/xi
+add wave -noupdate -format Analog-Interpolated -scale 10.0 /tb_fir_parallel/yo
+add wave -noupdate -format Literal -radix decimal /tb_fir_parallel/coeff_in
+add wave -noupdate -format Literal -radix decimal /tb_fir_parallel/uut_fir_parallel/h
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {19450000 ps} 0}
+configure wave -namecolwidth 140
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+update
+WaveRestoreZoom {0 ps} {25152750 ps}
diff --git a/lib/filter/sim/tb_fir_results.m b/lib/filter/sim/tb_fir_results.m
new file mode 100644
index 0000000..75a542c
--- /dev/null
+++ b/lib/filter/sim/tb_fir_results.m
@@ -0,0 +1,10 @@
+% Read data
+function tb_fir_results()
+fir = TEXTREAD('fir.txt')';
+
+N= length(fir);
+
+% Output
+close all;
+plot(0:N-1, fir); grid;
+
diff --git a/lib/filter/sim/tb_fir_stage.fdo b/lib/filter/sim/tb_fir_stage.fdo
new file mode 100644
index 0000000..9b4379d
--- /dev/null
+++ b/lib/filter/sim/tb_fir_stage.fdo
@@ -0,0 +1,14 @@
+vlib work
+vcom -explicit -93 "../../../lib/fixed/fixed_pkg_c.vhd"
+vcom -explicit -93 "../../../lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd"
+vcom -explicit -93 "../../../lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd"
+vcom -explicit -93 "../src/filter_pkg.vhd"
+vcom -explicit -93 "../src/fir_stage_pkg.vhd"
+vcom -explicit -93 "../src/fir_stage.vhd"
+vcom -explicit -93 "../src/tb_fir_stage.vhd"
+vsim -t 1ps -lib work tb_fir_stage
+do {tb_fir_stage.wdo}
+view wave
+view structure
+view signals
+run 2us
diff --git a/lib/filter/sim/tb_fir_stage.wdo b/lib/filter/sim/tb_fir_stage.wdo
new file mode 100644
index 0000000..916de83
--- /dev/null
+++ b/lib/filter/sim/tb_fir_stage.wdo
@@ -0,0 +1,31 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_fir_stage/clk
+add wave -noupdate -format Logic /tb_fir_stage/srst
+add wave -noupdate -divider Input
+add wave -noupdate -format Logic /tb_fir_stage/in_valid
+add wave -noupdate -format Literal -radix decimal /tb_fir_stage/x_in
+add wave -noupdate -format Literal /tb_fir_stage/xi
+add wave -noupdate -divider Output
+add wave -noupdate -format Logic /tb_fir_stage/out_valid
+add wave -noupdate -format Literal -radix decimal /tb_fir_stage/y_out
+add wave -noupdate -format Analog-Step -scale 10.0 /tb_fir_stage/yo
+add wave -noupdate -divider {Stage signals}
+add wave -noupdate -format Literal -radix decimal /tb_fir_stage/x
+add wave -noupdate -format Literal -radix decimal /tb_fir_stage/y
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {1655000 ps} 0}
+configure wave -namecolwidth 140
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+update
+WaveRestoreZoom {0 ps} {2100 ns}
diff --git a/lib/filter/src/filter_pkg.vhd b/lib/filter/src/filter_pkg.vhd
new file mode 100644
index 0000000..22be814
--- /dev/null
+++ b/lib/filter/src/filter_pkg.vhd
@@ -0,0 +1,227 @@
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use ieee.numeric_std.all;
+use IEEE.MATH_REAL.ALL;
+
+-------------------------------------------------------------------------------
+package filter_pkg is
+
+ constant pi : real := 3.141592653589793e+000;
+ type real_array_t is array (natural range <>) of real;
+
+ function FilterCoef_Lowpass (N : positive; omega, amp : real) return real_array_t;
+ function FilterCoef_Highpass (N : positive; omega, amp : real) return real_array_t;
+ function FilterCoef_Bandpass (N : positive; bw2, omega_m, amp : real) return real_array_t;
+ function FilterCoef_Delta (N:positive; delay:natural; amp:real) return real_array_t;
+ function Window_Hamming (x : real_array_t) return real_array_t;
+ function Window_VonHann (x : real_array_t) return real_array_t;
+ function Window_Blackman (x : real_array_t) return real_array_t;
+ function Sinc (x : real) return real;
+ function FilterEnergy (x : real_array_t) return real;
+ function FilterMean (x : real_array_t) return real;
+ function FilterScale (x : real_array_t; scale : real) return real_array_t;
+ function FilterTestCoef (N : positive) return real_array_t;
+ function NextPowerOfTwo(x : real) return natural;
+
+end; -- package filter_pkg;
+
+-------------------------------------------------------------------------------
+package body filter_pkg is
+
+ function Prototype_Lowpass (N : positive; omega : real) return real_array_t is
+ variable res : real_array_t(0 to N-1);
+ variable M : positive;
+ variable phi : real := 0.0;
+ variable dphi : real := 2.0*pi*omega;
+ begin
+ if (N mod 2) = 0 then
+ M := N/2;
+ for i in 0 to M-1 loop
+ phi := phi + dphi;
+ res(M+i) := Sinc(phi);
+ res(M-i-1) := res(M+i);
+ end loop;
+ else
+ M := (N-1)/2;
+ for i in 1 to M loop
+ phi := phi + dphi;
+ res(M+i) := Sinc(phi);
+ res(M-i) := res(M+i);
+ end loop;
+ res(M) := Sinc(0.0);
+ end if;
+ return res;
+
+ end Prototype_Lowpass;
+
+ -------------------------------------------------------------------------------
+ function FilterCoef_Lowpass (N : positive; omega, amp : real) return real_array_t is
+ variable lp : real_array_t(0 to N-1);
+ begin
+ lp := Prototype_Lowpass(N, omega);
+
+ return Window_VonHann(FilterScale(lp, amp/FilterEnergy(lp)));
+
+ end FilterCoef_Lowpass;
+
+ -------------------------------------------------------------------------------
+ function FilterCoef_Highpass (N : positive; omega, amp : real) return real_array_t is
+ variable lp, res : real_array_t(0 to N-1);
+ variable phi : real := 0.0;
+ variable dphi : real := pi;
+ begin
+ lp := Prototype_Lowpass(N, 0.5-omega);
+
+ for i in 0 to N-1 loop
+ res(i) := lp(i) * cos(phi);
+ phi := phi + dphi;
+ end loop;
+
+ return Window_VonHann(FilterScale(res, amp/FilterEnergy(lp)));
+
+ end FilterCoef_Highpass;
+
+ -------------------------------------------------------------------------------
+ function FilterCoef_Bandpass (N : positive; bw2, omega_m, amp : real) return real_array_t is
+ variable lp, res, mean, sum : real_array_t(0 to N-1);
+ variable phi : real := 0.0;
+ variable dphi : real := 2.0*pi*omega_m;
+ begin
+ lp := Prototype_Lowpass(N, bw2/2.0);
+
+ for i in 0 to N-1 loop
+ res(i) := lp(i) * cos(phi);
+ phi := phi + dphi;
+ end loop;
+
+ return Window_VonHann(FilterScale(res, amp/FilterEnergy(lp)));
+
+ end FilterCoef_Bandpass;
+
+ -------------------------------------------------------------------------------
+ function FilterCoef_Delta (N:positive; delay:natural; amp:real) return real_array_t is
+ variable res : real_array_t(0 to N-1);
+ begin
+ for i in 0 to N-1 loop
+ res(i) := 0.0;
+ end loop;
+ res(delay) := amp;
+
+ return res;
+
+ end FilterCoef_Delta;
+
+ -------------------------------------------------------------------------------
+ function FilterTestCoef (N : positive) return real_array_t is
+ variable phi : real := 0.0;
+ variable dphi : real := 1.0/real(N);
+ variable res : real_array_t(0 to N-1);
+ begin
+ for i in 0 to N-1 loop
+ res(i) := phi;
+ phi := phi + dphi;
+ end loop;
+ return res;
+
+ end FilterTestCoef;
+
+ -------------------------------------------------------------------------------
+ function Window_Hamming (x : real_array_t) return real_array_t is
+ variable res : real_array_t(x'range);
+ variable phi : real := 0.0;
+ variable dphi : real := 2.0*pi/real(x'length-1);
+ begin
+ for i in x'range loop
+ res(i) := x(i) * (0.54 - 0.46*(cos(phi)));
+ phi := phi + dphi;
+ end loop;
+ return res;
+
+ end Window_Hamming;
+
+ -------------------------------------------------------------------------------
+ function Window_VonHann (x : real_array_t) return real_array_t is
+ variable res : real_array_t(x'range);
+ variable phi : real := 0.0;
+ variable dphi : real := 2.0*pi/real(x'length-1);
+ begin
+ for i in x'range loop
+ res(i) := 0.5 * x(i) * (1.0 - (cos(phi)));
+ phi := phi + dphi;
+ end loop;
+ return res;
+
+ end Window_VonHann;
+
+ -------------------------------------------------------------------------------
+ function Window_Blackman (x : real_array_t) return real_array_t is
+ variable res : real_array_t(0 to x'length-1);
+ variable phi : real := 0.0;
+ variable dphi : real := 2.0*pi/real(x'length-1);
+ begin
+ for i in x'range loop
+ res(i) := x(i) * (0.42 - 0.5*cos(phi) + 0.08*cos(2.0*phi));
+ phi := phi + dphi;
+ end loop;
+ return res;
+
+ end Window_Blackman;
+
+ -------------------------------------------------------------------------------
+ function Sinc (x : real) return real is
+ variable res : real := 1.0;
+ begin
+ if x /= 0.0 then
+ res := sin(x)/x;
+ end if;
+
+ return res;
+
+ end Sinc;
+
+ -------------------------------------------------------------------------------
+ function FilterScale (x : real_array_t; scale : real) return real_array_t is
+ variable res : real_array_t(x'range);
+ begin
+ for i in x'range loop
+ res(i) := scale * x(i);
+ end loop;
+
+ return res;
+
+ end FilterScale;
+
+ -------------------------------------------------------------------------------
+ function FilterEnergy (x : real_array_t) return real is
+ variable res : real := 0.0;
+ begin
+ for i in x'range loop
+ res := res + x(i)*x(i);
+ end loop;
+
+ return res;
+
+ end FilterEnergy;
+
+ -------------------------------------------------------------------------------
+ function FilterMean (x : real_array_t) return real is
+ variable res : real := 0.0;
+ begin
+ for i in x'range loop
+ res := res + x(i);
+ end loop;
+
+ return res/real(x'length);
+
+ end FilterMean;
+
+ -------------------------------------------------------------------------------
+ function NextPowerOfTwo(x : real) return natural is
+ begin
+ return integer(ceil(log2(x)));
+
+ end NextPowerOfTwo;
+
+-------------------------------------------------------------------------------
+end; -- package filter_pkg;
diff --git a/lib/filter/src/fir_iterative.vhd b/lib/filter/src/fir_iterative.vhd
new file mode 100644
index 0000000..24805fd
--- /dev/null
+++ b/lib/filter/src/fir_iterative.vhd
@@ -0,0 +1,352 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: fir_parallel - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.fir_stage_pkg.all;
+use work.fir_iterative_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+entity fir_iterative is
+Generic
+(
+ ntaps : integer := 33;
+ nbits_in : integer := 12;
+ nbits_in_frac : integer := 11;
+ nbits_stages : integer := 13;
+ nbits_stages_frac : integer := 11;
+ nbits_out : integer := 12;
+ nbits_out_frac : integer := 11;
+ fir_mode : fir_iterative_mode_t := normal;
+ rounding : boolean := true;
+ saturating : boolean := true
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ h_din : in sfixed;
+ h_addr_out : out unsigned(taps_nbits(ntaps, fir_mode)-1 downto 0);
+ ready : out std_logic;
+ x_valid : in std_logic;
+ x_din : in sfixed;
+ y_dout_valid : out std_logic;
+ y_dout : out sfixed
+);
+end fir_iterative;
+
+architecture Behavioral of fir_iterative is
+
+-------------------------------------------------------------------------------
+ -- Component Declaration for FIR stage
+ COMPONENT fir_stage
+ GENERIC
+ (
+ nbits_in : integer;
+ nbits_in_frac : integer;
+ nbits_out : integer;
+ nbits_out_frac : integer;
+ has_in_reg : boolean;
+ has_pipe_reg : boolean;
+ fir_mode : fir_stage_mode_t;
+ rounding : boolean;
+ saturating : boolean
+ );
+ PORT
+ (
+ srst : in std_logic;
+ clk : in std_logic;
+ in_valid : in std_logic;
+ x_in : in sfixed;
+ y_in : in sfixed;
+ h_in : in sfixed;
+ out_valid : out std_logic;
+ x_out : out sfixed;
+ y_out : out sfixed;
+ y_out_clr : in std_logic
+ );
+ END COMPONENT;
+
+ -------------------------------------------------------------------------------
+ constant fir_stage_mode : fir_stage_mode_t := transposed;
+ constant ntaps_is_even : boolean := (ntaps mod 2) = 0;
+ constant h_addr_bits : integer := taps_nbits(ntaps, fir_mode);
+
+ subtype in_t is sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+ subtype stage_t is sfixed(sproto(nbits_stages, nbits_stages_frac)'high downto sproto(nbits_stages, nbits_stages_frac)'low);
+
+ type state_t is (init, idle, start, proc, p1, p2, output);
+ signal s, sn : state_t;
+ signal x_stage, xo, y_stage : stage_t;
+ signal stage_en, cnt_en, new_round : std_logic;
+
+ subtype tap_cnt_t is natural range 0 to ntaps-1;
+ signal htap_cnt : tap_cnt_t;
+ signal xtap_cnt_w : tap_cnt_t;
+ signal xtap_cnt_r : tap_cnt_t;
+ signal stage_valid, clr_xmem, valid, fir_stage_clr, fir_stage_en, cnt_reset : std_logic;
+ subtype tap_range_t is natural range 0 to ntaps_addr(ntaps, fir_mode)-1;
+ signal h_addr : tap_range_t;
+ signal xmem_din, xmem_dout : in_t;
+ signal xmem_we, y_valid : std_logic;
+
+ type xmem_t is array (0 to ntaps-1) of in_t;
+ signal xmem : xmem_t;
+ signal y_out_reg : stage_t;
+ signal y_reg_valid : std_logic;
+
+ -------------------------------------------------------------------------------
+begin
+
+ h_addr_out <= to_unsigned(h_addr, h_addr_bits);
+ x_stage <= resize(xmem_dout, x_stage, false, false);
+
+ ----------------------------------------
+ process (clk)
+ begin
+ if rising_edge(clk) then
+ y_reg_valid <= '0';
+ if srst = '1' then
+ y_out_reg <= to_sfixed(0, sproto(nbits_out, nbits_out_frac));
+ elsif y_valid = '1' then
+ y_out_reg <= y_stage;
+ y_reg_valid <= '1';
+ end if;
+ end if;
+ end process;
+
+ process (clk)
+ begin
+ if rising_edge(clk) then
+ y_dout_valid <= '0';
+ if srst = '1' then
+ y_dout <= to_sfixed(0, sproto(nbits_out, nbits_out_frac));
+ elsif y_reg_valid = '1' then
+ y_dout <= resize(y_out_reg, sproto(nbits_out, nbits_out_frac), rounding, saturating);
+ y_dout_valid <= '1';
+ end if;
+ end if;
+ end process;
+
+ ----------------------------------------
+ proc_xmem_rw: process (clk)
+ begin
+ if rising_edge(clk) then
+ if xmem_we = '1' then
+ xmem(xtap_cnt_w) <= xmem_din;
+ end if;
+ xmem_dout <= xmem(xtap_cnt_r);
+ end if;
+ end process;
+
+ ----------------------------------------
+ proc_xmem_dinmux: process(new_round, clr_xmem, x_din, xmem_dout)
+ begin
+ xmem_din <= to_sfixed(0, xmem_din);
+ if new_round = '1' and clr_xmem = '0' then
+ xmem_din <= sfixed(x_din);
+ end if;
+ end process;
+
+ ----------------------------------------
+ proc_xmem_pointer: process(clk, new_round ,clr_xmem)
+ begin
+ xmem_we <= clr_xmem or new_round;
+ if rising_edge(clk) then
+ if srst = '1' then
+ xtap_cnt_w <= tap_cnt_t'high;
+ elsif xmem_we = '1' then
+ if xtap_cnt_w /= tap_cnt_t'low then
+ xtap_cnt_w <= xtap_cnt_w - 1;
+ else
+ xtap_cnt_w <= tap_cnt_t'high;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ ----------------------------------------
+ proc_h_addr: process(htap_cnt)
+ begin
+ if fir_mode = symmetric then
+ if ntaps_is_even then
+ if htap_cnt > ntaps/2-1 then
+ h_addr <= ntaps - htap_cnt - 1;
+ else
+ h_addr <= htap_cnt;
+ end if;
+ else
+ if htap_cnt > (ntaps-1)/2 then
+ h_addr <= ntaps - htap_cnt - 1;
+ else
+ h_addr <= htap_cnt;
+ end if;
+ end if;
+ else
+ h_addr <= htap_cnt;
+ end if;
+ end process;
+
+ ----------------------------------------
+ proc_tap_counter: process(cnt_reset, clk, htap_cnt, xtap_cnt_r, xtap_cnt_w, cnt_en)
+ begin
+ if rising_edge(clk) then
+ if cnt_reset = '1' then
+ htap_cnt <= tap_cnt_t'low;
+ xtap_cnt_r <= xtap_cnt_w;
+ elsif cnt_en = '1' then
+ if htap_cnt /= tap_cnt_t'high then
+ htap_cnt <= htap_cnt + 1;
+ else
+ htap_cnt <= tap_cnt_t'low;
+ end if;
+ if xtap_cnt_r /= tap_cnt_t'high then
+ xtap_cnt_r <= xtap_cnt_r + 1;
+ else
+ xtap_cnt_r <= tap_cnt_t'low;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ ----------------------------------------
+ proc_valid_out: process(srst, clk, valid, new_round)
+ variable val_pipe : unsigned(4 downto 0);
+ variable ctrl_pipe : unsigned(2 downto 0);
+
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ ctrl_pipe := (others => '0');
+ fir_stage_en <= '0';
+ fir_stage_clr <= '0';
+ else
+ ctrl_pipe := ctrl_pipe(ctrl_pipe'left-1 downto ctrl_pipe'right) & new_round;
+ fir_stage_en <= stage_en;
+ fir_stage_clr <= ctrl_pipe(2);
+ end if;
+ end if;
+ cnt_reset <= new_round;
+ end process;
+
+ ----------------------------------------
+ proc_fsm: process(s, x_valid, htap_cnt, xtap_cnt_w)
+ begin
+ clr_xmem <= '0';
+ new_round <= '0';
+ cnt_en <= '0';
+ ready <= '0';
+ valid <= '0';
+ sn <= s;
+ stage_en <= '0';
+ y_valid <= '0';
+
+ case s is
+ when init =>
+ clr_xmem <= '1';
+ if xtap_cnt_w = tap_cnt_t'low then
+ sn <= idle;
+ end if;
+
+ when idle =>
+ ready <= '1';
+ if x_valid = '1' then
+ sn <= start;
+ end if;
+
+ when start =>
+ new_round <= '1';
+ sn <= proc;
+
+ when proc =>
+ stage_en <= '1';
+ cnt_en <= '1';
+ if htap_cnt = tap_cnt_t'high then
+ sn <= p1;
+ end if;
+
+ when p1 =>
+ sn <= p2;
+
+ when p2 =>
+ sn <= output;
+ ready <= '1';
+
+ when output =>
+ sn <= idle;
+ y_valid <= '1';
+ ready <= '1';
+ if x_valid = '1' then
+ sn <= start;
+ end if;
+
+ when others => null;
+ end case;
+ end process;
+
+ proc_fsm_next: process(srst, clk, sn)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ s <= init;
+ else
+ s <= sn;
+ end if;
+ end if;
+ end process;
+
+ ----------------------------------------
+ inst_fir_stage: fir_stage
+ GENERIC MAP
+ (
+ nbits_in => nbits_stages,
+ nbits_in_frac => nbits_stages_frac,
+ nbits_out => nbits_stages,
+ nbits_out_frac => nbits_stages_frac,
+ has_in_reg => true,
+ has_pipe_reg => true,
+ fir_mode => fir_stage_mode,
+ rounding => false,
+ saturating => false
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => fir_stage_en,
+ x_in => x_stage,
+ y_in => y_stage,
+ h_in => h_din,
+ out_valid => stage_valid,
+ x_out => xo,
+ y_out_clr => fir_stage_clr,
+ y_out => y_stage
+ );
+
+ ----------------------------------------
+ -- Finished instantiation
+ ----------------------------------------
+
+end Behavioral;
diff --git a/lib/filter/src/fir_iterative_pkg.vhd b/lib/filter/src/fir_iterative_pkg.vhd
new file mode 100644
index 0000000..3d71626
--- /dev/null
+++ b/lib/filter/src/fir_iterative_pkg.vhd
@@ -0,0 +1,45 @@
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+use ieee.numeric_std.all;
+use work.fixed_pkg.all;
+use work.filter_pkg.all;
+
+-------------------------------------------------------------------------------
+package fir_iterative_pkg is
+
+ type fir_iterative_mode_t is (normal, symmetric);
+
+ function taps_nbits(ntaps : integer; mode : fir_iterative_mode_t) return integer;
+ function ntaps_addr(ntaps : integer; mode : fir_iterative_mode_t) return integer;
+
+end; -- package fir_iterative_pkg;
+
+-------------------------------------------------------------------------------
+package body fir_iterative_pkg is
+
+ function taps_nbits(ntaps : integer; mode : fir_iterative_mode_t) return integer is
+ variable res : integer;
+ begin
+ res := NextPowerOfTwo(real(ntaps_addr(ntaps, mode)));
+ return res;
+ end taps_nbits;
+
+ function ntaps_addr(ntaps : integer; mode : fir_iterative_mode_t) return integer is
+ constant ntaps_is_even : boolean := (ntaps mod 2) = 0;
+ variable res : integer := ntaps;
+ begin
+ if mode = symmetric then
+ if ntaps_is_even then
+ res := ntaps/2;
+ else
+ res := (ntaps-1)/2 + 1;
+ end if;
+ end if;
+ return res;
+ end ntaps_addr;
+
+end; -- package fir_iterative_pkg;
+
+-------------------------------------------------------------------------------
diff --git a/lib/filter/src/fir_parallel.vhd b/lib/filter/src/fir_parallel.vhd
new file mode 100644
index 0000000..a46dba9
--- /dev/null
+++ b/lib/filter/src/fir_parallel.vhd
@@ -0,0 +1,208 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: fir_parallel - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.fir_stage_pkg.all;
+use work.fir_parallel_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+entity fir_parallel is
+Generic
+(
+ ntaps : integer := 33;
+ nbits_in : integer := 12;
+ nbits_in_frac : integer := 11;
+ nbits_stages : integer := 13;
+ nbits_stages_frac : integer := 11;
+ nbits_out : integer := 12;
+ nbits_out_frac : integer := 11;
+ has_in_reg : boolean := false;
+ has_pipe_reg : boolean := false;
+ has_out_reg : boolean := false;
+ fir_mode : fir_parallel_mode_t := transposed;
+ rounding : boolean := true;
+ saturating : boolean := true
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ h_in : in sfixed_array_t;
+ in_valid : in std_logic;
+ d_in : in sfixed;
+ out_valid : out std_logic;
+ d_out : out sfixed
+);
+end fir_parallel;
+
+architecture Behavioral of fir_parallel is
+
+-------------------------------------------------------------------------------
+ -- Component Declaration for FIR stage
+ COMPONENT fir_stage
+ GENERIC
+ (
+ nbits_in : integer;
+ nbits_in_frac : integer;
+ nbits_out : integer;
+ nbits_out_frac : integer;
+ has_in_reg : boolean;
+ has_pipe_reg : boolean;
+ has_out_reg : boolean;
+ fir_mode : fir_stage_mode_t;
+ rounding : boolean;
+ saturating : boolean
+ );
+ PORT
+ (
+ srst : in std_logic;
+ clk : in std_logic;
+ in_valid : in std_logic;
+ x_in : in sfixed;
+ y_in : in sfixed;
+ h_in : in sfixed;
+ out_valid : out std_logic;
+ x_out : out sfixed;
+ y_out : out sfixed
+ );
+ END COMPONENT;
+
+ -------------------------------------------------------------------------------
+ type coeff_array_t is array (natural range <>) of sfixed(SFix_high(nbits_stages, nbits_stages_frac) downto SFix_low(nbits_stages, nbits_stages_frac));
+ type stages_array_t is array (natural range <>) of sfixed(SFix_high(nbits_stages, nbits_stages_frac) downto SFix_low(nbits_stages, nbits_stages_frac));
+
+ constant zero_in : sfixed := to_sfixed(0, nbits_in, nbits_in_frac);
+ constant fir_stage_mode : fir_stage_mode_t := transposed;
+
+ SIGNAL x_out : sfixed(SFix_high(nbits_out, nbits_out_frac) downto SFix_low(nbits_out, nbits_out_frac));
+
+ SIGNAL x : stages_array_t(0 to ntaps-2);
+ SIGNAL y : stages_array_t(0 to ntaps-2);
+ SIGNAL h : coeff_array_t(0 to ntaps-1);
+
+ -------------------------------------------------------------------------------
+begin
+
+ -- Assign coefficients
+ assign_coeffs:
+ for i in 0 to ntaps-1 generate
+ h(i) <= to_sfixed(h_in, i);
+ end generate;
+
+ ----------------------------------------
+ -- Instantiate the FIR stages
+ ----------------------------------------
+ uut_first_stage: fir_stage
+ GENERIC MAP
+ (
+ nbits_in => nbits_in,
+ nbits_in_frac => nbits_in_frac,
+ nbits_out => nbits_stages,
+ nbits_out_frac => nbits_stages_frac,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ fir_mode => fir_stage_mode,
+ rounding => false,
+ saturating => false
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => in_valid,
+ x_in => d_in,
+ y_in => zero_in,
+ h_in => h(ntaps-1),
+ out_valid => out_valid,
+ x_out => x(0),
+ y_out => y(0)
+ );
+
+ ----------------------------------------
+ gen_stages:
+ for i in 1 to ntaps-2 generate
+ uut_stages: fir_stage
+ GENERIC MAP
+ (
+ nbits_in => nbits_stages,
+ nbits_in_frac => nbits_stages_frac,
+ nbits_out => nbits_stages,
+ nbits_out_frac => nbits_stages_frac,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ fir_mode => fir_stage_mode,
+ rounding => false,
+ saturating => false
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => in_valid,
+ x_in => x(i-1),
+ y_in => y(i-1),
+ h_in => h(ntaps-i-1),
+ out_valid => open,
+ x_out => x(i),
+ y_out => y(i)
+ );
+ end generate;
+
+ ----------------------------------------
+ uut_last_stage: fir_stage
+ GENERIC MAP
+ (
+ nbits_in => nbits_stages,
+ nbits_in_frac => nbits_stages_frac,
+ nbits_out => nbits_out,
+ nbits_out_frac => nbits_out_frac,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ fir_mode => fir_stage_mode,
+ rounding => rounding,
+ saturating => saturating
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => in_valid,
+ x_in => x(ntaps-2),
+ y_in => y(ntaps-2),
+ h_in => h(0),
+ out_valid => open,
+ x_out => x_out,
+ y_out => d_out
+ );
+
+ ----------------------------------------
+ -- Finished instantiation
+ ----------------------------------------
+
+end Behavioral;
diff --git a/lib/filter/src/fir_parallel_pkg.vhd b/lib/filter/src/fir_parallel_pkg.vhd
new file mode 100644
index 0000000..1f8c44c
--- /dev/null
+++ b/lib/filter/src/fir_parallel_pkg.vhd
@@ -0,0 +1,76 @@
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use ieee.numeric_std.all;
+use work.fixed_pkg.all;
+use work.filter_pkg.all;
+
+-------------------------------------------------------------------------------
+package fir_parallel_pkg is
+
+ type ufixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC;
+ type sfixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC;
+
+ type fir_parallel_mode_t is (transposed, transposed_sym, systolic, systolic_sym);
+
+ function to_sfixed_array(x : real_array_t; proto : sfixed) return sfixed_array_t;
+ function to_sfixed_array(x : real_array_t; nbits, nbits_int : integer) return sfixed_array_t;
+
+ -- Slicing functions for unconstrained array types
+ function to_ufixed(src : ufixed_array_t; index : integer) return ufixed;
+ function to_sfixed(src : sfixed_array_t; index : integer) return sfixed;
+
+end; -- package fir_parallel_pkg;
+
+-------------------------------------------------------------------------------
+package body fir_parallel_pkg is
+
+ function to_sfixed_array(x : real_array_t; proto : sfixed) return sfixed_array_t is
+ variable res : sfixed_array_t(0 to x'length-1, proto'range);
+ variable tt : sfixed(proto'range);
+ begin
+ for i in x'range loop
+ tt := to_sfixed(x(i), proto);
+ for j in proto'range loop
+ res(i,j) := tt(j);
+ end loop;
+ end loop;
+ return res;
+ end to_sfixed_array;
+
+ ---------------------------------------------------------------------------
+ function to_sfixed_array(x : real_array_t; nbits, nbits_int : integer) return sfixed_array_t is
+ variable p : sfixed(SFix_high(nbits, nbits_int) downto SFix_low(nbits, nbits_int));
+ begin
+ return to_sfixed_array(x, p);
+ end to_sfixed_array;
+
+ -------------------------------------------------------------------------------
+ -- ufixed <= ufixed_array(i)
+ function to_ufixed(src : ufixed_array_t; index : integer) return ufixed is
+ variable dst : ufixed(src'range(2));
+ begin
+ for j in src'range(2) loop
+ dst(j) := src(index, j);
+ end loop;
+
+ return dst;
+
+ end to_ufixed;
+
+ -------------------------------------------------------------------------------
+ -- sfixed <= sfixed_array(i)
+ function to_sfixed(src : sfixed_array_t; index : integer) return sfixed is
+ variable dst : sfixed(src'range(2));
+ begin
+ for j in src'range(2) loop
+ dst(j) := src(index, j);
+ end loop;
+
+ return dst;
+
+ end to_sfixed;
+
+end; -- package fir_parallel_pkg;
+
+-------------------------------------------------------------------------------
diff --git a/lib/filter/src/fir_stage.vhd b/lib/filter/src/fir_stage.vhd
new file mode 100644
index 0000000..c8c4a7c
--- /dev/null
+++ b/lib/filter/src/fir_stage.vhd
@@ -0,0 +1,150 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: fir_stage - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.fir_stage_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+entity fir_stage is
+Generic
+(
+ nbits_in : integer := 12;
+ nbits_in_frac : integer := 12;
+ nbits_out : integer := 12;
+ nbits_out_frac : integer := 12;
+ has_in_reg : boolean := false;
+ has_pipe_reg : boolean := false;
+ has_out_reg : boolean := false;
+ fir_mode : fir_stage_mode_t := transposed;
+ rounding : boolean := true;
+ saturating : boolean := true
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ in_valid : in std_logic;
+ x_in : in sfixed;
+ y_in : in sfixed;
+ h_in : in sfixed;
+ out_valid : out std_logic;
+ x_out : out sfixed;
+ y_out : out sfixed;
+ y_out_clr : in std_logic
+);
+end fir_stage;
+
+architecture Behavioral of fir_stage is
+
+signal xin : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+signal yin : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+signal hin : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+signal prod : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+signal valid, p_valid : std_logic;
+------------------------------------------------------------
+begin
+
+
+------------------------------------------------------------
+ proc_in_reg_y: process(clk)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' or y_out_clr = '1' then
+ yin <= to_sfixed(0, yin);
+ else
+ yin <= resize(y_in, yin);
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_in_reg_hx: process(srst, clk, in_valid, x_in, h_in)
+ variable p : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ begin
+ if has_in_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ xin <= to_sfixed(0, xin);
+ hin <= to_sfixed(0, hin);
+ valid <= '0';
+ else
+ valid <= in_valid;
+ if in_valid = '1' then
+ xin <= resize(x_in, xin);
+ hin <= resize(h_in, hin);
+ end if;
+ end if;
+ end if;
+ else
+ xin <= resize(x_in, xin);
+ hin <= resize(h_in, hin);
+ valid <= in_valid;
+ end if;
+ x_out <= resize(x_in, p);
+
+ end process;
+
+------------------------------------------------------------
+ proc_pipe_reg: process(srst, clk, valid, xin, hin)
+ variable p : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ begin
+ p := resize(xin * hin, p);
+ if has_pipe_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ prod <= to_sfixed(0, prod);
+ p_valid <= '0';
+ else
+ prod <= p;
+ p_valid <= valid;
+ end if;
+ end if;
+ else
+ prod <= p;
+ p_valid <= valid;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_out_reg: process(srst, clk, p_valid, prod, yin)
+ variable yout : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ begin
+ yout := resize(yin + prod, yout, rounding, saturating);
+-- if rising_edge(clk) then
+-- if srst = '1' or y_out_clr = '1' then
+-- y_out <= to_sfixed(0, yout);
+-- out_valid <= '0';
+-- else
+-- y_out <= yout;
+-- out_valid <= p_valid;
+-- end if;
+-- end if;
+ out_valid <= p_valid;
+ y_out <= yout;
+ end process;
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/filter/src/fir_stage_pkg.vhd b/lib/filter/src/fir_stage_pkg.vhd
new file mode 100644
index 0000000..8bccba2
--- /dev/null
+++ b/lib/filter/src/fir_stage_pkg.vhd
@@ -0,0 +1,38 @@
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use ieee.numeric_std.all;
+use work.fixed_pkg.all;
+
+package fir_stage_pkg is
+
+type fir_stage_mode_t is (transposed, systolic);
+
+ -------------------------------------------------------------
+ -- Constructor helpers
+ -- Use: variable v8u6 : ufixed_t(ufixed(8,6)'range);
+ function uproto (nbits : integer; nbits_frac : integer) return ufixed;
+
+ -- Use: variable v8s6 : sfixed_t(sfixed(8,6)'range);
+ function sproto (nbits : integer; nbits_frac : integer) return sfixed;
+
+end; -- package fir_stage_pkg;
+
+package body fir_stage_pkg is
+
+ -------------------------------------------------------------
+ -- Constuctor helpers
+ function uproto (nbits : integer; nbits_frac : integer) return ufixed is
+ constant result : ufixed (nbits-nbits_frac-1 downto -nbits_frac) := (others => '0');
+ begin
+ return result(nbits-nbits_frac-1 downto -nbits_frac);
+ end uproto;
+
+ -------------------------------------------------------------
+ function sproto (nbits : integer; nbits_frac : integer) return sfixed is
+ constant result : sfixed (nbits-nbits_frac downto -nbits_frac+1) := (others => '0');
+ begin
+ return result(nbits-nbits_frac downto -nbits_frac+1);
+ end sproto;
+
+end; -- package fir_stage_pkg;
diff --git a/lib/filter/src/tb_fir_iterative.vhd b/lib/filter/src/tb_fir_iterative.vhd
new file mode 100644
index 0000000..2621a05
--- /dev/null
+++ b/lib/filter/src/tb_fir_iterative.vhd
@@ -0,0 +1,231 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_fir_stage
+-- Module Name: tb_fir_stage.vhd
+-- Project Name: fir_stage
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+--------------------------------------------------------------------------------
+LIBRARY ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use std.textio.all; -- Imports the standard textio package.
+
+library work;
+use work.fixed_pkg.all;
+use work.filter_pkg.all;
+use work.fir_stage_pkg.all;
+use work.fir_iterative_pkg.all;
+
+use work.PCK_FIO.all;
+
+ENTITY tb_fir_iterative IS
+ Generic (
+ ntaps : integer := 11;
+ nbits_in : integer := 15;
+ nbits_in_frac : integer := 15;
+ nbits_stages : integer := 15;
+ nbits_stages_frac : integer := 15;
+ nbits_out : integer := 15;
+ nbits_out_frac : integer := 15;
+ fir_mode : fir_iterative_mode_t := symmetric;
+ rounding : boolean := true;
+ saturating : boolean := true
+ );
+END tb_fir_iterative;
+
+ARCHITECTURE behavior OF tb_fir_iterative IS
+
+ -- Component Declaration for the Unit Under Test (UUT)
+ COMPONENT fir_iterative
+ GENERIC
+ (
+ ntaps : integer;
+ nbits_in : integer;
+ nbits_in_frac : integer;
+ nbits_stages : integer;
+ nbits_stages_frac : integer;
+ nbits_out : integer;
+ nbits_out_frac : integer;
+ fir_mode : fir_iterative_mode_t;
+ rounding : boolean;
+ saturating : boolean
+ );
+ PORT
+ (
+ srst : in std_logic;
+ clk : in std_logic;
+ h_din : in sfixed;
+ h_addr_out : out unsigned(taps_nbits(ntaps, fir_mode)-1 downto 0);
+ ready : out std_logic;
+ x_valid : in std_logic;
+ x_din : in sfixed;
+ y_dout_valid : out std_logic;
+ y_dout : out sfixed
+ );
+ END COMPONENT;
+
+ -------------------------------------------------------------------------------
+ --Constants
+ constant nsamples : integer := 32;
+
+ constant PERIOD : time := 10 ns;
+ constant zero_in : sfixed := to_sfixed(0, nbits_in, nbits_in_frac);
+
+ --Inputs
+ SIGNAL clk : std_logic := '0';
+ SIGNAL srst : std_logic := '1';
+ SIGNAL x_valid : std_logic := '0';
+ SIGNAL h_din : sfixed(sproto(nbits_stages, nbits_stages_frac)'high downto sproto(nbits_stages, nbits_stages_frac)'low);
+ SIGNAL x_din : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+
+ --Outputs
+ SIGNAL y_dout : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ SIGNAL y_valid : std_logic;
+ SIGNAL ready : std_logic;
+
+ SIGNAL fileout_enable : std_logic := '1';
+
+ -- Test coefficients
+-- SIGNAL coeffs : real_array_t(0 to ntaps_addr(ntaps, fir_mode)-1) := FilterCoef_Delta(ntaps, 10, 0.999)(0 to ntaps_addr(ntaps, fir_mode)-1);
+ SIGNAL coeffs : real_array_t(0 to ntaps_addr(ntaps, fir_mode)-1) := FilterCoef_Bandpass(ntaps, 0.25, 0.125, 1.0)(0 to ntaps_addr(ntaps, fir_mode)-1);
+-- SIGNAL coeffs : real_array_t(0 to ntaps-1) := FilterTestCoef(ntaps);
+ signal x_input : real_array_t(0 to nsamples-1) :=
+ (
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.9999,
+ -0.0000,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+
+ );
+ type ymem_t is array (0 to nsamples-1) of sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ signal ymem : ymem_t;
+
+ signal y_cnt : integer ;
+ SIGNAL xi, yo : real := 0.0;
+ SIGNAL h_addr : unsigned(taps_nbits(ntaps, fir_mode)-1 downto 0);
+
+ -- file I/O
+ subtype sample_t is integer range -32768 to 32767;
+ type file_t is file of sample_t;
+
+ -------------------------------------------------------------------------------
+BEGIN
+
+ xi <= to_real(x_din);
+ yo <= to_real(y_dout);
+
+ ----------------------------------------
+ -- Instantiate the Unit Under Test (UUT)
+ ----------------------------------------
+ uut_fir_iterative: fir_iterative
+ GENERIC MAP
+ (
+ ntaps => ntaps,
+ nbits_in => nbits_in,
+ nbits_in_frac => nbits_in_frac,
+ nbits_out => nbits_out,
+ nbits_out_frac => nbits_out_frac,
+ nbits_stages => nbits_stages,
+ nbits_stages_frac => nbits_stages_frac,
+ fir_mode => fir_mode,
+ rounding => rounding,
+ saturating => saturating
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ h_din => h_din,
+ h_addr_out => h_addr,
+ ready => ready,
+ x_valid => x_valid,
+ x_din => x_din,
+ y_dout_valid => y_valid,
+ y_dout => y_dout
+ );
+
+ ----------------------------------------
+ -- Finished instantiation
+ ----------------------------------------
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb : PROCESS
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 4*PERIOD;
+ srst <= '0';
+ ------------------------------------------
+ wait for 2*PERIOD;
+
+ for i in 0 to nsamples-1 loop
+ if i = nsamples/2 then
+ wait for 43*PERIOD;
+ end if;
+ ------------------------------------------
+ wait until rising_edge(clk) and ready = '1';
+ x_din <= to_sfixed(x_input(i), x_din);
+ x_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_valid <= '0';
+ end loop;
+
+ assert false report "Test finished" severity error;
+ wait;
+ END PROCESS;
+
+ process(srst, clk, y_valid)
+ begin
+ if rising_edge(clk) then
+ h_din <= to_sfixed(coeffs(to_integer(h_addr)), h_din);
+ if srst = '1' then
+ y_cnt <= 0;
+
+ elsif y_valid = '1' then
+ ymem(y_cnt) <= y_dout;
+ y_cnt <= y_cnt + 1;
+ end if;
+ end if;
+ end process;
+
+END;
diff --git a/lib/filter/src/tb_fir_parallel.vhd b/lib/filter/src/tb_fir_parallel.vhd
new file mode 100644
index 0000000..bb87e21
--- /dev/null
+++ b/lib/filter/src/tb_fir_parallel.vhd
@@ -0,0 +1,189 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_fir_stage
+-- Module Name: tb_fir_stage.vhd
+-- Project Name: fir_stage
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+--------------------------------------------------------------------------------
+LIBRARY ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use std.textio.all; -- Imports the standard textio package.
+
+library work;
+use work.fixed_pkg.all;
+use work.fir_parallel_pkg.all;
+use work.filter_pkg.all;
+
+use work.PCK_FIO.all;
+
+ENTITY tb_fir_parallel IS
+ Generic (
+ ntaps : integer := 33;
+ nbits_in : integer := 15;
+ nbits_in_frac : integer := 15;
+ nbits_stages : integer := 16;
+ nbits_stages_frac : integer := 15;
+ nbits_out : integer := 15;
+ nbits_out_frac : integer := 15;
+ has_in_reg : boolean := false;
+ has_pipe_reg : boolean := true;
+ has_out_reg : boolean := false;
+ fir_mode : fir_parallel_mode_t := transposed;
+ rounding : boolean := true;
+ saturating : boolean := true
+ );
+END tb_fir_parallel;
+
+ARCHITECTURE behavior OF tb_fir_parallel IS
+
+ -- Component Declaration for the Unit Under Test (UUT)
+ COMPONENT fir_parallel
+ GENERIC
+ (
+ ntaps : integer;
+ nbits_in : integer;
+ nbits_in_frac : integer;
+ nbits_stages : integer;
+ nbits_stages_frac : integer;
+ nbits_out : integer;
+ nbits_out_frac : integer;
+ has_in_reg : boolean;
+ has_pipe_reg : boolean;
+ has_out_reg : boolean;
+ fir_mode : fir_parallel_mode_t;
+ rounding : boolean;
+ saturating : boolean
+ );
+ PORT
+ (
+ srst : in std_logic;
+ clk : in std_logic;
+ h_in : in sfixed_array_t;
+ in_valid : in std_logic;
+ d_in : in sfixed;
+ out_valid : out std_logic;
+ d_out : out sfixed
+ );
+ END COMPONENT;
+
+ -------------------------------------------------------------------------------
+ --Constants
+ constant PERIOD : time := 10 ns;
+ constant zero_in : sfixed := to_sfixed(0, nbits_in, nbits_in_frac);
+
+ --Inputs
+ SIGNAL clk : std_logic := '0';
+ SIGNAL srst : std_logic := '1';
+ SIGNAL in_valid : std_logic := '0';
+ SIGNAL x_in : sfixed(SFix_high(nbits_in, nbits_in_frac) downto SFix_low(nbits_in, nbits_in_frac));
+
+ --Outputs
+ SIGNAL y_out : sfixed(SFix_high(nbits_out, nbits_out_frac) downto SFix_low(nbits_out, nbits_out_frac));
+ SIGNAL out_valid : std_logic := '0';
+
+ SIGNAL fileout_enable : std_logic := '1';
+
+ -- Test coefficients
+ SIGNAL coeff_in : sfixed_array_t(0 to ntaps-1, SFix_high(nbits_stages, nbits_stages_frac) downto SFix_low(nbits_stages, nbits_stages_frac)) := to_sfixed_array(FilterCoef_Lowpass(ntaps, 0.125, 0.125), nbits_stages, nbits_stages_frac);
+
+ SIGNAL xi, yo : real := 0.0;
+
+ -- file I/O
+ subtype sample_t is integer range -32768 to 32767;
+ type file_t is file of sample_t;
+
+ -------------------------------------------------------------------------------
+BEGIN
+
+ xi <= to_real(x_in);
+ yo <= to_real(y_out);
+
+ ----------------------------------------
+ -- Instantiate the Unit Under Test (UUT)
+ ----------------------------------------
+ uut_fir_parallel: fir_parallel
+ GENERIC MAP
+ (
+ ntaps => ntaps,
+ nbits_in => nbits_in,
+ nbits_in_frac => nbits_in_frac,
+ nbits_out => nbits_out,
+ nbits_out_frac => nbits_out_frac,
+ nbits_stages => nbits_stages,
+ nbits_stages_frac => nbits_stages_frac,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ fir_mode => fir_mode,
+ rounding => rounding,
+ saturating => saturating
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ h_in => coeff_in,
+ in_valid => in_valid,
+ d_in => x_in,
+ out_valid => out_valid,
+ d_out => y_out
+ );
+
+ ----------------------------------------
+ -- Finished instantiation
+ ----------------------------------------
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb : PROCESS
+ file fi : file_t open read_mode is "wav_in.dat";
+ variable si : sample_t;
+
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 4*PERIOD;
+ srst <= '0';
+ ------------------------------------------
+ wait for 2*PERIOD;
+
+ while not endfile(fi) loop
+ read(fi, si);
+ x_in <= to_sfixed(to_signed(si, 16));
+ in_valid <= '1';
+ wait for PERIOD;
+ wait until rising_edge(clk);
+ end loop;
+ ------------------------------------------
+ in_valid <= '0';
+
+ wait for 20*PERIOD;
+
+ assert false report "Test finished" severity error;
+ wait;
+ END PROCESS;
+
+ tb_fo : PROCESS(clk, fileout_enable, out_valid)
+ file fo : file_t open write_mode is "wav_out.dat";
+ variable so : sample_t;
+
+ BEGIN
+ if rising_edge(clk) and fileout_enable = '1' and out_valid = '1' then
+ so := to_integer(y_out);
+ write(fo, so);
+ end if;
+
+ END PROCESS;
+
+END;
diff --git a/lib/filter/src/tb_fir_stage.vhd b/lib/filter/src/tb_fir_stage.vhd
new file mode 100644
index 0000000..159f13a
--- /dev/null
+++ b/lib/filter/src/tb_fir_stage.vhd
@@ -0,0 +1,268 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_fir_stage
+-- Module Name: tb_fir_stage.vhd
+-- Project Name: fir_stage
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+--------------------------------------------------------------------------------
+LIBRARY ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use std.textio.all; -- Imports the standard textio package.
+
+library work;
+use work.fixed_pkg.all;
+use work.fir_stage_pkg.all;
+use work.filter_pkg.all;
+
+use work.PCK_FIO.all;
+
+ENTITY tb_fir_stage IS
+ Generic (
+ ntaps : integer := 33;
+ nbits_in : integer := 24;
+ nbits_in_frac : integer := 23;
+ nbits_stages : integer := 25;
+ nbits_stages_frac : integer := 23;
+ nbits_out : integer := 24;
+ nbits_out_frac : integer := 22;
+ has_in_reg : boolean := true;
+ has_pipe_reg : boolean := true;
+ has_out_reg : boolean := false;
+ fir_mode : fir_stage_mode_t := transposed;
+ rounding : boolean := true;
+ saturating : boolean := true
+ );
+END tb_fir_stage;
+
+ARCHITECTURE behavior OF tb_fir_stage IS
+
+ -- Component Declaration for the Unit Under Test (UUT)
+ COMPONENT fir_stage
+ GENERIC
+ (
+ nbits_in : integer;
+ nbits_in_frac : integer;
+ nbits_out : integer;
+ nbits_out_frac : integer;
+ has_in_reg : boolean;
+ has_pipe_reg : boolean;
+ has_out_reg : boolean;
+ fir_mode : fir_stage_mode_t;
+ rounding : boolean;
+ saturating : boolean
+ );
+ PORT
+ (
+ srst : in std_logic;
+ clk : in std_logic;
+ in_valid : in std_logic;
+ x_in : in sfixed;
+ y_in : in sfixed;
+ h_in : in sfixed;
+ out_valid : out std_logic;
+ x_out : out sfixed;
+ y_out : out sfixed
+ );
+ END COMPONENT;
+
+ type stages_t is array (natural range <>) of sfixed(sproto(nbits_stages, nbits_stages_frac)'high downto sproto(nbits_stages, nbits_stages_frac)'low);
+
+ --Constants
+ constant PERIOD : time := 10 ns;
+ constant zero_in : sfixed := to_sfixed(0, nbits_in, nbits_in_frac);
+
+ --Inputs
+ SIGNAL clk : std_logic := '0';
+ SIGNAL srst : std_logic := '1';
+ SIGNAL in_valid : std_logic := '0';
+ SIGNAL x_in : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+
+ --Outputs
+ SIGNAL x_out : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ SIGNAL y_out : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ SIGNAL out_valid : std_logic := '0';
+
+ SIGNAL x : stages_t(0 to ntaps-2);
+ SIGNAL y : stages_t(0 to ntaps-2);
+
+ SIGNAL fileout_enable : std_logic := '1';
+
+ -- Test coefficients
+ function to_sfixed(x_real : real_array_t) return stages_t is
+ variable res : stages_t(x_real'range);
+ begin
+ for i in x_real'range loop
+ res(i) := to_sfixed(x_real(i), res(i), true, true);
+ end loop;
+
+ return res;
+ end to_sfixed;
+
+ constant h : stages_t(0 to ntaps-1) := to_sfixed(FilterCoef_Lowpass(ntaps, 0.25, 1.0));
+
+ SIGNAL xi, yo : real := 0.0;
+
+BEGIN
+
+ xi <= to_real(x_in);
+ yo <= to_real(y_out);
+
+ ----------------------------------------
+ -- Instantiate the Unit Under Test (UUT)
+ ----------------------------------------
+ uut_first_stage: fir_stage
+ GENERIC MAP
+ (
+ nbits_in => nbits_in,
+ nbits_in_frac => nbits_in_frac,
+ nbits_out => nbits_stages,
+ nbits_out_frac => nbits_stages_frac,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ fir_mode => fir_mode,
+ rounding => false,
+ saturating => false
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => in_valid,
+ x_in => x_in,
+ y_in => zero_in,
+ h_in => h(ntaps-1),
+ out_valid => out_valid,
+ x_out => x(0),
+ y_out => y(0)
+ );
+
+ ----------------------------------------
+ gen_stages:
+ for i in 1 to ntaps-2 generate
+ uut_stages: fir_stage
+ GENERIC MAP
+ (
+ nbits_in => nbits_stages,
+ nbits_in_frac => nbits_stages_frac,
+ nbits_out => nbits_stages,
+ nbits_out_frac => nbits_stages_frac,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ fir_mode => fir_mode,
+ rounding => false,
+ saturating => false
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => in_valid,
+ x_in => x(i-1),
+ y_in => y(i-1),
+ h_in => h(ntaps-i-1),
+ out_valid => open,
+ x_out => x(i),
+ y_out => y(i)
+ );
+ end generate;
+
+ ----------------------------------------
+ uut_last_stage: fir_stage
+ GENERIC MAP
+ (
+ nbits_in => nbits_stages,
+ nbits_in_frac => nbits_stages_frac,
+ nbits_out => nbits_out,
+ nbits_out_frac => nbits_out_frac,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ fir_mode => fir_mode,
+ rounding => rounding,
+ saturating => saturating
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => in_valid,
+ x_in => x(ntaps-2),
+ y_in => y(ntaps-2),
+ h_in => h(0),
+ out_valid => open,
+ x_out => x_out,
+ y_out => y_out
+ );
+
+ ----------------------------------------
+ -- Finished instantiation
+ ----------------------------------------
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb : PROCESS
+
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 4*PERIOD;
+ srst <= '0';
+ ------------------------------------------
+ wait for 2*PERIOD;
+
+ x_in <= to_sfixed(0.0, x_in);
+
+ wait until rising_edge(clk);
+ in_valid <= '1';
+
+ wait until rising_edge(clk);
+ x_in <= to_sfixed(0.0, x_in);
+
+ wait for 20*PERIOD;
+ wait until rising_edge(clk);
+ x_in <= to_sfixed(0.0, x_in);
+ wait until rising_edge(clk);
+ x_in <= to_sfixed(1.0, x_in);
+ wait until rising_edge(clk);
+ x_in <= to_sfixed(0.0, x_in);
+ wait until rising_edge(clk);
+ x_in <= to_sfixed(0.0, x_in);
+ wait until rising_edge(clk);
+ x_in <= to_sfixed(0.0, x_in);
+
+ wait for 150*PERIOD;
+
+ wait until rising_edge(clk);
+ in_valid <= '0';
+
+ wait for 20*PERIOD;
+
+ assert false report "Test finished" severity error;
+ wait;
+ END PROCESS;
+
+ tb_fo : PROCESS(clk, fileout_enable, out_valid)
+ file RESULT_FIR: text open write_mode is "fir.txt";
+ variable L: line;
+
+ BEGIN
+ if rising_edge(clk) and fileout_enable = '1' and out_valid = '1' then
+ fprint(RESULT_FIR, L,"%s\n", REAL'image(yo));
+ end if;
+
+ END PROCESS;
+
+END;
diff --git a/lib/fix_std/fix_std.vhd b/lib/fix_std/fix_std.vhd
new file mode 100644
index 0000000..6397ebc
--- /dev/null
+++ b/lib/fix_std/fix_std.vhd
@@ -0,0 +1,1007 @@
+---------------------------------------------------------------------
+--
+-- Package fix_std
+-- Fixed point arithmetic based on numeric_std
+--
+---------------------------------------------------------------------
+--
+-- This document describes a VHDL package of definitions and subprograms
+-- intended to support the use of fixed-point arithmetic in test benches
+-- and synthesisable designs. This document and the package it describes
+-- are made freely available to the HDL design community without warranty
+-- of any kind. You are welcome to make use of this information for your
+-- own private study and in your own designs. If you make use of the
+-- package, you accept sole responsibility for its fitness for purpose
+-- and its suitability in your application. You are free to modify the
+-- package in any way, and to record your contribution to it, but this
+-- notice must appear in a prominent place in any modified or derived
+-- version of the package or its supporting documentation.
+--
+-- The author wishes to thank his employer Doulos Ltd for making
+-- available the facilities used to develop, test and distribute this
+-- package. However, Doulos Ltd accepts no responsibility for the
+-- package's contents and cannot support it in any way.
+--
+---------------------------------------------------------------------
+-- Revision information:
+--
+-- Version 0.1 06-May-2003
+-- Alpha version, for review
+-- No division operators are provided, pending detailed
+-- consultation on their functionality.
+-- Some subprogram implementations are unnecessarily inefficient.
+-- Version 0.2 11-Jun-2003
+-- Fixes aiming to make the package portable across all synthesis tools:
+-- * Removed deferred constants, made them package constants
+-- * Removed all variable initialisations in procedures, made them
+-- procedural initialisations in the code
+---------------------------------------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+package fix_std is
+
+ --------------------------------------------------------------------
+
+ -- Integer subtype specifying legal values for a bit index.
+ -- At present it's restricted to 'natural' to conform with
+ -- the behaviour of mainstream synthesis tools. For simulation,
+ -- or in the future when synthesis tools are able to cope, it
+ -- would be possible to change this subtype to be the full
+ -- integer range, thus allowing negative subscripts for
+ -- fraction bits.
+ --
+ subtype Fix_Subscr is natural;
+
+ -- Fixed-point offset, the bit number (subscript) used for
+ -- the bit in a UFix or SFix vector having binary weight 2^0
+ -- (the units bit).
+ --
+ constant FixP: Fix_Subscr := 100;
+
+ -- Type declarations for the basic unsigned and signed fixed point
+ -- data types:
+ --
+ type UFix is array (Fix_Subscr range <>) of std_logic;
+ type SFix is array (Fix_Subscr range <>) of std_logic;
+
+ -- Type declarations for control of rounding and overflow modes:
+ --
+ type Fix_Rounding_Mode is (
+ clip_LS, -- Throw away unwanted least significant bits
+ towards_zero, -- Round towards zero - same as clip_LS for UFix
+ to_nearest -- Round to nearest. Exact halves round up.
+ );
+ type Fix_Overflow_Mode is (
+ clip_MS, -- Throw away unwanted most significant bits
+ saturate -- Saturate overflow to nearest representable value
+ );
+
+ -- Defaults for these modes:
+ --
+ constant Fix_Default_Rounding : Fix_Rounding_Mode := clip_LS;
+ constant Fix_Default_Overflow : Fix_Overflow_Mode := clip_MS;
+
+ --------------------------------------------------------------------
+
+ ---------------------------
+ -- E. Extraction functions
+ ---------------------------
+
+ -- E.1. Return the integral part of a UFix value
+ function Int(U: UFix) return UFix;
+
+ -- E.2. Return the fractional part of a UFix value
+ function Frac(U: UFix) return UFix;
+
+ -- E.3. Return the integral part of a SFix value
+ function Int(S: SFix) return SFix;
+
+ -- E.4. Return the fractional part of a SFix value
+ function Frac(S: SFix) return UFix;
+
+ -- E.5. Widen a SFix value if necessary so that
+ -- its range adjoins or spans the binary point
+ function Span(S: SFix) return SFix;
+
+ -- E.6. Widen a UFix value if necessary so that
+ -- its range adjoins or spans the binary point
+ function Span(U: UFix) return UFix;
+
+ ---------------------------
+ -- T. Conversion functions
+ ---------------------------
+
+ -- T.1 to T.8: Unsigned conversions
+ --
+ -- T.1. Resizing an existing UFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_UFix(
+ N : UFix;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return UFix;
+
+ -- T.2. Resizing an existing SFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_UFix(
+ N : SFix;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return UFix;
+
+ -- T.3. Conversion from integer to UFix. Provide number of
+ -- integer bits and number of fraction bits. Note that
+ -- negative input is tolerated!
+ --
+ function to_UFix(
+ N : integer;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return UFix;
+
+ -- T.4. Conversion from unsigned to UFix. Provide subscripts of
+ -- MS and (optionally) LS bit of the resulting UFix.
+ --
+ function to_UFix(
+ N : unsigned;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return UFix;
+
+ -- T.5. Conversion from unsigned to UFix. Automatically set the
+ -- range of the resulting UFix to match the unsigned value,
+ -- as an integral UFix value with no fraction bits.
+ --
+ function to_UFix( N : unsigned ) return UFix;
+
+ -- T.6. Conversion from UFix to unsigned. All integer bits are
+ -- preserved (including adding LS scale bits if necessary).
+ --
+ function to_unsigned(
+ N : UFix;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return unsigned;
+
+ -- T.7. Conversion from UFix to unsigned. Caller specifies
+ -- required number of bits in unsigned result.
+ --
+ function to_unsigned(
+ N : UFix;
+ bits : positive;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return unsigned;
+
+ -- T.8. Conversion from UFix to integer. Up to 31 integer bits are
+ -- preserved (including adding LS scale bits if necessary).
+ --
+ function to_integer(
+ N : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return integer;
+
+
+ -- T.9 to T.16: Signed conversions
+ --
+ -- T.9. Resizing an existing UFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_SFix(
+ N : UFix;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return SFix;
+
+ -- T.10. Resizing an existing SFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_SFix(
+ N : SFix;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return SFix;
+
+ -- T.11. Conversion from integer to SFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_SFix(
+ N : integer;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return SFix;
+
+ -- T.12. Conversion from signed to SFix. Provide subscripts of
+ -- MS and (optionally) LS bit of the resulting SFix.
+ --
+ function to_SFix(
+ N : signed;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return SFix;
+
+ -- T.13. Conversion from signed to SFix. Automatically set the
+ -- range of the resulting SFix to match the signed value,
+ -- as an integral SFix value with no fraction bits.
+ --
+ function to_SFix( N : signed ) return SFix;
+
+ -- T.14. Conversion from SFix to signed. All integer bits are
+ -- preserved (including adding LS scale bits if necessary).
+ --
+ function to_signed(
+ N : SFix;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return signed;
+
+ -- T.15. Conversion from SFix to signed. Caller specifies
+ -- required number of bits in signed result.
+ --
+ function to_signed(
+ N : SFix;
+ bits : positive;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return signed;
+
+ -- T.16. Conversion from SFix to integer. Up to 32 integer bits are
+ -- preserved (including adding LS scale bits if necessary).
+ --
+ function to_integer(
+ N : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return integer;
+
+ -- T.17. Conversion from UFix to SFix. This simply adds
+ -- an extra more significant bit, set to zero.
+ --
+ function to_SFix(U: UFix) return SFix;
+
+ ----------------------------------
+ -- V. Copy-to-variable procedures
+ ----------------------------------
+
+ -- Range-aware copying of an expression into a variable. The
+ -- ranges of destination variable and source expression are
+ -- used to determine correct rounding, overflow and scaling
+ -- behaviour.
+
+ -- V.1 to V.5: Copy an expression into a UFix variable
+ --
+
+ -- V.1. Copy UFix to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+ --
+ -- V.2. Copy SFix to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- V.3. Copy UNSIGNED to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : unsigned;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- V.4. Copy SIGNED to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : signed;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- V.5. Copy integer to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : integer;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- V.6 to V.10: Copy an expression into a SFix variable
+ --
+
+ -- V.6. Copy UFix to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- V.7. Copy SFix to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- V.8. Copy UNSIGNED to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : unsigned;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- V.9. Copy SIGNED to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : signed;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- V.10. Copy integer to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : integer;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+
+ --------------------------------
+ -- S. Copy-to-signal procedures
+ --------------------------------
+ --
+ -- Range-aware copying of an expression into a signal. The
+ -- ranges of destination signal and source expression are
+ -- used to determine correct rounding, overflow and scaling
+ -- behaviour.
+
+ -- S.1 to S.5: Copy an expression into a UFix signal
+ --
+
+ -- S.1. Copy UFix to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.1. Copy SFix to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.3. Copy UNSIGNED to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : unsigned;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.4. Copy SIGNED to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : signed;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.5. Copy integer to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : integer;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.6 to S.10: Copy an expression into a SFix signal
+ --
+
+ -- S.6. Copy UFix to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.7. Copy SFix to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.8. Copy UNSIGNED to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : unsigned;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.9. Copy SIGNED to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : signed;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+ -- S.10. Copy integer to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : integer;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ );
+
+
+ ------------------------------------------------------------------
+ -- A. Arithmetic operations involving UFix, SFix and other
+ -- numeric types.
+ -- The operators are overloaded for most of the sensible
+ -- combinations of SFix, UFix, UNSIGNED, SIGNED and INTEGER.
+ --
+ -- IMPORTANT NOTE:
+ -- Arithmetic operators return a result that is wide enough
+ -- and precise enough so that no information is lost. THIS IS
+ -- SIGNIFICANTLY DIFFERENT FROM THE BEHAVIOUR OF numeric_std.
+ -- In the detailed description that follow, "scaling" means
+ -- the numerical value (weight) of the least significant bit
+ -- in a fixed-point value.
+ --
+ -- ADDITION returns a result whose least significant bit
+ -- is the same as the least significant bit in either operand,
+ -- and whose most significant bit is one position higher than
+ -- the most significant bit in either operand. Addition of
+ -- two operands having the same bounds therefore results in
+ -- a growth of one bit at the most significant end.
+ --
+ -- SUBTRACTION where one or both operands are signed behaves
+ -- in the same way as addition. Subtraction where both operands
+ -- are unsigned returns a result whose most significant bit
+ -- position is the same as the most significant bit in either
+ -- operand, and whose least significant bit is the same as the
+ -- least significant bit in either operand.
+ --
+ -- MULTIPLICATION returns a result whose width is the sum of
+ -- the widths of its two operands, and whose scaling is the
+ -- product of its two operands' scalings.
+ --
+ -- UNARY NEGATION always gives a result having one more
+ -- significant bit than the operand.
+ --
+ -- ABSOLUTE VALUE always gives a result having exactly the
+ -- same subtype as its operand.
+ --
+ -- In binary operations where one operand is a fixed-point type
+ -- and the other is an integer numeric type, the integer operand
+ -- is first converted to a fixed-point type of the same subtype
+ -- as the other operand using Copy_V with default rounding and
+ -- overflow modes. The operation is then performed between two
+ -- fixed-point operands in the normal way.
+ --
+ ------------------------------------------------------------------
+
+
+ ------------------------------------
+ -- A.1. Unary "-" negation operator
+ ------------------------------------
+
+ -- A.1.1. SFix := - UFix
+ function "-" (R: UFix) return SFix;
+
+ -- A.1.2. SFix := - SFix
+ function "-" (R: SFix) return SFix;
+
+
+ --------------------------------------------
+ -- A.2. Unary "abs" absolute-value operator
+ --------------------------------------------
+
+ -- A.2.1. SFix := abs SFix
+ function "abs" (R: SFix) return SFix;
+
+
+ -------------------------------------
+ -- A.3. Binary "+" addition operator
+ -------------------------------------
+
+ -- A.3.1. UFix := UFix + UFix
+ function "+" (L: UFix; R: UFix) return UFix;
+
+ -- A.3.2. UFix := UFix + unsigned
+ function "+" (L: UFix; R: unsigned) return UFix;
+
+ -- A.3.3. UFix := unsigned + UFix
+ function "+" (L: unsigned; R: UFix) return UFix;
+
+ -- A.3.4. UFix := UFix + natural
+ function "+" (L: UFix; R: natural) return UFix;
+
+ -- A.3.5. UFix := natural + UFix
+ function "+" (L: natural; R: UFix) return UFix;
+
+ -- A.3.6. SFix := SFix + SFix
+ function "+" (L: SFix; R: SFix) return SFix;
+
+ -- A.3.7. SFix := SFix + UFix
+ function "+" (L: SFix; R: UFix) return SFix;
+
+ -- A.3.8. SFix := UFix + SFix
+ function "+" (L: UFix; R: SFix) return SFix;
+
+ -- A.3.9. SFix := SFix + signed
+ function "+" (L: SFix; R: signed) return SFix;
+
+ -- A.3.10. SFix := signed + SFix
+ function "+" (L: signed; R: SFix) return SFix;
+
+ -- A.3.11. SFix := SFix + integer
+ function "+" (L: SFix; R: integer) return SFix;
+
+ -- A.3.12. SFix := integer + SFix
+ function "+" (L: integer; R: SFix) return SFix;
+
+
+ ----------------------------------------
+ -- A.4. Binary "-" subtraction operator
+ ----------------------------------------
+ --
+ -- NOTE: There is a special problem with subtraction
+ -- operators that return a UFix result if that result
+ -- goes negative. Our arbitrary decision is that we
+ -- truncate most-significant bits in this case. If you
+ -- wish to avoid the risk of this arbitrarily-defined
+ -- truncation behaviour, change one or more of your
+ -- operands to SFix and get a SFix result using this
+ -- idiom:
+ -- SFix := UFix + (-UFix)
+ -- or copy one of the UFix operands into a SFix that's
+ -- one bit wider, before performing the operation.
+ --
+ -- Subtractions returning a UFix result take unsigned
+ -- operands and do not exhibit bit growth.
+ -- Subtractions returning a SFix result take signed or
+ -- unsigned operands and exhibit one-bit growth like addition.
+
+ -- A.4.1. UFix := UFix - UFix
+ function "-" (L: UFix; R: UFix) return UFix;
+
+ -- A.4.2. UFix := UFix - unsigned
+ function "-" (L: UFix; R: unsigned) return UFix;
+
+ -- A.4.3. UFix := unsigned - UFix
+ function "-" (L: unsigned; R: UFix) return UFix;
+
+ -- A.4.4. UFix := UFix - natural
+ function "-" (L: UFix; R: natural) return UFix;
+
+ -- A.4.5. UFix := natural - UFix
+ function "-" (L: natural; R: UFix) return UFix;
+
+ -- A.4.6. SFix := SFix - SFix
+ function "-" (L: SFix; R: SFix) return SFix;
+
+ -- A.4.7. SFix := SFix - UFix
+ function "-" (L: SFix; R: UFix) return SFix;
+
+ -- A.4.8. SFix := UFix - SFix
+ function "-" (L: UFix; R: SFix) return SFix;
+
+ -- A.4.9. SFix := SFix - signed
+ function "-" (L: SFix; R: signed) return SFix;
+
+ -- A.4.10. SFix := signed - SFix
+ function "-" (L: signed; R: SFix) return SFix;
+
+ -- A.4.11. SFix := SFix - integer
+ function "-" (L: SFix; R: integer) return SFix;
+
+ -- A.4.12. SFix := integer - SFix
+ function "-" (L: integer; R: SFix) return SFix;
+
+
+ -------------------------------------------
+ -- A.5. Binary "*" multiplication operator
+ -------------------------------------------
+
+ -- A.5.1. UFix := UFix * UFix
+ function "*" (L: UFix; R: UFix) return UFix;
+
+ -- A.5.2. UFix := UFix * unsigned
+ function "*" (L: UFix; R: unsigned) return UFix;
+
+ -- A.5.3. UFix := unsigned * UFix
+ function "*" (L: unsigned; R: UFix) return UFix;
+
+ -- A.5.4. UFix := UFix * natural
+ function "*" (L: UFix; R: natural) return UFix;
+
+ -- A.5.5. UFix := natural * UFix
+ function "*" (L: natural; R: UFix) return UFix;
+
+ -- A.5.6. SFix := SFix * SFix
+ function "*" (L: SFix; R: SFix) return SFix;
+
+ -- A.5.7. SFix := SFix * UFix
+ function "*" (L: SFix; R: UFix) return SFix;
+
+ -- A.5.8. SFix := UFix * SFix
+ function "*" (L: UFix; R: SFix) return SFix;
+
+ -- A.5.9. SFix := SFix * signed
+ function "*" (L: SFix; R: signed) return SFix;
+
+ -- A.5.10. SFix := signed * SFix
+ function "*" (L: signed; R: SFix) return SFix;
+
+ -- A.5.11. SFix := SFix * integer
+ function "*" (L: SFix; R: integer) return SFix;
+
+ -- A.5.12. SFix := integer * SFix
+ function "*" (L: integer; R: SFix) return SFix;
+
+
+ ------------------------------------------------------------------
+ -- R. Relational operators - arithmetic comparisons involving
+ -- UFix, SFix and other numeric types.
+ -- The operators are overloaded for most of the sensible
+ -- combinations of SFix, UFix, UNSIGNED, SIGNED and INTEGER.
+ -- Note that in all cases comparisons are exact; if one
+ -- operand has more fraction bits than the other, the less
+ -- precise operand will have its LSBs zero-extended, and
+ -- these zero bits will take part in comparison with whatever
+ -- LSBs exist in the more precise operand.
+ ------------------------------------------------------------------
+
+ -------------------------------------
+ -- R.1. Binary "=" equality operator
+ -------------------------------------
+
+ -- R.1.1. UFix = UFix
+ function "=" (L: UFix; R: UFix) return boolean;
+
+ -- R.1.2. UFix = unsigned
+ function "=" (L: UFix; R: unsigned) return boolean;
+
+ -- R.1.3. unsigned = UFix
+ function "=" (L: unsigned; R: UFix) return boolean;
+
+ -- R.1.4. UFix = integer
+ function "=" (L: UFix; R: integer) return boolean;
+
+ -- R.1.5. integer = UFix
+ function "=" (L: integer; R: UFix) return boolean;
+
+ -- R.1.6. SFix = SFix
+ function "=" (L: SFix; R: SFix) return boolean;
+
+ -- R.1.7. SFix = UFix
+ function "=" (L: SFix; R: UFix) return boolean;
+
+ -- R.1.8. UFix = SFix
+ function "=" (L: UFix; R: SFix) return boolean;
+
+ -- R.1.9. SFix = signed
+ function "=" (L: SFix; R: signed) return boolean;
+
+ -- R.1.10. signed = SFix
+ function "=" (L: signed; R: SFix) return boolean;
+
+ -- R.1.11. SFix = integer
+ function "=" (L: SFix; R: integer) return boolean;
+
+ -- R.1.12. integer = SFix
+ function "=" (L: integer; R: SFix) return boolean;
+
+
+ --------------------------------------
+ -- R.2. Binary "<" less-than operator
+ --------------------------------------
+
+ -- R.2.1. UFix < UFix
+ function "<" (L: UFix; R: UFix) return boolean;
+
+ -- R.2.2. UFix < unsigned
+ function "<" (L: UFix; R: unsigned) return boolean;
+
+ -- R.2.3. unsigned < UFix
+ function "<" (L: unsigned; R: UFix) return boolean;
+
+ -- R.2.4. UFix < integer
+ function "<" (L: UFix; R: integer) return boolean;
+
+ -- R.2.5. integer < UFix
+ function "<" (L: integer; R: UFix) return boolean;
+
+ -- R.2.6. SFix < SFix
+ function "<" (L: SFix; R: SFix) return boolean;
+
+ -- R.2.7. SFix < UFix
+ function "<" (L: SFix; R: UFix) return boolean;
+
+ -- R.2.8. UFix < SFix
+ function "<" (L: UFix; R: SFix) return boolean;
+
+ -- R.2.9. SFix < signed
+ function "<" (L: SFix; R: signed) return boolean;
+
+ -- R.2.10. signed < SFix
+ function "<" (L: signed; R: SFix) return boolean;
+
+ -- R.2.11. SFix < integer
+ function "<" (L: SFix; R: integer) return boolean;
+
+ -- R.2.12. integer < SFix
+ function "<" (L: integer; R: SFix) return boolean;
+
+
+ ----------------------------------------
+ -- R.3. Binary "/=" inequality operator
+ ----------------------------------------
+
+ -- R.3.1. UFix /= UFix
+ function "/=" (L: UFix; R: UFix) return boolean;
+
+ -- R.3.2. UFix /= unsigned
+ function "/=" (L: UFix; R: unsigned) return boolean;
+
+ -- R.3.3. unsigned /= UFix
+ function "/=" (L: unsigned; R: UFix) return boolean;
+
+ -- R.3.4. UFix /= integer
+ function "/=" (L: UFix; R: integer) return boolean;
+
+ -- R.3.5. integer /= UFix
+ function "/=" (L: integer; R: UFix) return boolean;
+
+ -- R.3.6. SFix /= SFix
+ function "/=" (L: SFix; R: SFix) return boolean;
+
+ -- R.3.7. SFix /= UFix
+ function "/=" (L: SFix; R: UFix) return boolean;
+
+ -- R.3.8. UFix /= SFix
+ function "/=" (L: UFix; R: SFix) return boolean;
+
+ -- R.3.9. SFix /= signed
+ function "/=" (L: SFix; R: signed) return boolean;
+
+ -- R.3.10. signed /= SFix
+ function "/=" (L: signed; R: SFix) return boolean;
+
+ -- R.3.11. SFix /= integer
+ function "/=" (L: SFix; R: integer) return boolean;
+
+ -- R.3.12. integer /= SFix
+ function "/=" (L: integer; R: SFix) return boolean;
+
+
+ -----------------------------------------
+ -- R.4. Binary ">" greater-than operator
+ -----------------------------------------
+
+ -- R.4.1. UFix > UFix
+ function ">" (L: UFix; R: UFix) return boolean;
+
+ -- R.4.2. UFix > unsigned
+ function ">" (L: UFix; R: unsigned) return boolean;
+
+ -- R.4.3. unsigned > UFix
+ function ">" (L: unsigned; R: UFix) return boolean;
+
+ -- R.4.4. UFix > integer
+ function ">" (L: UFix; R: integer) return boolean;
+
+ -- R.4.5. integer > UFix
+ function ">" (L: integer; R: UFix) return boolean;
+
+ -- R.4.6. SFix > SFix
+ function ">" (L: SFix; R: SFix) return boolean;
+
+ -- R.4.7. SFix > UFix
+ function ">" (L: SFix; R: UFix) return boolean;
+
+ -- R.4.8. UFix > SFix
+ function ">" (L: UFix; R: SFix) return boolean;
+
+ -- R.4.9. SFix > signed
+ function ">" (L: SFix; R: signed) return boolean;
+
+ -- R.4.10. signed > SFix
+ function ">" (L: signed; R: SFix) return boolean;
+
+ -- R.4.11. SFix > integer
+ function ">" (L: SFix; R: integer) return boolean;
+
+ -- R.4.12. integer > SFix
+ function ">" (L: integer; R: SFix) return boolean;
+
+
+ ----------------------------------------------
+ -- R.5. Binary ">=" greater-or-equal operator
+ ----------------------------------------------
+
+ -- R.5.1. UFix >= UFix
+ function ">=" (L: UFix; R: UFix) return boolean;
+
+ -- R.5.2. UFix >= unsigned
+ function ">=" (L: UFix; R: unsigned) return boolean;
+
+ -- R.5.3. unsigned >= UFix
+ function ">=" (L: unsigned; R: UFix) return boolean;
+
+ -- R.5.4. UFix >= integer
+ function ">=" (L: UFix; R: integer) return boolean;
+
+ -- R.5.5. integer >= UFix
+ function ">=" (L: integer; R: UFix) return boolean;
+
+ -- R.5.6. SFix >= SFix
+ function ">=" (L: SFix; R: SFix) return boolean;
+
+ -- R.5.7. SFix >= UFix
+ function ">=" (L: SFix; R: UFix) return boolean;
+
+ -- R.5.8. UFix >= SFix
+ function ">=" (L: UFix; R: SFix) return boolean;
+
+ -- R.5.9. SFix >= signed
+ function ">=" (L: SFix; R: signed) return boolean;
+
+ -- R.5.10. signed >= SFix
+ function ">=" (L: signed; R: SFix) return boolean;
+
+ -- R.5.11. SFix >= integer
+ function ">=" (L: SFix; R: integer) return boolean;
+
+ -- R.5.12. integer >= SFix
+ function ">=" (L: integer; R: SFix) return boolean;
+
+
+ -------------------------------------------
+ -- R.6. Binary "<=" less-or-equal operator
+ -------------------------------------------
+
+ -- R.6.1. UFix <= UFix
+ function "<=" (L: UFix; R: UFix) return boolean;
+
+ -- R.6.2. UFix <= unsigned
+ function "<=" (L: UFix; R: unsigned) return boolean;
+
+ -- R.6.3. unsigned <= UFix
+ function "<=" (L: unsigned; R: UFix) return boolean;
+
+ -- R.6.4. UFix <= integer
+ function "<=" (L: UFix; R: integer) return boolean;
+
+ -- R.6.5. integer <= UFix
+ function "<=" (L: integer; R: UFix) return boolean;
+
+ -- R.6.6. SFix <= SFix
+ function "<=" (L: SFix; R: SFix) return boolean;
+
+ -- R.6.7. SFix <= UFix
+ function "<=" (L: SFix; R: UFix) return boolean;
+
+ -- R.6.8. UFix <= SFix
+ function "<=" (L: UFix; R: SFix) return boolean;
+
+ -- R.6.9. SFix <= signed
+ function "<=" (L: SFix; R: signed) return boolean;
+
+ -- R.6.10. signed <= SFix
+ function "<=" (L: signed; R: SFix) return boolean;
+
+ -- R.6.11. SFix <= integer
+ function "<=" (L: SFix; R: integer) return boolean;
+
+ -- R.6.12. integer <= SFix
+ function "<=" (L: integer; R: SFix) return boolean;
+
+
+ ------------------------------------------------------------------
+ -- C. Concatenation operators between fixed-point operands, and
+ -- between fixed-point operands and other reasonable types.
+ -- Unlike the implicitly defined "&" operator, they preserve
+ -- place value and return an appropriately aligned subtype.
+ -- Preservation of place value means that some concatenation
+ -- operations are illegal. In particular, operations
+ -- [SFix & SFix] and [UFix & SFix] are illegal, and
+ -- the place values of operands in [SFix & UFix] and
+ -- [UFix & UFix] must match up - the rightmost subscript of
+ -- the left operand must be one higher than the leftmost
+ -- subscript of the right operand.
+ -- Single bits of type std_ulogic may be concatenated with
+ -- fixed-point types where there is no risk of losing
+ -- sign-extension information.
+ -- Because of the way VHDL defines implicit concatenation,
+ -- it is impossible to detect all these errors at compile time.
+ -- Instead they are detected by assertion statements at run time.
+ -- Tool vendors may choose to implement compile-time checks
+ -- so that the run-time checking overhead can be avoided.
+ ------------------------------------------------------------------
+
+ -- C.1.1. UFix := UFix & UFix
+ function "&" (L: UFix; R: UFix) return UFix;
+
+ -- No need to define "&"[UFix, SFix] explicitly, because
+ -- the types are incompatible and so there's no default
+
+ -- C.1.2. UFix := UFix & std_ulogic
+ function "&" (L: UFix; R: std_ulogic) return UFix;
+
+ -- C.1.3. UFix := std_ulogic & UFix
+ function "&" (L: std_ulogic; R: UFix) return UFix;
+
+
+ -- C.2.1. SFix := SFix & UFix
+ function "&" (L: SFix; R: UFix) return SFix;
+
+ -- C.2.2. SFix := SFix & SFix -- ILLEGAL
+ function "&" (L: SFix; R: SFix) return SFix;
+
+ -- C.2.3. SFix := SFix & std_ulogic
+ function "&" (L: SFix; R: std_ulogic) return SFix;
+
+ -- C.2.4. SFix := std_ulogic & SFix
+ function "&" (L: std_ulogic; R: SFix) return SFix;
+
+
+end; -- package fix_std;
diff --git a/lib/fix_std/fix_stdb.vhd b/lib/fix_std/fix_stdb.vhd
new file mode 100644
index 0000000..695cd11
--- /dev/null
+++ b/lib/fix_std/fix_stdb.vhd
@@ -0,0 +1,1910 @@
+---------------------------------------------------------------------
+--
+-- Package body fix_std
+-- Fixed point arithmetic based on numeric_std
+-- Compile using VHDL-93 (required to support 'ASCENDING
+-- array attribute).
+--
+---------------------------------------------------------------------
+--
+-- This document describes a VHDL package of definitions and subprograms
+-- intended to support the use of fixed-point arithmetic in test benches
+-- and synthesisable designs. This document and the package it describes
+-- are made freely available to the HDL design community without warranty
+-- of any kind. You are welcome to make use of this information for your
+-- own private study and in your own designs. If you make use of the
+-- package, you accept sole responsibility for its fitness for purpose
+-- and its suitability in your application. You are free to modify the
+-- package in any way, and to record your contribution to it, but this
+-- notice must appear in a prominent place in any modified or derived
+-- version of the package or its supporting documentation.
+--
+-- The author wishes to thank his employer Doulos Ltd for making
+-- available the facilities used to develop, test and distribute this
+-- package. However, Doulos Ltd accepts no responsibility for the
+-- package's contents and cannot support it in any way.
+--
+---------------------------------------------------------------------
+-- Revision information:
+--
+-- Version 0.1 06-May-2003
+-- Alpha version, for review
+-- No division operators are provided, pending detailed
+-- consultation on their functionality.
+-- Some subprogram implementations are unnecessarily inefficient.
+-- Version 0.2 11-Jun-2003
+-- Fixes aiming to make the package portable across all synthesis tools:
+-- * Removed deferred constants, made them package constants
+-- * Removed all variable initialisations in procedures, made them
+-- procedural initialisations in the code
+-- * Fixed definition of extract functions to return just one bit
+-- if their results would otherwise be null
+---------------------------------------------------------------------
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+package body fix_std is
+
+ --------------------------------------------------------------------
+ -- DEFERRED CONSTANTS
+ --------------------------------------------------------------------
+ -- THESE CONSTANTS MAY BE ADJUSTED TO SUIT THE NEEDS OF SPECIFIC
+ -- IMPLEMENTATIONS OR APPLICATIONS.
+ --------------------------------------------------------------------
+
+ -- Fixed-point offset, the bit number (subscript) used for
+ -- the bit in a UFix or SFix vector having binary weight 2^0
+ -- (the units bit).
+ --
+ -- constant FixP : Fix_Subscr := 100;
+
+ -- Default values for overflow and rounding modes:
+ --
+ -- constant Fix_Default_Rounding : Fix_Rounding_Mode := clip_LS;
+ -- constant Fix_Default_Overflow : Fix_Overflow_Mode := clip_MS;
+
+ --------------------------------------------------------------------
+ -- END OF DEFERRED CONSTANTS
+ --------------------------------------------------------------------
+
+ --------------------------------------------------------------------
+ -- IMPLEMENTATION CONSTANTS
+ --------------------------------------------------------------------
+ -- THESE CONSTANTS MAY BE ADJUSTED TO SUIT THE NEEDS OF SPECIFIC
+ -- IMPLEMENTATIONS OR APPLICATIONS.
+ --------------------------------------------------------------------
+
+ -- Severity levels for various errors
+
+ -- Concatenation errors - bad sign extension, discontiguous range etc
+ -- These are only warnings - they just give the wrong answer.
+ --
+ constant concat_severity : severity_level := WARNING;
+
+ -- Subtype direction errors - the present implementation can't
+ -- handle fixed-point objects with ascending ranges. These messages
+ -- are intended to give early warning of problems that would
+ -- definitely cause other fatal errors at elaboration or run time.
+ --
+ constant direction_severity : severity_level := FAILURE;
+
+ -- Assertion error message constants
+
+ constant bad_direction_msg : string :=
+ " has ascending range";
+
+ constant concat_range_msg : string :=
+ "Concatenation bounds should have contiguous ranges";
+
+ constant concat_sxt_msg : string :=
+ "Concatenation corrupts sign of result";
+
+ constant concat_signLS_msg : string :=
+ "RHS of concatenation should be unsigned";
+
+ constant compare_meta_msg : string :=
+ "Metavalue detected in FIX_STD comparison, returning FALSE";
+
+ --------------------------------------------------------------------
+ -- END OF IMPLEMENTATION CONSTANTS
+ --------------------------------------------------------------------
+
+ --------------------------------------------------------------------
+ -- DO NOT MODIFY ANY CODE BELOW THIS POINT.
+ --------------------------------------------------------------------
+
+ -- Assumed bit width of INTEGER type in VHDL
+ --
+ constant INT_WIDTH : positive := 32;
+
+ -- Single-bit zero values
+ subtype Izero_UFixT is UFix(FixP downto FixP);
+ subtype Izero_SFixT is SFix(FixP downto FixP);
+ subtype Fzero_UFixT is UFix(FixP-1 downto FixP-1);
+ constant Izero_UFix: Izero_UFixT := "0";
+ constant Izero_SFix: Izero_SFixT := "0";
+ constant Fzero_UFix: Fzero_UFixT := "0";
+
+ --------------------------------------------------------------------
+ -- LOCAL PRIVATE SUBPROGRAMS
+ --------------------------------------------------------------------
+
+ -- Min, Max: Find minimum and maximum of two integers.
+ -- Useful for determining appropriate range for operation results.
+ --
+ function Max(L, R: Fix_Subscr) return Fix_Subscr is
+ begin
+ if L>R then
+ return L;
+ else
+ return R;
+ end if;
+ end;
+ --
+ function Min(L, R: Fix_Subscr) return Fix_Subscr is
+ begin
+ if L FixP then
+ return Span(U);
+ else
+ return U(U'LEFT downto FixP);
+ end if;
+ end;
+
+ -- E.2. Return the fractional part of a UFix value
+ function Frac(U: UFix) return UFix is
+ begin
+ if U'LEFT < FixP-1 then
+ return Span(U);
+ elsif U'RIGHT >= FixP then
+ return Fzero_UFix;
+ else
+ return U(FixP-1 downto U'RIGHT);
+ end if;
+ end;
+
+ -- E.3. Return the integral part of a SFix value
+ function Int(S: SFix) return SFix is
+ begin
+ if S'LENGTH = 0 then
+ return Izero_SFix;
+ elsif S'LEFT <= FixP then
+ return SFix'(FixP => S(S'LEFT));
+ elsif S'RIGHT > FixP then
+ return Span(S);
+ else
+ return S(S'LEFT downto FixP);
+ end if;
+ end;
+
+ -- E.4. Return the fractional part of a SFix value
+ function Frac(S: SFix) return UFix is
+ variable P: SFix(Max(S'LEFT, FixP) downto Min(S'RIGHT, FixP));
+ begin
+ if S'LEFT < FixP then
+ for I in FixP-1 downto S'LEFT+1 loop
+ P(I) := S(S'LEFT);
+ end loop;
+ P(S'RANGE) := S;
+ return UFix(S(FixP-1 downto S'RIGHT));
+ elsif S'RIGHT >= FixP then
+ return Fzero_UFix;
+ else
+ return UFix(S(FixP-1 downto S'RIGHT));
+ end if;
+ end;
+
+ -- E.5. Widen a SFix value if necessary so that
+ -- its range adjoins or spans the binary point
+ function Span(S: SFix) return SFix is
+ variable F: SFix(Max(S'LEFT, FixP) downto Min(S'RIGHT, FixP));
+ begin
+ F(S'RANGE) := S;
+ for I in F'LEFT downto S'LEFT+1 loop
+ F(I) := S(S'LEFT);
+ end loop;
+ for I in S'RIGHT-1 downto F'RIGHT loop
+ F(I) := '0';
+ end loop;
+ return F;
+ end;
+
+ -- E.6. Widen a UFix value if necessary so that
+ -- its range adjoins or spans the binary point
+ function Span(U: UFix) return UFix is
+ variable F: UFix(Max(U'LEFT, FixP-1) downto Min(U'RIGHT, FixP));
+ begin
+ F(U'RANGE) := U;
+ for I in F'LEFT downto U'LEFT+1 loop
+ F(I) := '0';
+ end loop;
+ for I in U'RIGHT-1 downto F'RIGHT loop
+ F(I) := '0';
+ end loop;
+ return F;
+ end;
+
+ ---------------------------
+ -- T. Conversion functions
+ ---------------------------
+
+ -- T.1 to T.8: Unsigned conversions
+
+ -- T.1. Resizing an existing UFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_UFix(
+ N : UFix;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return UFix is
+ variable F: UFix(MSB_index downto LSB_index);
+ begin
+ Copy_V(F, N, overflow, rounding);
+ return F;
+ end;
+
+ -- T.2. Resizing an existing SFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_UFix(
+ N : SFix;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return UFix is
+ variable F: UFix(MSB_index downto LSB_index);
+ begin
+ Copy_V(F, N, overflow, rounding);
+ return F;
+ end;
+
+ -- T.3. Conversion from integer to UFix. Provide number of
+ -- integer bits and number of fraction bits. Note that
+ -- negative input is tolerated!
+ --
+ function to_UFix(
+ N : integer;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return UFix is
+ variable F: UFix(MSB_index downto LSB_index);
+ begin
+ Copy_V(F, N, overflow, rounding);
+ return F;
+ end;
+
+ -- T.4. Conversion from unsigned to UFix. Provide subscripts of
+ -- MS and (optionally) LS bit of the resulting UFix.
+ --
+ function to_UFix(
+ N : unsigned;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return UFix is
+ variable F: UFix(MSB_index downto LSB_index);
+ begin
+ Copy_V(F, N, overflow, rounding);
+ return F;
+ end;
+
+ -- T.5. Conversion from unsigned to UFix. Automatically set the
+ -- range of the resulting UFix to match the unsigned value,
+ -- as an integral UFix value with no fraction bits.
+ --
+ function to_UFix( N : unsigned ) return UFix is
+ variable F: UFix(FixP+N'LENGTH-1 downto FixP);
+ begin
+ F := UFix(N);
+ return F;
+ end;
+
+ -- T.6. Conversion from UFix to unsigned. All integer bits are
+ -- preserved (including adding LS scale bits if necessary).
+ --
+ function to_unsigned(
+ N : UFix;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return unsigned is
+ variable F_UFix: UFix(N'LEFT downto FixP);
+ variable F: unsigned(F_UFix'LENGTH-1 downto 0);
+ begin
+ Copy_V(F_UFix, N, rounding=>rounding);
+ F := unsigned(F_UFix);
+ return F;
+ end;
+
+ -- T.7. Conversion from UFix to unsigned. Caller specifies
+ -- required number of bits in unsigned result.
+ --
+ function to_unsigned(
+ N : UFix;
+ bits : positive;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return unsigned is
+ variable F_UFix: UFix(FixP+bits-1 downto FixP);
+ variable F: unsigned(F_UFix'LENGTH-1 downto 0);
+ begin
+ Copy_V(F_UFix, N, overflow, rounding);
+ F := unsigned(F_UFix);
+ return F;
+ end;
+
+ -- T.8. Conversion from UFix to integer. Up to 31 integer bits are
+ -- preserved (including adding LS scale bits if necessary).
+ --
+ function to_integer(
+ N : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return integer is
+ variable F_UFix: UFix(Min(FixP+INT_WIDTH-2, N'LEFT) downto FixP);
+ begin
+ Copy_V(F_UFix, N, overflow, rounding);
+ return to_integer(unsigned(F_UFix));
+ end;
+
+ -- T.9 to T.16: Signed conversions
+
+ -- T.9. Resizing an existing UFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_SFix(
+ N : UFix;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return SFix is
+ variable F: SFix(MSB_index downto LSB_index);
+ begin
+ Copy_V(F, N, overflow, rounding);
+ return F;
+ end;
+
+ -- T.10. Resizing an existing SFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_SFix(
+ N : SFix;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return SFix is
+ variable F: SFix(MSB_index downto LSB_index);
+ begin
+ Copy_V(F, N, overflow, rounding);
+ return F;
+ end;
+
+ -- T.11. Conversion from integer to SFix. Provide number of
+ -- integer bits and number of fraction bits.
+ --
+ function to_SFix(
+ N : integer;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return SFix is
+ variable F: SFix(MSB_index downto LSB_index);
+ begin
+ Copy_V(F, N, overflow, rounding);
+ return F;
+ end;
+
+ -- T.12. Conversion from signed to SFix. Provide subscripts of
+ -- MS and (optionally) LS bit of the resulting SFix.
+ --
+ function to_SFix(
+ N : signed;
+ MSB_index : Fix_Subscr;
+ LSB_index : Fix_Subscr := FixP;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return SFix is
+ variable F: SFix(MSB_index downto LSB_index);
+ begin
+ Copy_V(F, N, overflow, rounding);
+ return F;
+ end;
+
+ -- T.13. Conversion from signed to SFix. Automatically set the
+ -- range of the resulting SFix to match the signed value,
+ -- as an integral SFix value with no fraction bits.
+ --
+ function to_SFix( N : signed ) return SFix is
+ variable F: SFix(FixP+N'LENGTH-1 downto FixP);
+ begin
+ F := SFix(N);
+ return F;
+ end;
+
+ -- T.14. Conversion from SFix to signed. All integer bits are
+ -- preserved (including adding LS scale bits if necessary).
+ --
+ function to_signed(
+ N : SFix;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return signed is
+ variable F_SFix: SFix(N'LEFT downto FixP);
+ variable F: signed(F_SFix'LENGTH-1 downto 0);
+ begin
+ Copy_V(F_SFix, N, rounding=>rounding);
+ F := signed(F_SFix);
+ return F;
+ end;
+
+ -- T.15. Conversion from SFix to signed. Caller specifies
+ -- required number of bits in signed result.
+ --
+ function to_signed(
+ N : SFix;
+ bits : positive;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return signed is
+ variable F_SFix: UFix(FixP+bits-1 downto FixP);
+ variable F: signed(F_SFix'LENGTH-1 downto 0);
+ begin
+ Copy_V(F_SFix, N, overflow, rounding);
+ F := signed(F_SFix);
+ return F;
+ end;
+
+ -- T.16. Conversion from SFix to integer. Up to 32 integer bits are
+ -- preserved (including adding LS scale bits if necessary).
+ --
+ function to_integer(
+ N : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) return integer is
+ variable F_SFix: SFix(Min(FixP+INT_WIDTH-1, N'LEFT) downto FixP);
+ begin
+ Copy_V(F_SFix, N, overflow, rounding);
+ return to_integer(signed(F_SFix));
+ end;
+
+ -- T.17. Conversion from UFix to SFix. This simply adds
+ -- an extra more significant bit, set to zero.
+ --
+ function to_SFix(U: UFix) return SFix is
+ variable F: SFix(U'LEFT+1 downto U'RIGHT);
+ begin
+ F := SFix('0' & U);
+ return F;
+ end;
+
+
+ ----------------------------------
+ -- V. Copy-to-variable procedures
+ ----------------------------------
+
+ -- Range-aware copying of an expression into a variable. The
+ -- ranges of destination variable and source expression are
+ -- used to determine correct rounding, overflow and scaling
+ -- behaviour.
+
+ -- V.1 to V.5: Copy an expression into a UFix variable
+
+ -- V.1. Copy UFix to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ subtype target_T is UFix(target'RANGE);
+ variable W: UFix(Max(target'LEFT, source'LEFT+1) downto
+ Min(target'RIGHT, source'RIGHT));
+ constant HighZero: UFix(W'LEFT downto target'LEFT+1) := (others => '0');
+ begin
+ assert not target'ASCENDING
+ report "target" & bad_direction_msg
+ severity direction_severity;
+ assert not source'ASCENDING
+ report "source" & bad_direction_msg
+ severity direction_severity;
+ W := (others => '0');
+ W(source'RANGE) := source;
+ if target'RIGHT > source'RIGHT then
+ case rounding is
+ when clip_LS | towards_zero =>
+ null;
+ when to_nearest =>
+ W(W'LEFT downto target'RIGHT-1) := UFix(
+ unsigned(W(W'LEFT downto target'RIGHT-1)) + 1
+ );
+ end case;
+ end if;
+ target := W(target'RANGE);
+ if HighZero'LENGTH > 0 then
+ if unsigned(W(HighZero'RANGE)) /= unsigned(HighZero) then
+ case overflow is
+ when clip_MS =>
+ null;
+ when saturate =>
+ target := target_T'(others => '1');
+ end case;
+ end if;
+ end if;
+ end;
+
+ -- V.2. Copy SFix to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable W: SFix(Max(Source'LEFT, target'LEFT) downto target'RIGHT);
+ constant target_zero: UFix(target'RANGE) := (others => '0');
+ begin
+ assert not target'ASCENDING
+ report "target" & bad_direction_msg
+ severity direction_severity;
+ assert not source'ASCENDING
+ report "source" & bad_direction_msg
+ severity direction_severity;
+ W := (others => '0');
+ -- Rounding & sign-extend
+ Copy_V(W, source, clip_MS, rounding);
+ -- Saturation?
+ if W < 0 and overflow = saturate then
+ target := target_zero;
+ else
+ Copy_V(target, UFix(W), overflow, clip_LS);
+ end if;
+ end;
+
+ -- V.3. Copy UNSIGNED to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : unsigned;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ constant U: UFix(FixP+source'LENGTH-1 downto FixP) := UFix(source);
+ begin
+ Copy_V(target, U, overflow, rounding);
+ end;
+
+ -- V.4. Copy SIGNED to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : signed;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ constant S: SFix(FixP+source'LENGTH-1 downto FixP) := SFix(source);
+ begin
+ Copy_V(target, S, overflow, rounding);
+ end;
+
+ -- V.5. Copy integer to UFix
+ --
+ procedure Copy_V(
+ target : out UFix;
+ source : integer;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ constant N: signed(FixP+INT_WIDTH-1 downto FixP)
+ := to_signed(source, INT_WIDTH);
+ begin
+ -- Cop-out, this is very inefficient, but will do for now.
+ Copy_V(target, N, overflow, rounding);
+ end;
+
+ -- V.6 to V.10: Copy an expression into a SFix variable
+
+ -- V.6. Copy UFix to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ constant S: SFix(FixP+source'LENGTH downto FixP) := to_SFix(source);
+ begin
+ Copy_V(target, S, overflow, rounding);
+ end;
+
+ -- V.7. Copy SFix to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ subtype target_T is SFix(target'RANGE);
+ variable W: SFix(Max(target'LEFT, source'LEFT+1) downto
+ Min(target'RIGHT, source'RIGHT));
+ variable HighSX: SFix(W'LEFT downto target'LEFT+1);
+ begin
+ for i in HighSX'RANGE loop
+ HighSX(i) := source(source'LEFT);
+ end loop;
+ assert not target'ASCENDING
+ report "target" & bad_direction_msg
+ severity direction_severity;
+ assert not source'ASCENDING
+ report "source" & bad_direction_msg
+ severity direction_severity;
+ -- Make W a copy of source, duly extended at both ends
+ W := (others => '0');
+ W(source'RANGE) := source;
+ W(HighSX'RANGE) := HighSX;
+ -- Do any rounding required
+ if target'RIGHT > source'RIGHT then
+ case rounding is
+ when clip_LS =>
+ null;
+ when towards_zero =>
+ if
+ (to_UX01(W(W'LEFT)) = '1') -- it's negative?
+ and
+ (unsigned(W(target'RIGHT-1 downto W'RIGHT)) /= 0) -- round up?
+ then
+ W(W'LEFT downto target'RIGHT) := SFix(
+ signed(W(W'LEFT downto target'RIGHT)) + 1
+ );
+ end if;
+ when to_nearest =>
+ W(W'LEFT downto target'RIGHT-1) := SFix(
+ signed(W(W'LEFT downto target'RIGHT-1)) + 1
+ );
+ end case;
+ end if;
+ -- Do any overflow required
+ target := W(target'RANGE);
+ if HighSX'LENGTH > 0 then
+ if signed(W(HighSX'RANGE)) /= signed(HighSX) then
+ case overflow is
+ when clip_MS =>
+ null;
+ when saturate =>
+ target := Target_T'(others => not W(W'LEFT));
+ target(target'LEFT) := W(W'LEFT);
+ end case;
+ end if;
+ end if;
+ end;
+
+ -- V.8. Copy UNSIGNED to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : unsigned;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ constant S: SFix(FixP+source'LENGTH downto FixP) := SFix('0' & source);
+ begin
+ Copy_V(target, S, overflow, rounding);
+ end;
+
+ -- V.9. Copy SIGNED to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : signed;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ constant S: SFix(FixP+source'LENGTH-1 downto FixP) := SFix(source);
+ begin
+ Copy_V(target, S, overflow, rounding);
+ end;
+
+ -- V.10. Copy integer to SFix
+ --
+ procedure Copy_V(
+ target : out SFix;
+ source : integer;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ constant N: signed(FixP+INT_WIDTH-1 downto FixP)
+ := to_signed(source, INT_WIDTH);
+ begin
+ -- Cop-out, this is very inefficient, but will do for now.
+ Copy_V(target, N, overflow, rounding);
+ end;
+
+
+ --------------------------------
+ -- S. Copy-to-signal procedures
+ --------------------------------
+ --
+ -- Range-aware copying of an expression into a signal. The
+ -- ranges of destination signal and source expression are
+ -- used to determine correct rounding, overflow and scaling
+ -- behaviour.
+
+ -- S.1 to S.5: Copy an expression into a UFix signal
+ --
+
+ -- S.1. Copy UFix to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: UFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.1. Copy SFix to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: UFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.3. Copy UNSIGNED to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : unsigned;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: UFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.4. Copy SIGNED to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : signed;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: UFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.5. Copy integer to UFix
+ --
+ procedure Copy_S(
+ signal target : out UFix;
+ source : integer;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: UFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.6 to S.10: Copy an expression into a SFix signal
+ --
+
+ -- S.6. Copy UFix to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : UFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: SFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.7. Copy SFix to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : SFix;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: SFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.8. Copy UNSIGNED to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : unsigned;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: SFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.9. Copy SIGNED to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : signed;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: SFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+ -- S.10. Copy integer to SFix
+ --
+ procedure Copy_S(
+ signal target : out SFix;
+ source : integer;
+ overflow : Fix_Overflow_Mode := Fix_Default_Overflow;
+ rounding : Fix_Rounding_Mode := Fix_Default_Rounding
+ ) is
+ variable V: SFix(target'RANGE);
+ begin
+ Copy_V(V, source, overflow, rounding);
+ target <= V;
+ end;
+
+
+ ------------------------------------------------------------------
+ -- A. Arithmetic operations involving UFix, SFix and other
+ -- numeric types.
+ -- The operators are overloaded for most of the sensible
+ -- combinations of SFix, UFix, UNSIGNED, SIGNED and INTEGER.
+ --
+ -- IMPORTANT NOTE:
+ -- Arithmetic operators return a result that is wide enough
+ -- and precise enough so that no information is lost. THIS IS
+ -- SIGNIFICANTLY DIFFERENT FROM THE BEHAVIOUR OF numeric_std.
+ -- In the detailed description that follow, "scaling" means
+ -- the numerical value (weight) of the least significant bit
+ -- in a fixed-point value.
+ --
+ -- ADDITION returns a result whose least significant bit
+ -- is the same as the least significant bit in either operand,
+ -- and whose most significant bit is one position higher than
+ -- the most significant bit in either operand. Addition of
+ -- two operands having the same bounds therefore results in
+ -- a growth of one bit at the most significant end. Addition
+ -- of an integer to a UFix or SFix is accomplished by first
+ -- converting the integer to the same subtype as the other
+ -- operand, thereby giving rise to one-bit growth; default
+ -- truncation and rounding modes are used for the conversion.
+ --
+ -- SUBTRACTION where one or both operands are signed behaves
+ -- in the same way as addition. Subtraction where both operands
+ -- are unsigned returns a result whose most significant bit
+ -- position is the same as the most significant bit in either
+ -- operand, and whose least significant bit is the same as the
+ -- least significant bit in either operand.
+ --
+ -- MULTIPLICATION returns a result whose width is the sum of
+ -- the widths of its two operands, and whose scaling is the
+ -- product of its two operands' scalings.
+ --
+ -- UNARY NEGATION always gives a result having one more
+ -- significant bit than the operand.
+ --
+ -- ABSOLUTE VALUE always gives a result having exactly the
+ -- same subtype as its operand.
+ --
+ -- In binary operations where one operand is a fixed-point type
+ -- and the other is an integer numeric type, the integer operand
+ -- is first converted to a fixed-point type of the same subtype
+ -- as the other operand using Copy_V with default rounding and
+ -- overflow modes. The operation is then performed between two
+ -- fixed-point operands in the normal way.
+ --
+ ------------------------------------------------------------------
+
+
+ ------------------------------------
+ -- A.1. Unary "-" negation operator
+ ------------------------------------
+
+ -- A.1.1. SFix := - UFix
+ function "-" (R: UFix) return SFix is
+ variable F: SFix(R'LEFT+1 downto R'RIGHT);
+ begin
+ F := SFix(-(signed('0' & R)));
+ return F;
+ end;
+
+ -- A.1.2. SFix := - SFix
+ function "-" (R: SFix) return SFix is
+ variable F: SFix(R'LEFT+1 downto R'RIGHT);
+ begin
+ F := SFix(-(signed(R(R'LEFT) & R)));
+ return F;
+ end;
+
+
+ --------------------------------------------
+ -- A.2. Unary "abs" absolute-value operator
+ --------------------------------------------
+
+ -- A.2.1. SFix := abs SFix
+ function "abs" (R: SFix) return SFix is
+ variable F: SFix(R'RANGE);
+ begin
+ F := R;
+ if to_X01(R(R'LEFT)) = '1' then
+ F := SFix(-(signed(R)));
+ end if;
+ return F;
+ end;
+
+
+ -------------------------------------
+ -- A.3. Binary "+" addition operator
+ -------------------------------------
+
+ -- A.3.1. UFix := UFix + UFix
+ function "+" (L: UFix; R: UFix) return UFix is
+ variable F: UFix(Max(L'LEFT, R'LEFT)+1 downto Min(L'Right, R'Right));
+ variable LU, RU: unsigned(F'RANGE);
+ begin
+ LU := (others => '0');
+ RU := (others => '0');
+ LU(L'RANGE) := unsigned(L);
+ RU(R'RANGE) := unsigned(R);
+ F := UFix(LU + RU);
+ return F;
+ end;
+
+ -- A.3.2. UFix := UFix + unsigned
+ function "+" (L: UFix; R: unsigned) return UFix is
+ begin
+ return L + to_UFix(R);
+ end;
+
+ -- A.3.3. UFix := unsigned + UFix
+ function "+" (L: unsigned; R: UFix) return UFix is
+ begin
+ return R+L;
+ end;
+
+ -- A.3.4. UFix := UFix + natural
+ function "+" (L: UFix; R: natural) return UFix is
+ variable R_fp: UFix(L'RANGE);
+ begin
+ Copy_V(R_fp, R);
+ return L + R_fp;
+ end;
+
+ -- A.3.5. UFix := natural + UFix
+ function "+" (L: natural; R: UFix) return UFix is
+ begin
+ return R+L;
+ end;
+
+ -- A.3.6. SFix := SFix + SFix
+ function "+" (L: SFix; R: SFix) return SFix is
+ variable F: SFix(Max(L'LEFT, R'LEFT)+1 downto Min(L'Right, R'Right));
+ variable LS, RS: signed(F'RANGE);
+ begin
+ LS := (others => '0');
+ RS := (others => '0');
+ LS(L'RANGE) := signed(L);
+ RS(R'RANGE) := signed(R);
+ for i in LS'LEFT downto L'LEFT+1 loop LS(i) := L(L'LEFT); end loop;
+ for i in RS'LEFT downto R'LEFT+1 loop RS(i) := R(R'LEFT); end loop;
+ F := SFix(LS + RS);
+ return F;
+ end;
+
+ -- A.3.7. SFix := SFix + UFix
+ function "+" (L: SFix; R: UFix) return SFix is
+ begin
+ return L + SFix('0' & R);
+ end;
+
+ -- A.3.8. SFix := UFix + SFix
+ function "+" (L: UFix; R: SFix) return SFix is
+ begin
+ return SFix('0' & L) + R;
+ end;
+
+ -- A.3.9. SFix := SFix + signed
+ function "+" (L: SFix; R: signed) return SFix is
+ begin
+ return L + to_SFix(R);
+ end;
+
+ -- A.3.10. SFix := signed + SFix
+ function "+" (L: signed; R: SFix) return SFix is
+ begin
+ return to_SFix(L) + R;
+ end;
+
+ -- A.3.11. SFix := SFix + integer
+ function "+" (L: SFix; R: integer) return SFix is
+ variable R_fp: SFix(L'RANGE);
+ begin
+ Copy_V(R_fp, R);
+ return L + R_fp;
+ end;
+
+ -- A.3.12. SFix := integer + SFix
+ function "+" (L: integer; R: SFix) return SFix is
+ begin
+ return R + L;
+ end;
+
+
+ ----------------------------------------
+ -- A.4. Binary "-" subtraction operator
+ ----------------------------------------
+ --
+ -- NOTE: There is a special problem with subtraction
+ -- operators that return a UFix result if that result
+ -- goes negative. Our arbitrary decision is that we
+ -- truncate most-significant bits in this case. If you
+ -- wish to avoid the risk of this arbitrarily-defined
+ -- truncation behaviour, change one or more of your
+ -- operands to SFix and get a SFix result using this
+ -- idiom:
+ -- SFix := UFix + (-UFix)
+ -- or copy one of the UFix operands into a SFix that's
+ -- one bit wider, before performing the operation.
+ --
+ -- Subtractions returning a UFix result take unsigned
+ -- operands and do not exhibit bit growth.
+ -- Subtractions returning a SFix result take signed or
+ -- unsigned operands and exhibit one-bit growth like addition.
+
+ -- A.4.1. UFix := UFix - UFix
+ function "-" (L: UFix; R: UFix) return UFix is
+ variable F, LW, RW: UFix(Max(L'LEFT, R'LEFT) downto
+ Min(L'RIGHT, R'RIGHT));
+ begin
+ LW := (others => '0');
+ RW := (others => '0');
+ LW(L'RANGE) := L;
+ RW(R'RANGE) := R;
+ F := UFix(unsigned(LW) - unsigned(RW));
+ return F;
+ end;
+
+ -- A.4.2. UFix := UFix - unsigned
+ function "-" (L: UFix; R: unsigned) return UFix is
+ begin
+ return L - to_UFix(R);
+ end;
+
+ -- A.4.3. UFix := unsigned - UFix
+ function "-" (L: unsigned; R: UFix) return UFix is
+ begin
+ return to_UFix(L) - R;
+ end;
+
+ -- A.4.4. UFix := UFix - integer
+ function "-" (L: UFix; R: natural) return UFix is
+ variable R_fp: UFix(L'RANGE);
+ begin
+ Copy_V(R_fp, R);
+ return L - R_fp;
+ end;
+
+ -- A.4.5. UFix := natural - UFix
+ function "-" (L: natural; R: UFix) return UFix is
+ variable L_fp: UFix(R'RANGE);
+ begin
+ Copy_V(L_fp, L);
+ return L_fp - R;
+ end;
+
+ -- A.4.6. SFix := SFix - SFix
+ function "-" (L: SFix; R: SFix) return SFix is
+ begin
+ return L + (-R);
+ end;
+
+ -- A.4.7. SFix := SFix - UFix
+ function "-" (L: SFix; R: UFix) return SFix is
+ begin
+ return L + (-R);
+ end;
+
+ -- A.4.8. SFix := UFix - SFix
+ function "-" (L: UFix; R: SFix) return SFix is
+ begin
+ return To_SFix(L) - R;
+ end;
+
+ -- A.4.9. SFix := SFix - signed
+ function "-" (L: SFix; R: signed) return SFix is
+ begin
+ return L - to_SFix(R);
+ end;
+
+ -- A.4.10. SFix := signed - SFix
+ function "-" (L: signed; R: SFix) return SFix is
+ begin
+ return to_SFix(L) - R;
+ end;
+
+ -- A.4.11. SFix := SFix - integer
+ function "-" (L: SFix; R: integer) return SFix is
+ variable R_fp: SFix(L'RANGE);
+ begin
+ Copy_V(R_fp, R);
+ return L - R_fp;
+ end;
+
+ -- A.4.12. SFix := integer - SFix
+ function "-" (L: integer; R: SFix) return SFix is
+ variable L_fp: SFix(R'RANGE);
+ begin
+ Copy_V(L_fp, L);
+ return L_fp - R;
+ end;
+
+
+ -------------------------------------------
+ -- A.5. Binary "*" multiplication operator
+ -------------------------------------------
+
+ -- A.5.1. UFix := UFix * UFix
+ function "*" (L: UFix; R: UFix) return UFix is
+ variable F: UFix(L'LEFT+R'LEFT+1-FixP downto L'RIGHT+R'RIGHT-FixP);
+ begin
+ F := UFix(unsigned(L) * unsigned(R));
+ return F;
+ end;
+
+ -- A.5.2. UFix := UFix * unsigned
+ function "*" (L: UFix; R: unsigned) return UFix is
+ begin
+ return L * to_UFix(R);
+ end;
+
+ -- A.5.3. UFix := unsigned * UFix
+ function "*" (L: unsigned; R: UFix) return UFix is
+ begin
+ return to_UFix(L) * R;
+ end;
+
+ -- A.5.4. UFix := UFix * natural
+ function "*" (L: UFix; R: natural) return UFix is
+ variable R_fp: UFix(L'RANGE);
+ begin
+ Copy_V(R_fp, R);
+ return L * R_fp;
+ end;
+
+ -- A.5.5. UFix := natural * UFix
+ function "*" (L: natural; R: UFix) return UFix is
+ begin
+ return R * L;
+ end;
+
+ -- A.5.6. SFix := SFix * SFix
+ function "*" (L: SFix; R: SFix) return SFix is
+ variable F: SFix(L'LEFT+R'LEFT+1-FixP downto L'RIGHT+R'RIGHT-FixP);
+ begin
+ F := SFix(signed(L) * signed(R));
+ return F;
+ end;
+
+ -- A.5.7. SFix := SFix * UFix
+ function "*" (L: SFix; R: UFix) return SFix is
+ constant RS: SFix := SFix('0' & R);
+ variable F: SFix(L'LEFT+R'LEFT+1-FixP downto L'RIGHT+R'RIGHT-FixP);
+ variable FW: SFix(F'LEFT+1 downto F'RIGHT);
+ begin
+ FW := SFix(signed(L) * signed(RS));
+ Copy_V(F, FW); -- never overflows
+ return F;
+ end;
+
+ -- A.5.8. SFix := UFix * SFix
+ function "*" (L: UFix; R: SFix) return SFix is
+ begin
+ return R * L;
+ end;
+
+ -- A.5.9. SFix := SFix * signed
+ function "*" (L: SFix; R: signed) return SFix is
+ begin
+ return L * to_SFix(R);
+ end;
+
+ -- A.5.10. SFix := signed * SFix
+ function "*" (L: signed; R: SFix) return SFix is
+ begin
+ return to_SFix(L) * R;
+ end;
+
+ -- A.5.11. SFix := SFix * integer
+ function "*" (L: SFix; R: integer) return SFix is
+ variable R_fp: SFix(L'RANGE);
+ begin
+ Copy_V(R_fp, R);
+ return L * R_fp;
+ end;
+
+ -- A.5.12. SFix := integer * SFix
+ function "*" (L: integer; R: SFix) return SFix is
+ begin
+ return R * L;
+ end;
+
+
+ ------------------------------------------------------------------
+ -- R. Relational operators - arithmetic comparisons involving
+ -- UFix, SFix and other numeric types.
+ -- The operators are overloaded for most of the sensible
+ -- combinations of SFix, UFix, UNSIGNED, SIGNED and INTEGER.
+ -- Note that in all cases comparisons are exact; if one
+ -- operand has more fraction bits than the other, the less
+ -- precise operand will have its LSBs zero-extended, and
+ -- these zero bits will take part in comparison with whatever
+ -- LSBs exist in the more precise operand.
+ --
+ -- Our implementation is based on only two operators, "=" and "<".
+ -- All other operators are derived from these two, either by
+ -- logical inversion of the result or by swapping operands.
+ ------------------------------------------------------------------
+
+ -------------------------------------
+ -- R.1. Binary "=" equality operator
+ -------------------------------------
+
+ -- R.1.1. UFix = UFix
+ function "=" (L: UFix; R: UFix) return boolean is
+ variable LW, RW: UFix(Max(L'LEFT, R'LEFT) downto Min(L'RIGHT, R'RIGHT));
+ begin
+ LW := (others => '0');
+ RW := (others => '0');
+ LW(L'RANGE) := L;
+ RW(R'RANGE) := R;
+ return unsigned(LW) = unsigned(RW);
+ end;
+
+ -- R.1.2. UFix = unsigned
+ function "=" (L: UFix; R: unsigned) return boolean is
+ begin
+ return L = to_UFix(R);
+ end;
+
+ -- R.1.3. unsigned = UFix
+ function "=" (L: unsigned; R: UFix) return boolean is
+ begin
+ return to_UFix(L) = R;
+ end;
+
+ -- R.1.4. UFix = integer
+ function "=" (L: UFix; R: integer) return boolean is
+ variable RS: SFix(FixP+INT_WIDTH-1 downto FixP);
+ begin
+ Copy_V(RS, R, clip_MS, clip_LS);
+ return To_SFix(L) = RS;
+ end;
+
+ -- R.1.5. integer = UFix
+ function "=" (L: integer; R: UFix) return boolean is
+ begin
+ return R = L;
+ end;
+
+ -- R.1.6. SFix = SFix
+ function "=" (L: SFix; R: SFix) return boolean is
+ variable LW, RW: SFix(Max(L'LEFT, R'LEFT) downto Min(L'RIGHT, R'RIGHT));
+ begin
+ -- clip modes are OK because we aren't losing any bits
+ Copy_V(LW, L, clip_MS, clip_LS);
+ Copy_V(RW, R, clip_MS, clip_LS);
+ return signed(LW) = signed(RW);
+ end;
+
+ -- R.1.7. SFix = UFix
+ function "=" (L: SFix; R: UFix) return boolean is
+ begin
+ return L = To_SFix(R);
+ end;
+
+ -- R.1.8. UFix = SFix
+ function "=" (L: UFix; R: SFix) return boolean is
+ begin
+ return R = L;
+ end;
+
+ -- R.1.9. SFix = signed
+ function "=" (L: SFix; R: signed) return boolean is
+ begin
+ return L = to_SFix(R);
+ end;
+
+ -- R.1.10. signed = SFix
+ function "=" (L: signed; R: SFix) return boolean is
+ begin
+ return to_SFix(L) = R;
+ end;
+
+ -- R.1.11. SFix = integer
+ function "=" (L: SFix; R: integer) return boolean is
+ variable RS: SFix(FixP+INT_WIDTH-1 downto FixP);
+ begin
+ Copy_V(RS, R, clip_MS, clip_LS);
+ return L = RS;
+ end;
+
+ -- R.1.12. integer = SFix
+ function "=" (L: integer; R: SFix) return boolean is
+ begin
+ return R = L;
+ end;
+
+
+ --------------------------------------
+ -- R.2. Binary "<" less-than operator
+ --------------------------------------
+
+ -- R.2.1. UFix < UFix
+ function "<" (L: UFix; R: UFix) return boolean is
+ variable LW, RW: unsigned(Max(L'LEFT, R'LEFT) downto
+ Min(L'RIGHT, R'RIGHT));
+ begin
+ LW := (others => '0');
+ RW := (others => '0');
+ LW(L'RANGE) := unsigned(L);
+ RW(R'RANGE) := unsigned(R);
+ return unsigned(LW) < unsigned(RW);
+ end;
+
+ -- R.2.2. UFix < unsigned
+ function "<" (L: UFix; R: unsigned) return boolean is
+ begin
+ return L < To_UFix(R);
+ end;
+
+ -- R.2.3. unsigned < UFix
+ function "<" (L: unsigned; R: UFix) return boolean is
+ begin
+ return To_UFix(L) < R;
+ end;
+
+ -- R.2.4. UFix < integer
+ function "<" (L: UFix; R: integer) return boolean is
+ variable S: SFix(FixP+INT_WIDTH-1 downto FixP);
+ begin
+ Copy_V(S, R, clip_MS, clip_LS);
+ return L < S;
+ end;
+
+ -- R.2.5. integer < UFix
+ function "<" (L: integer; R: UFix) return boolean is
+ variable S: SFix(FixP+INT_WIDTH-1 downto FixP);
+ begin
+ Copy_V(S, L, clip_MS, clip_LS);
+ return S < R;
+ end;
+
+ -- R.2.6. SFix < SFix
+ function "<" (L: SFix; R: SFix) return boolean is
+ variable LW, RW: SFix(Max(L'LEFT, R'LEFT) downto
+ Min(L'RIGHT, R'RIGHT));
+ begin
+ Copy_V(LW, L, clip_MS, clip_LS);
+ Copy_V(RW, R, clip_MS, clip_LS);
+ return signed(LW) < signed(RW);
+ end;
+
+ -- R.2.7. SFix < UFix
+ function "<" (L: SFix; R: UFix) return boolean is
+ begin
+ return L < To_SFix(R);
+ end;
+
+ -- R.2.8. UFix < SFix
+ function "<" (L: UFix; R: SFix) return boolean is
+ begin
+ return To_SFix(L) < R;
+ end;
+
+ -- R.2.9. SFix < signed
+ function "<" (L: SFix; R: signed) return boolean is
+ begin
+ return L < To_SFix(R);
+ end;
+
+ -- R.2.10. signed < SFix
+ function "<" (L: signed; R: SFix) return boolean is
+ begin
+ return To_SFix(L) < R;
+ end;
+
+ -- R.2.11. SFix < integer
+ function "<" (L: SFix; R: integer) return boolean is
+ variable S: SFix(FixP+INT_WIDTH-1 downto FixP);
+ begin
+ Copy_V(S, R, clip_MS, clip_LS);
+ return L < S;
+ end;
+
+ -- R.2.12. integer < SFix
+ function "<" (L: integer; R: SFix) return boolean is
+ variable S: SFix(FixP+INT_WIDTH-1 downto FixP);
+ begin
+ Copy_V(S, L, clip_MS, clip_LS);
+ return S < R;
+ end;
+
+
+ ----------------------------------------
+ -- R.3. Binary "/=" inequality operator
+ ----------------------------------------
+
+ -- R.3.1. UFix /= UFix
+ function "/=" (L: UFix; R: UFix) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.2. UFix /= unsigned
+ function "/=" (L: UFix; R: unsigned) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.3. unsigned /= UFix
+ function "/=" (L: unsigned; R: UFix) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.4. UFix /= integer
+ function "/=" (L: UFix; R: integer) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.5. integer /= UFix
+ function "/=" (L: integer; R: UFix) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.6. SFix /= SFix
+ function "/=" (L: SFix; R: SFix) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.7. SFix /= UFix
+ function "/=" (L: SFix; R: UFix) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.8. UFix /= SFix
+ function "/=" (L: UFix; R: SFix) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.9. SFix /= signed
+ function "/=" (L: SFix; R: signed) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.10. signed /= SFix
+ function "/=" (L: signed; R: SFix) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.11. SFix /= integer
+ function "/=" (L: SFix; R: integer) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+ -- R.3.12. integer /= SFix
+ function "/=" (L: integer; R: SFix) return boolean is
+ begin
+ return not (L = R);
+ end;
+
+
+ -----------------------------------------
+ -- R.4. Binary ">" greater-than operator
+ -----------------------------------------
+
+ -- R.4.1. UFix > UFix
+ function ">" (L: UFix; R: UFix) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.2. UFix > unsigned
+ function ">" (L: UFix; R: unsigned) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.3. unsigned > UFix
+ function ">" (L: unsigned; R: UFix) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.4. UFix > integer
+ function ">" (L: UFix; R: integer) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.5. integer > UFix
+ function ">" (L: integer; R: UFix) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.6. SFix > SFix
+ function ">" (L: SFix; R: SFix) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.7. SFix > UFix
+ function ">" (L: SFix; R: UFix) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.8. UFix > SFix
+ function ">" (L: UFix; R: SFix) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.9. SFix > signed
+ function ">" (L: SFix; R: signed) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.10. signed > SFix
+ function ">" (L: signed; R: SFix) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.11. SFix > integer
+ function ">" (L: SFix; R: integer) return boolean is
+ begin
+ return R < L;
+ end;
+
+ -- R.4.12. integer > SFix
+ function ">" (L: integer; R: SFix) return boolean is
+ begin
+ return R < L;
+ end;
+
+
+ ----------------------------------------------
+ -- R.5. Binary ">=" greater-or-equal operator
+ ----------------------------------------------
+
+ -- R.5.1. UFix >= UFix
+ function ">=" (L: UFix; R: UFix) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.2. UFix >= unsigned
+ function ">=" (L: UFix; R: unsigned) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.3. unsigned >= UFix
+ function ">=" (L: unsigned; R: UFix) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.4. UFix >= integer
+ function ">=" (L: UFix; R: integer) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.5. integer >= UFix
+ function ">=" (L: integer; R: UFix) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.6. SFix >= SFix
+ function ">=" (L: SFix; R: SFix) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.7. SFix >= UFix
+ function ">=" (L: SFix; R: UFix) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.8. UFix >= SFix
+ function ">=" (L: UFix; R: SFix) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.9. SFix >= signed
+ function ">=" (L: SFix; R: signed) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.10. signed >= SFix
+ function ">=" (L: signed; R: SFix) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.11. SFix >= integer
+ function ">=" (L: SFix; R: integer) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+ -- R.5.12. integer >= SFix
+ function ">=" (L: integer; R: SFix) return boolean is
+ begin
+ return not (L < R);
+ end;
+
+
+ -------------------------------------------
+ -- R.6. Binary "<=" less-or-equal operator
+ -------------------------------------------
+
+ -- R.6.1. UFix <= UFix
+ function "<=" (L: UFix; R: UFix) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.2. UFix <= unsigned
+ function "<=" (L: UFix; R: unsigned) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.3. unsigned <= UFix
+ function "<=" (L: unsigned; R: UFix) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.4. UFix <= integer
+ function "<=" (L: UFix; R: integer) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.5. integer <= UFix
+ function "<=" (L: integer; R: UFix) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.6. SFix <= SFix
+ function "<=" (L: SFix; R: SFix) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.7. SFix <= UFix
+ function "<=" (L: SFix; R: UFix) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.8. UFix <= SFix
+ function "<=" (L: UFix; R: SFix) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.9. SFix <= signed
+ function "<=" (L: SFix; R: signed) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.10. signed <= SFix
+ function "<=" (L: signed; R: SFix) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.11. SFix <= integer
+ function "<=" (L: SFix; R: integer) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ -- R.6.12. integer <= SFix
+ function "<=" (L: integer; R: SFix) return boolean is
+ begin
+ return not (R < L);
+ end;
+
+ ------------------------------------------------------------------
+ -- C. Concatenation operators between fixed-point operands, and
+ -- between fixed-point operands and other reasonable types.
+ -- Unlike the implicitly defined "&" operator, they preserve
+ -- place value and return an appropriately aligned subtype.
+ -- Preservation of place value means that some concatenation
+ -- operations are illegal. In particular, operations
+ -- [SFix & SFix] and [UFix & SFix] are illegal, and
+ -- the place values of operands in [SFix & UFix] and
+ -- [UFix & UFix] must match up - the rightmost subscript of
+ -- the left operand must be one higher than the leftmost
+ -- subscript of the right operand.
+ -- Single bits of type std_ulogic may be concatenated with
+ -- fixed-point types where there is no risk of losing
+ -- sign-extension information.
+ -- Because of the way VHDL defines implicit concatenation,
+ -- it is impossible to detect all these errors at compile time.
+ -- Instead they are detected by assertion statements at run time.
+ -- Tool vendors may choose to implement compile-time checks
+ -- so that the run-time checking overhead can be avoided.
+ ------------------------------------------------------------------
+
+ -- C.1.1. UFix := UFix & UFix
+ function "&" (L: UFix; R: UFix) return UFix is
+ begin
+ return UFix(concat(std_logic_vector(L), std_logic_vector(R)));
+ end;
+
+ -- C.1.2. UFix := UFix & std_ulogic
+ function "&" (L: UFix; R: std_ulogic) return UFix is
+ begin
+ return UFix(concat(std_logic_vector(L), R));
+ end;
+
+ -- C.1.3. UFix := std_ulogic & UFix
+ function "&" (L: std_ulogic; R: UFix) return UFix is
+ begin
+ return UFix(concat(L, std_logic_vector(R)));
+ end;
+
+
+ -- C.2.1. SFix := SFix & UFix
+ function "&" (L: SFix; R: UFix) return SFix is
+ begin
+ return SFix(concat(std_logic_vector(L), std_logic_vector(R)));
+ end;
+
+ -- C.2.2. SFix := SFix & SFix -- ILLEGAL
+ function "&" (L: SFix; R: SFix) return SFix is
+ begin
+ report concat_signLS_msg
+ severity concat_severity;
+ return SFix(concat(std_logic_vector(L), std_logic_vector(R)));
+ end;
+
+ -- C.2.3. SFix := SFix & std_ulogic
+ function "&" (L: SFix; R: std_ulogic) return SFix is
+ begin
+ return SFix(concat(std_logic_vector(L), R));
+ end;
+
+ -- C.2.4. SFix := std_ulogic & SFix
+ function "&" (L: std_ulogic; R: SFix) return SFix is
+ begin
+ assert std_match(L, R(R'LEFT))
+ report concat_sxt_msg
+ severity concat_severity;
+ return SFix(concat(L, std_logic_vector(R)));
+ end;
+
+
+end; -- package body fix_std;
diff --git a/lib/fixed/fixed_pkg_c.vhd b/lib/fixed/fixed_pkg_c.vhd
new file mode 100644
index 0000000..68acdd1
--- /dev/null
+++ b/lib/fixed/fixed_pkg_c.vhd
@@ -0,0 +1,7846 @@
+------------------------------------------------------------------------------
+-- "fixed_pkg" package contains functions for fixed point math.
+-- Please see the documentation for the fixed point package.
+-- This package should be compiled into "ieee_proposed" and used as follows:
+-- use ieee.std_logic_1164.all;
+-- use ieee.numeric_std.all;
+-- use ieee_proposed.fixed_pkg.all;
+-- Last Modified: $Date: 2008-08-23 08:20:29 $
+-- RCS ID: $Id: fixed_pkg_c.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+--
+-- Created for VHDL-200X par, David Bishop (dbishop@vhdl.org)
+------------------------------------------------------------------------------
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+-- synthesis translate_off
+use std.textio.all;
+-- synthesis translate_on
+
+package fixed_pkg is
+ --%%% Uncomment the Generics
+-- new work.fixed_generic_pkg
+-- generic map (
+-- fixed_round_style => true; -- fixed_round
+-- fixed_overflow_style => true; -- fixed_saturate
+-- fixed_guard_bits => 3; -- number of guard bits
+-- no_warning => false -- show warnings
+-- );
+ --%%% REMOVE THE REST OF THIS FILE.
+ constant fixed_round_style : BOOLEAN := false; -- round
+ constant fixed_overflow_style : BOOLEAN := false; -- saturate
+ constant fixed_guard_bits : NATURAL := 3; -- number of guard bits
+ constant no_warning : BOOLEAN := false; -- issue warnings
+ -- Author David Bishop (dbishop@vhdl.org)
+ -- These 5 constants are used as defaults.
+ -- There is a mechanism to override them in every function
+ constant fixed_round : BOOLEAN := true; -- Turn on rounding routine
+ constant fixed_truncate : BOOLEAN := false; -- Trun off rounding routine
+ constant fixed_saturate : BOOLEAN := true; -- Saturate large numbers
+ constant fixed_wrap : BOOLEAN := false; -- Wrap large numbers
+ constant fixedsynth_or_real : BOOLEAN := true; -- differed constant
+ -- base Unsigned fixed point type, downto direction assumed
+ type ufixed is array (INTEGER range <>) of STD_LOGIC;
+ -- base Signed fixed point type, downto direction assumed
+ type sfixed is array (INTEGER range <>) of STD_LOGIC;
+ -----------------------------------------------------------------------------
+ -- Fixed point type is defined as follows:
+ -- 0000000000
+ -- 4321012345
+ -- 4 0 -5
+ -- The decimal point is assumed between the "0" and "-1" index
+ -- Thus "0011010000" = 6.5 and would be written as 00110.10000
+ -- All types are assumed to be in the "downto" direction.
+
+ --===========================================================================
+ -- Arithmetic Operators:
+ --===========================================================================
+ -- Modify the sign of the number, 2's complement
+ function "abs" (arg : sfixed) return sfixed;
+ function "-" (arg : sfixed)return sfixed;
+
+ -- Convert a signed fixed to an unsigned fixed
+ function "abs" (arg : sfixed) return ufixed;
+
+ -- Addition
+ -- ufixed(a downto b) + ufixed(c downto d)
+ -- = ufixed(max(a,c)+1 downto min(b,d))
+ function "+" (l, r : ufixed) return ufixed;
+
+ -- sfixed(a downto b) + sfixed(c downto d)
+ -- = sfixed(max(a,c)+1 downto min(b,d))
+ function "+" (l, r : sfixed) return sfixed;
+
+ -- Subtraction
+ -- ufixed(a downto b) - ufixed(c downto d)
+ -- = ufixed(max(a,c)+1 downto min(b,d))
+ function "-" (l, r : ufixed) return ufixed;
+
+ -- sfixed(a downto b) - sfixed(c downto d)
+ -- = sfixed(max(a,c)+1 downto min(b,d))
+ function "-" (l, r : sfixed) return sfixed;
+
+ -- Multiplication
+ -- ufixed(a downto b) * ufixed(c downto d) = ufixed(a+c+1 downto b+d)
+ function "*" (l, r : ufixed) return ufixed;
+
+ -- sfixed(a downto b) * sfixed(c downto d) = sfixed(a+c+1 downto b+d)
+ function "*" (l, r : sfixed) return sfixed;
+
+ -- Division
+ -- ufixed(a downto b) / ufixed(c downto d) = ufixed(a-d downto b-c-1)
+ function "/" (l, r : ufixed) return ufixed;
+
+ -- sfixed(a downto b) / sfixed(c downto d) = sfixed(a-d+1 downto b-c)
+ function "/" (l, r : sfixed) return sfixed;
+
+ -- Remainder
+ -- ufixed (a downto b) rem ufixed (c downto d)
+ -- = ufixed (min(a,c) downto min(b,d))
+ function "rem" (l, r : ufixed) return ufixed;
+
+ -- sfixed (a downto b) rem sfixed (c downto d)
+ -- = sfixed (min(a,c) downto min(b,d))
+ function "rem" (l, r : sfixed) return sfixed;
+
+ -- Modulo
+ -- ufixed (a downto b) mod ufixed (c downto d)
+ -- = ufixed (min(a,c) downto min(b, d))
+ function "mod" (l, r : ufixed) return ufixed;
+
+ -- sfixed (a downto b) mod sfixed (c downto d)
+ -- = sfixed (c downto min(b, d))
+ function "mod" (l, r : sfixed) return sfixed;
+
+ ----------------------------------------------------------------------------
+ -- Overload routines. In these routines the "real" or "natural" (integer)
+ -- are converted into a fixed point number and then the operation is
+ -- performed. It is assumed that the array will be large enough.
+ -- If the input is "real" then the real number is converted into a fixed of
+ -- the same size as the fixed point input. If the number is an "integer"
+ -- then it is converted into fixed with the range (l'high downto 0).
+ ----------------------------------------------------------------------------
+ -- ufixed(a downto b) + ufixed(a downto b) = ufixed(a+1 downto b)
+ function "+" (l : ufixed; r : REAL) return ufixed;
+
+ -- ufixed(c downto d) + ufixed(c downto d) = ufixed(c+1 downto d)
+ function "+" (l : REAL; r : ufixed) return ufixed;
+
+ -- ufixed(a downto b) + ufixed(a downto 0) = ufixed(a+1 downto min(0,b))
+ function "+" (l : ufixed; r : NATURAL) return ufixed;
+
+ -- ufixed(a downto 0) + ufixed(c downto d) = ufixed(c+1 downto min(0,d))
+ function "+" (l : NATURAL; r : ufixed) return ufixed;
+
+ -- ufixed(a downto b) - ufixed(a downto b) = ufixed(a+1 downto b)
+ function "-" (l : ufixed; r : REAL) return ufixed;
+
+ -- ufixed(c downto d) - ufixed(c downto d) = ufixed(c+1 downto d)
+ function "-" (l : REAL; r : ufixed) return ufixed;
+
+ -- ufixed(a downto b) - ufixed(a downto 0) = ufixed(a+1 downto min(0,b))
+ function "-" (l : ufixed; r : NATURAL) return ufixed;
+
+ -- ufixed(a downto 0) + ufixed(c downto d) = ufixed(c+1 downto min(0,d))
+ function "-" (l : NATURAL; r : ufixed) return ufixed;
+
+ -- ufixed(a downto b) * ufixed(a downto b) = ufixed(2a+1 downto 2b)
+ function "*" (l : ufixed; r : REAL) return ufixed;
+
+ -- ufixed(c downto d) * ufixed(c downto d) = ufixed(2c+1 downto 2d)
+ function "*" (l : REAL; r : ufixed) return ufixed;
+
+ -- ufixed (a downto b) * ufixed (a downto 0) = ufixed (2a+1 downto b)
+ function "*" (l : ufixed; r : NATURAL) return ufixed;
+
+ -- ufixed (a downto b) * ufixed (a downto 0) = ufixed (2a+1 downto b)
+ function "*" (l : NATURAL; r : ufixed) return ufixed;
+
+ -- ufixed(a downto b) / ufixed(a downto b) = ufixed(a-b downto b-a-1)
+ function "/" (l : ufixed; r : REAL) return ufixed;
+
+ -- ufixed(a downto b) / ufixed(a downto b) = ufixed(a-b downto b-a-1)
+ function "/" (l : REAL; r : ufixed) return ufixed;
+
+ -- ufixed(a downto b) / ufixed(a downto 0) = ufixed(a downto b-a-1)
+ function "/" (l : ufixed; r : NATURAL) return ufixed;
+
+ -- ufixed(c downto 0) / ufixed(c downto d) = ufixed(c-d downto -c-1)
+ function "/" (l : NATURAL; r : ufixed) return ufixed;
+
+ -- ufixed (a downto b) rem ufixed (a downto b) = ufixed (a downto b)
+ function "rem" (l : ufixed; r : REAL) return ufixed;
+
+ -- ufixed (c downto d) rem ufixed (c downto d) = ufixed (c downto d)
+ function "rem" (l : REAL; r : ufixed) return ufixed;
+
+ -- ufixed (a downto b) rem ufixed (a downto 0) = ufixed (a downto min(b,0))
+ function "rem" (l : ufixed; r : NATURAL) return ufixed;
+
+ -- ufixed (c downto 0) rem ufixed (c downto d) = ufixed (c downto min(d,0))
+ function "rem" (l : NATURAL; r : ufixed) return ufixed;
+
+ -- ufixed (a downto b) mod ufixed (a downto b) = ufixed (a downto b)
+ function "mod" (l : ufixed; r : REAL) return ufixed;
+
+ -- ufixed (c downto d) mod ufixed (c downto d) = ufixed (c downto d)
+ function "mod" (l : REAL; r : ufixed) return ufixed;
+
+ -- ufixed (a downto b) mod ufixed (a downto 0) = ufixed (a downto min(b,0))
+ function "mod" (l : ufixed; r : NATURAL) return ufixed;
+
+ -- ufixed (c downto 0) mod ufixed (c downto d) = ufixed (c downto min(d,0))
+ function "mod" (l : NATURAL; r : ufixed) return ufixed;
+
+ -- sfixed(a downto b) + sfixed(a downto b) = sfixed(a+1 downto b)
+ function "+" (l : sfixed; r : REAL) return sfixed;
+
+ -- sfixed(c downto d) + sfixed(c downto d) = sfixed(c+1 downto d)
+ function "+" (l : REAL; r : sfixed) return sfixed;
+
+ -- sfixed(a downto b) + sfixed(a downto 0) = sfixed(a+1 downto min(0,b))
+ function "+" (l : sfixed; r : INTEGER) return sfixed;
+
+ -- sfixed(c downto 0) + sfixed(c downto d) = sfixed(c+1 downto min(0,d))
+ function "+" (l : INTEGER; r : sfixed) return sfixed;
+
+ -- sfixed(a downto b) - sfixed(a downto b) = sfixed(a+1 downto b)
+ function "-" (l : sfixed; r : REAL) return sfixed;
+
+ -- sfixed(c downto d) - sfixed(c downto d) = sfixed(c+1 downto d)
+ function "-" (l : REAL; r : sfixed) return sfixed;
+
+ -- sfixed(a downto b) - sfixed(a downto 0) = sfixed(a+1 downto min(0,b))
+ function "-" (l : sfixed; r : INTEGER) return sfixed;
+
+ -- sfixed(c downto 0) - sfixed(c downto d) = sfixed(c+1 downto min(0,d))
+ function "-" (l : INTEGER; r : sfixed) return sfixed;
+
+ -- sfixed(a downto b) * sfixed(a downto b) = sfixed(2a+1 downto 2b)
+ function "*" (l : sfixed; r : REAL) return sfixed;
+
+ -- sfixed(c downto d) * sfixed(c downto d) = sfixed(2c+1 downto 2d)
+ function "*" (l : REAL; r : sfixed) return sfixed;
+
+ -- sfixed(a downto b) * sfixed(a downto 0) = sfixed(2a+1 downto b)
+ function "*" (l : sfixed; r : INTEGER) return sfixed;
+
+ -- sfixed(c downto 0) * sfixed(c downto d) = sfixed(2c+1 downto d)
+ function "*" (l : INTEGER; r : sfixed) return sfixed;
+
+ -- sfixed(a downto b) / sfixed(a downto b) = sfixed(a-b+1 downto b-a)
+ function "/" (l : sfixed; r : REAL) return sfixed;
+
+ -- sfixed(c downto d) / sfixed(c downto d) = sfixed(c-d+1 downto d-c)
+ function "/" (l : REAL; r : sfixed) return sfixed;
+
+ -- sfixed(a downto b) / sfixed(a downto 0) = sfixed(a+1 downto b-a)
+ function "/" (l : sfixed; r : INTEGER) return sfixed;
+
+ -- sfixed(c downto 0) / sfixed(c downto d) = sfixed(c-d+1 downto -c)
+ function "/" (l : INTEGER; r : sfixed) return sfixed;
+
+ -- sfixed (a downto b) rem sfixed (a downto b) = sfixed (a downto b)
+ function "rem" (l : sfixed; r : REAL) return sfixed;
+
+ -- sfixed (c downto d) rem sfixed (c downto d) = sfixed (c downto d)
+ function "rem" (l : REAL; r : sfixed) return sfixed;
+
+ -- sfixed (a downto b) rem sfixed (a downto 0) = sfixed (a downto min(b,0))
+ function "rem" (l : sfixed; r : INTEGER) return sfixed;
+
+ -- sfixed (c downto 0) rem sfixed (c downto d) = sfixed (c downto min(d,0))
+ function "rem" (l : INTEGER; r : sfixed) return sfixed;
+
+ -- sfixed (a downto b) mod sfixed (a downto b) = sfixed (a downto b)
+ function "mod" (l : sfixed; r : REAL) return sfixed;
+
+ -- sfixed (c downto d) mod sfixed (c downto d) = sfixed (c downto d)
+ function "mod" (l : REAL; r : sfixed) return sfixed;
+
+ -- sfixed (a downto b) mod sfixed (a downto 0) = sfixed (a downto min(b,0))
+ function "mod" (l : sfixed; r : INTEGER) return sfixed;
+
+ -- sfixed (c downto 0) mod sfixed (c downto d) = sfixed (c downto min(d,0))
+ function "mod" (l : INTEGER; r : sfixed) return sfixed;
+
+ -- This version of divide gives the user more control
+ -- ufixed(a downto b) / ufixed(c downto d) = ufixed(a-d downto b-c-1)
+ function divide (
+ l, r : ufixed;
+ constant round_style : BOOLEAN := fixed_round_style;
+ constant guard_bits : NATURAL := fixed_guard_bits)
+ return ufixed;
+
+ -- This version of divide gives the user more control
+ -- sfixed(a downto b) / sfixed(c downto d) = sfixed(a-d+1 downto b-c)
+ function divide (
+ l, r : sfixed;
+ constant round_style : BOOLEAN := fixed_round_style;
+ constant guard_bits : NATURAL := fixed_guard_bits)
+ return sfixed;
+
+ -- These functions return 1/X
+ -- 1 / ufixed(a downto b) = ufixed(-b downto -a-1)
+ function reciprocal (
+ arg : ufixed; -- fixed point input
+ constant round_style : BOOLEAN := fixed_round_style;
+ constant guard_bits : NATURAL := fixed_guard_bits)
+ return ufixed;
+
+ -- 1 / sfixed(a downto b) = sfixed(-b+1 downto -a)
+ function reciprocal (
+ arg : sfixed; -- fixed point input
+ constant round_style : BOOLEAN := fixed_round_style;
+ constant guard_bits : NATURAL := fixed_guard_bits)
+ return sfixed;
+
+ -- REM function
+ -- ufixed (a downto b) rem ufixed (c downto d)
+ -- = ufixed (min(a,c) downto min(b,d))
+ function remainder (
+ l, r : ufixed;
+ constant round_style : BOOLEAN := fixed_round_style)
+ return ufixed;
+
+ -- sfixed (a downto b) rem sfixed (c downto d)
+ -- = sfixed (min(a,c) downto min(b,d))
+ function remainder (
+ l, r : sfixed;
+ constant round_style : BOOLEAN := fixed_round_style)
+ return sfixed;
+
+ -- mod function
+ -- ufixed (a downto b) mod ufixed (c downto d)
+ -- = ufixed (min(a,c) downto min(b, d))
+ function modulo (
+ l, r : ufixed;
+ constant round_style : BOOLEAN := fixed_round_style)
+ return ufixed;
+
+ -- sfixed (a downto b) mod sfixed (c downto d)
+ -- = sfixed (c downto min(b, d))
+ function modulo (
+ l, r : sfixed;
+ constant overflow_style : BOOLEAN := fixed_overflow_style;
+ constant round_style : BOOLEAN := fixed_round_style)
+ return sfixed;
+
+ -- Procedure for those who need an "accumulator" function.
+ -- add_carry (ufixed(a downto b), ufixed (c downto d))
+ -- = ufixed (max(a,c) downto min(b,d))
+ procedure add_carry (
+ L, R : in ufixed;
+ c_in : in STD_ULOGIC;
+ result : out ufixed;
+ c_out : out STD_ULOGIC);
+
+ -- add_carry (sfixed(a downto b), sfixed (c downto d))
+ -- = sfixed (max(a,c) downto min(b,d))
+ procedure add_carry (
+ L, R : in sfixed;
+ c_in : in STD_ULOGIC;
+ result : out sfixed;
+ c_out : out STD_ULOGIC);
+
+ -- Scales the result by a power of 2. Width of input = width of output with
+ -- the decimal point moved.
+ function scalb (y : ufixed; N : integer) return ufixed;
+ function scalb (y : ufixed; N : SIGNED) return ufixed;
+ function scalb (y : sfixed; N : integer) return sfixed;
+ function scalb (y : sfixed; N : SIGNED) return sfixed;
+
+ function Is_Negative (arg : sfixed) return BOOLEAN;
+ --===========================================================================
+ -- Comparison Operators
+ --===========================================================================
+ function ">" (l, r : ufixed) return BOOLEAN;
+ function ">" (l, r : sfixed) return BOOLEAN;
+ function "<" (l, r : ufixed) return BOOLEAN;
+ function "<" (l, r : sfixed) return BOOLEAN;
+ function "<=" (l, r : ufixed) return BOOLEAN;
+ function "<=" (l, r : sfixed) return BOOLEAN;
+ function ">=" (l, r : ufixed) return BOOLEAN;
+ function ">=" (l, r : sfixed) return BOOLEAN;
+ function "=" (l, r : ufixed) return BOOLEAN;
+ function "=" (l, r : sfixed) return BOOLEAN;
+ function "/=" (l, r : ufixed) return BOOLEAN;
+ function "/=" (l, r : sfixed) return BOOLEAN;
+ --%%% Uncomment the following (new syntax)
+-- function "?=" (L, R : ufixed) return BOOLEAN;
+-- function "?=" (L, R : sfixed) return BOOLEAN;
+-- --%%% remove the following (old syntax)
+ function \?=\ (L, R : ufixed) return STD_ULOGIC;
+ function \?=\ (L, R : sfixed) return STD_ULOGIC;
+ -- These need to be overloaded for sfixed and ufixed
+ function \?/=\ (L, R : ufixed) return STD_ULOGIC;
+ function \?>\ (L, R : ufixed) return STD_ULOGIC;
+ function \?>=\ (L, R : ufixed) return STD_ULOGIC;
+ function \?<\ (L, R : ufixed) return STD_ULOGIC;
+ function \?<=\ (L, R : ufixed) return STD_ULOGIC;
+ function \?/=\ (L, R : sfixed) return STD_ULOGIC;
+ function \?>\ (L, R : sfixed) return STD_ULOGIC;
+ function \?>=\ (L, R : sfixed) return STD_ULOGIC;
+ function \?<\ (L, R : sfixed) return STD_ULOGIC;
+ function \?<=\ (L, R : sfixed) return STD_ULOGIC;
+ -- %%% Replace with the following (new syntax)
+-- function "?=" (L, R : ufixed) return STD_ULOGIC;
+-- function "?/=" (L, R : ufixed) return STD_ULOGIC;
+-- function "?>" (L, R : ufixed) return STD_ULOGIC;
+-- function "?>=" (L, R : ufixed) return STD_ULOGIC;
+-- function "?<" (L, R : ufixed) return STD_ULOGIC;
+-- function "?<=" (L, R : ufixed) return STD_ULOGIC;
+-- function "?=" (L, R : sfixed) return STD_ULOGIC;
+-- function "?/=" (L, R : sfixed) return STD_ULOGIC;
+-- function "?>" (L, R : sfixed) return STD_ULOGIC;
+-- function "?>=" (L, R : sfixed) return STD_ULOGIC;
+-- function "?<" (L, R : sfixed) return STD_ULOGIC;
+-- function "?<=" (L, R : sfixed) return STD_ULOGIC;
+
+ function std_match (L, R : ufixed) return BOOLEAN;
+ function std_match (L, R : sfixed) return BOOLEAN;
+
+ -- Overloads the default "maximum" and "minimum" function
+ function maximum (l, r : ufixed) return ufixed;
+ function minimum (l, r : ufixed) return ufixed;
+ function maximum (l, r : sfixed) return sfixed;
+ function minimum (l, r : sfixed) return sfixed;
+
+ ----------------------------------------------------------------------------
+ -- In these compare functions a natural is converted into a
+ -- fixed point number of the bounds "max(l'high,0) downto 0"
+ ----------------------------------------------------------------------------
+ function "=" (l : ufixed; r : NATURAL) return BOOLEAN;
+ function "/=" (l : ufixed; r : NATURAL) return BOOLEAN;
+ function ">=" (l : ufixed; r : NATURAL) return BOOLEAN;
+ function "<=" (l : ufixed; r : NATURAL) return BOOLEAN;
+ function ">" (l : ufixed; r : NATURAL) return BOOLEAN;
+ function "<" (l : ufixed; r : NATURAL) return BOOLEAN;
+
+ function "=" (l : NATURAL; r : ufixed) return BOOLEAN;
+ function "/=" (l : NATURAL; r : ufixed) return BOOLEAN;
+ function ">=" (l : NATURAL; r : ufixed) return BOOLEAN;
+ function "<=" (l : NATURAL; r : ufixed) return BOOLEAN;
+ function ">" (l : NATURAL; r : ufixed) return BOOLEAN;
+ function "<" (l : NATURAL; r : ufixed) return BOOLEAN;
+
+ ----------------------------------------------------------------------------
+ -- In these compare functions a real is converted into a
+ -- fixed point number of the bounds "l'high+1 downto l'low"
+ ----------------------------------------------------------------------------
+ function "=" (l : ufixed; r : REAL) return BOOLEAN;
+ function "/=" (l : ufixed; r : REAL) return BOOLEAN;
+ function ">=" (l : ufixed; r : REAL) return BOOLEAN;
+ function "<=" (l : ufixed; r : REAL) return BOOLEAN;
+ function ">" (l : ufixed; r : REAL) return BOOLEAN;
+ function "<" (l : ufixed; r : REAL) return BOOLEAN;
+
+ function "=" (l : REAL; r : ufixed) return BOOLEAN;
+ function "/=" (l : REAL; r : ufixed) return BOOLEAN;
+ function ">=" (l : REAL; r : ufixed) return BOOLEAN;
+ function "<=" (l : REAL; r : ufixed) return BOOLEAN;
+ function ">" (l : REAL; r : ufixed) return BOOLEAN;
+ function "<" (l : REAL; r : ufixed) return BOOLEAN;
+
+ ----------------------------------------------------------------------------
+ -- In these compare functions an integer is converted into a
+ -- fixed point number of the bounds "max(l'high,1) downto 0"
+ ----------------------------------------------------------------------------
+ function "=" (l : sfixed; r : INTEGER) return BOOLEAN;
+ function "/=" (l : sfixed; r : INTEGER) return BOOLEAN;
+ function ">=" (l : sfixed; r : INTEGER) return BOOLEAN;
+ function "<=" (l : sfixed; r : INTEGER) return BOOLEAN;
+ function ">" (l : sfixed; r : INTEGER) return BOOLEAN;
+ function "<" (l : sfixed; r : INTEGER) return BOOLEAN;
+
+ function "=" (l : INTEGER; r : sfixed) return BOOLEAN;
+ function "/=" (l : INTEGER; r : sfixed) return BOOLEAN;
+ function ">=" (l : INTEGER; r : sfixed) return BOOLEAN;
+ function "<=" (l : INTEGER; r : sfixed) return BOOLEAN;
+ function ">" (l : INTEGER; r : sfixed) return BOOLEAN;
+ function "<" (l : INTEGER; r : sfixed) return BOOLEAN;
+
+ ----------------------------------------------------------------------------
+ -- In these compare functions a real is converted into a
+ -- fixed point number of the bounds "l'high+1 downto l'low"
+ ----------------------------------------------------------------------------
+ function "=" (l : sfixed; r : REAL) return BOOLEAN;
+ function "/=" (l : sfixed; r : REAL) return BOOLEAN;
+ function ">=" (l : sfixed; r : REAL) return BOOLEAN;
+ function "<=" (l : sfixed; r : REAL) return BOOLEAN;
+ function ">" (l : sfixed; r : REAL) return BOOLEAN;
+ function "<" (l : sfixed; r : REAL) return BOOLEAN;
+
+ function "=" (l : REAL; r : sfixed) return BOOLEAN;
+ function "/=" (l : REAL; r : sfixed) return BOOLEAN;
+ function ">=" (l : REAL; r : sfixed) return BOOLEAN;
+ function "<=" (l : REAL; r : sfixed) return BOOLEAN;
+ function ">" (l : REAL; r : sfixed) return BOOLEAN;
+ function "<" (l : REAL; r : sfixed) return BOOLEAN;
+
+ --===========================================================================
+ -- Shift and Rotate Functions.
+ -- Note that sra and sla are not the same as the BIT_VECTOR version
+ --===========================================================================
+ function "sll" (ARG : ufixed; COUNT : INTEGER) return ufixed;
+ function "srl" (ARG : ufixed; COUNT : INTEGER) return ufixed;
+ function "rol" (ARG : ufixed; COUNT : INTEGER) return ufixed;
+ function "ror" (ARG : ufixed; COUNT : INTEGER) return ufixed;
+ function "sla" (ARG : ufixed; COUNT : INTEGER) return ufixed;
+ function "sra" (ARG : ufixed; COUNT : INTEGER) return ufixed;
+ function "sll" (ARG : sfixed; COUNT : INTEGER) return sfixed;
+ function "srl" (ARG : sfixed; COUNT : INTEGER) return sfixed;
+ function "rol" (ARG : sfixed; COUNT : INTEGER) return sfixed;
+ function "ror" (ARG : sfixed; COUNT : INTEGER) return sfixed;
+ function "sla" (ARG : sfixed; COUNT : INTEGER) return sfixed;
+ function "sra" (ARG : sfixed; COUNT : INTEGER) return sfixed;
+ function SHIFT_LEFT (ARG : ufixed; COUNT : NATURAL) return ufixed;
+ function SHIFT_RIGHT (ARG : ufixed; COUNT : NATURAL) return ufixed;
+ function SHIFT_LEFT (ARG : sfixed; COUNT : NATURAL) return sfixed;
+ function SHIFT_RIGHT (ARG : sfixed; COUNT : NATURAL) return sfixed;
+
+ ----------------------------------------------------------------------------
+ -- logical functions
+ ----------------------------------------------------------------------------
+ function "not" (L : ufixed) return ufixed;
+ function "and" (L, R : ufixed) return ufixed;
+ function "or" (L, R : ufixed) return ufixed;
+ function "nand" (L, R : ufixed) return ufixed;
+ function "nor" (L, R : ufixed) return ufixed;
+ function "xor" (L, R : ufixed) return ufixed;
+ function "xnor" (L, R : ufixed) return ufixed;
+ function "not" (L : sfixed) return sfixed;
+ function "and" (L, R : sfixed) return sfixed;
+ function "or" (L, R : sfixed) return sfixed;
+ function "nand" (L, R : sfixed) return sfixed;
+ function "nor" (L, R : sfixed) return sfixed;
+ function "xor" (L, R : sfixed) return sfixed;
+ function "xnor" (L, R : sfixed) return sfixed;
+
+ -- Vector and std_ulogic functions, same as functions in numeric_std
+ function "and" (L : STD_ULOGIC; R : ufixed) return ufixed;
+ function "and" (L : ufixed; R : STD_ULOGIC) return ufixed;
+ function "or" (L : STD_ULOGIC; R : ufixed) return ufixed;
+ function "or" (L : ufixed; R : STD_ULOGIC) return ufixed;
+ function "nand" (L : STD_ULOGIC; R : ufixed) return ufixed;
+ function "nand" (L : ufixed; R : STD_ULOGIC) return ufixed;
+ function "nor" (L : STD_ULOGIC; R : ufixed) return ufixed;
+ function "nor" (L : ufixed; R : STD_ULOGIC) return ufixed;
+ function "xor" (L : STD_ULOGIC; R : ufixed) return ufixed;
+ function "xor" (L : ufixed; R : STD_ULOGIC) return ufixed;
+ function "xnor" (L : STD_ULOGIC; R : ufixed) return ufixed;
+ function "xnor" (L : ufixed; R : STD_ULOGIC) return ufixed;
+ function "and" (L : STD_ULOGIC; R : sfixed) return sfixed;
+ function "and" (L : sfixed; R : STD_ULOGIC) return sfixed;
+ function "or" (L : STD_ULOGIC; R : sfixed) return sfixed;
+ function "or" (L : sfixed; R : STD_ULOGIC) return sfixed;
+ function "nand" (L : STD_ULOGIC; R : sfixed) return sfixed;
+ function "nand" (L : sfixed; R : STD_ULOGIC) return sfixed;
+ function "nor" (L : STD_ULOGIC; R : sfixed) return sfixed;
+ function "nor" (L : sfixed; R : STD_ULOGIC) return sfixed;
+ function "xor" (L : STD_ULOGIC; R : sfixed) return sfixed;
+ function "xor" (L : sfixed; R : STD_ULOGIC) return sfixed;
+ function "xnor" (L : STD_ULOGIC; R : sfixed) return sfixed;
+ function "xnor" (L : sfixed; R : STD_ULOGIC) return sfixed;
+
+ -- Reduction operators, same as numeric_std functions
+ -- %%% remove 12 functions (old syntax)
+ function and_reduce(arg : ufixed) return STD_ULOGIC;
+ function nand_reduce(arg : ufixed) return STD_ULOGIC;
+ function or_reduce(arg : ufixed) return STD_ULOGIC;
+ function nor_reduce(arg : ufixed) return STD_ULOGIC;
+ function xor_reduce(arg : ufixed) return STD_ULOGIC;
+ function xnor_reduce(arg : ufixed) return STD_ULOGIC;
+ function and_reduce(arg : sfixed) return STD_ULOGIC;
+ function nand_reduce(arg : sfixed) return STD_ULOGIC;
+ function or_reduce(arg : sfixed) return STD_ULOGIC;
+ function nor_reduce(arg : sfixed) return STD_ULOGIC;
+ function xor_reduce(arg : sfixed) return STD_ULOGIC;
+ function xnor_reduce(arg : sfixed) return STD_ULOGIC;
+ -- %%% Uncomment the following 12 functions (new syntax)
+ -- function "and" ( arg : ufixed ) RETURN std_ulogic;
+ -- function "nand" ( arg : ufixed ) RETURN std_ulogic;
+ -- function "or" ( arg : ufixed ) RETURN std_ulogic;
+ -- function "nor" ( arg : ufixed ) RETURN std_ulogic;
+ -- function "xor" ( arg : ufixed ) RETURN std_ulogic;
+ -- function "xnor" ( arg : ufixed ) RETURN std_ulogic;
+ -- function "and" ( arg : sfixed ) RETURN std_ulogic;
+ -- function "nand" ( arg : sfixed ) RETURN std_ulogic;
+ -- function "or" ( arg : sfixed ) RETURN std_ulogic;
+ -- function "nor" ( arg : sfixed ) RETURN std_ulogic;
+ -- function "xor" ( arg : sfixed ) RETURN std_ulogic;
+ -- function "xnor" ( arg : sfixed ) RETURN std_ulogic;
+
+ -- returns arg'low-1 if not found
+ function find_msb (arg : ufixed; y : STD_ULOGIC) return INTEGER;
+ function find_msb (arg : sfixed; y : STD_ULOGIC) return INTEGER;
+
+ -- returns arg'high+1 if not found
+ function find_lsb (arg : ufixed; y : STD_ULOGIC) return INTEGER;
+ function find_lsb (arg : sfixed; y : STD_ULOGIC) return INTEGER;
+
+ --===========================================================================
+ -- RESIZE Functions
+ --===========================================================================
+ -- resizes the number (larger or smaller)
+ -- The returned result will be ufixed (left_index downto right_index)
+ -- If "round_style" is true, then the result will be rounded. If the MSB
+ -- of the remainder is a "1" AND the LSB of the unround result is a '1' or
+ -- the lower bits of the remainder include a '1' then the result will be
+ -- increased by the smallest representable number for that type.
+ -- The default is "true" for round_style.
+ -- "overflow_style" can be "true" (saturate mode) or "false" (wrap mode).
+ -- In saturate mode, if the number overflows then the largest possible
+ -- representable number is returned. If wrap mode, then the upper bits
+ -- of the number are truncated.
+ function resize (
+ arg : ufixed; -- input
+ constant left_index : INTEGER; -- integer portion
+ constant right_index : INTEGER; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- overflow
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding
+ return ufixed;
+
+ -- "size_res" functions create the size of the output from the length
+ -- of the "size_res" input. The actual value of "size_res" is not used.
+ function resize (
+ arg : ufixed; -- input
+ size_res : ufixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- overflow
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding
+ return ufixed;
+
+ -- Note that in "wrap" mode the sign bit is not replicated. Thus the
+ -- resize of a negative number can have a positive result in wrap mode.
+ function resize (
+ arg : sfixed; -- input
+ constant left_index : INTEGER; -- integer portion
+ constant right_index : INTEGER; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return sfixed;
+
+ function resize (
+ arg : sfixed; -- input
+ size_res : sfixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return sfixed;
+
+ --===========================================================================
+ -- Conversion Functions
+ --===========================================================================
+ -- integer (natural) to unsigned fixed point.
+ -- arguments are the upper and lower bounds of the number, thus
+ -- ufixed (7 downto -3) <= to_ufixed (int, 7, -3);
+ function to_ufixed (
+ arg : NATURAL; -- integer
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER := 0; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding
+ return ufixed;
+
+ function to_ufixed (
+ arg : NATURAL; -- integer
+ size_res : ufixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding
+ return ufixed;
+
+ -- real to unsigned fixed point
+ function to_ufixed (
+ arg : REAL; -- real
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style; -- rounding by default
+ constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
+ return ufixed;
+
+ function to_ufixed (
+ arg : REAL; -- real
+ size_res : ufixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style; -- rounding by default
+ constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
+ return ufixed;
+
+ -- unsigned to unsigned fixed point
+ function to_ufixed (
+ arg : UNSIGNED; -- unsigned
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER := 0; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return ufixed;
+
+ function to_ufixed (
+ arg : UNSIGNED; -- unsigned
+ size_res : ufixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return ufixed;
+
+ -- Performs a casting. ufixed (arg'range) is returned
+ function to_ufixed (
+ arg : UNSIGNED) -- unsigned
+ return ufixed;
+
+ -- unsigned fixed point to unsigned
+ function to_unsigned (
+ arg : ufixed; -- fixed point input
+ constant size : NATURAL; -- length of output
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return UNSIGNED;
+
+ -- unsigned fixed point to unsigned
+ function to_unsigned (
+ arg : ufixed; -- fixed point input
+ size_res : UNSIGNED; -- used for length of output
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return UNSIGNED;
+
+ -- unsigned fixed point to real
+ function to_real (
+ arg : ufixed) -- fixed point input
+ return REAL;
+
+ -- unsigned fixed point to integer
+ function to_integer (
+ arg : ufixed; -- fixed point input
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return NATURAL;
+
+ -- Integer to sfixed
+ function to_sfixed (
+ arg : INTEGER; -- integer
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER := 0; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return sfixed;
+
+ function to_sfixed (
+ arg : INTEGER; -- integer
+ size_res : sfixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return sfixed;
+
+ -- Real to sfixed
+ function to_sfixed (
+ arg : REAL; -- real
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style; -- rounding by default
+ constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
+ return sfixed;
+
+ function to_sfixed (
+ arg : REAL; -- real
+ size_res : sfixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style; -- rounding by default
+ constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
+ return sfixed;
+
+ -- signed to sfixed
+ function to_sfixed (
+ arg : SIGNED; -- signed
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER := 0; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return sfixed;
+
+ function to_sfixed (
+ arg : SIGNED; -- signed
+ size_res : sfixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return sfixed;
+
+ -- signed to sfixed (output assumed to be size of signed input)
+ function to_sfixed (
+ arg : SIGNED) -- signed
+ return sfixed;
+
+ -- unsigned fixed point to signed fixed point (adds a "0" sign bit)
+ function add_sign (
+ arg : ufixed) -- unsigned fixed point
+ return sfixed;
+
+ -- signed fixed point to signed
+ function to_signed (
+ arg : sfixed; -- fixed point input
+ constant size : NATURAL; -- length of output
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return SIGNED;
+
+ -- signed fixed point to signed
+ function to_signed (
+ arg : sfixed; -- fixed point input
+ size_res : SIGNED; -- used for length of output
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return SIGNED;
+
+ -- signed fixed point to real
+ function to_real (
+ arg : sfixed) -- fixed point input
+ return REAL;
+
+ -- signed fixed point to integer
+ function to_integer (
+ arg : sfixed; -- fixed point input
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return INTEGER;
+
+ -- Because of the farily complicated sizing rules in the fixed point
+ -- packages these functions are provided to compute the result ranges
+ -- Example:
+ -- signal uf1 : ufixed (3 downto -3);
+ -- signal uf2 : ufixed (4 downto -2);
+ -- signal uf1multuf2 : ufixed (ufixed_high (3, -3, '*', 4, -2) downto
+ -- ufixed_low (3, -3, '*', 4, -2));
+ -- uf1multuf2 <= uf1 * uf2;
+ -- Valid characters: '+', '-', '*', '/', 'r' or 'R' (rem), 'm' or 'M' (mod)
+ function ufixed_high (left_index, right_index : INTEGER;
+ operation : CHARACTER := 'X';
+ left_index2, right_index2 : INTEGER := 0)
+ return INTEGER;
+ function ufixed_low (left_index, right_index : INTEGER;
+ operation : CHARACTER := 'X';
+ left_index2, right_index2 : INTEGER := 0)
+ return INTEGER;
+ function sfixed_high (left_index, right_index : INTEGER;
+ operation : CHARACTER := 'X';
+ left_index2, right_index2 : INTEGER := 0)
+ return INTEGER;
+ function sfixed_low (left_index, right_index : INTEGER;
+ operation : CHARACTER := 'X';
+ left_index2, right_index2 : INTEGER := 0)
+ return INTEGER;
+ -- Same as above, but using the "size_res" input only for their ranges:
+ -- signal uf1multuf2 : ufixed (ufixed_high (uf1, '*', uf2) downto
+ -- ufixed_low (uf1, '*', uf2));
+ -- uf1multuf2 <= uf1 * uf2;
+ function ufixed_high (size_res : ufixed;
+ operation : CHARACTER := 'X';
+ size_res2 : ufixed)
+ return INTEGER;
+ function ufixed_low (size_res : ufixed;
+ operation : CHARACTER := 'X';
+ size_res2 : ufixed)
+ return INTEGER;
+ function sfixed_high (size_res : sfixed;
+ operation : CHARACTER := 'X';
+ size_res2 : sfixed)
+ return INTEGER;
+ function sfixed_low (size_res : sfixed;
+ operation : CHARACTER := 'X';
+ size_res2 : sfixed)
+ return INTEGER;
+
+ -- purpose: returns a saturated number
+ function saturate (
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed;
+
+ -- purpose: returns a saturated number
+ function saturate (
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed;
+
+ function saturate (
+ size_res : ufixed) -- only the size of this is used
+ return ufixed;
+
+ function saturate (
+ size_res : sfixed) -- only the size of this is used
+ return sfixed;
+
+ --===========================================================================
+ -- Translation Functions
+ --===========================================================================
+ -- Maps meta-logical values
+ function to_01 (
+ s : ufixed; -- fixed point input
+ constant XMAP : STD_LOGIC := '0') -- Map x to
+ return ufixed;
+
+ -- maps meta-logical values
+ function to_01 (
+ s : sfixed; -- fixed point input
+ constant XMAP : STD_LOGIC := '0') -- Map x to
+ return sfixed;
+
+ function Is_X (arg : ufixed) return BOOLEAN;
+ function Is_X (arg : sfixed) return BOOLEAN;
+ function to_X01 (arg : ufixed) return ufixed;
+ function to_X01 (arg : sfixed) return sfixed;
+ function to_X01Z (arg : ufixed) return ufixed;
+ function to_X01Z (arg : sfixed) return sfixed;
+ function to_UX01 (arg : ufixed) return ufixed;
+ function to_UX01 (arg : sfixed) return sfixed;
+
+ -- straight vector conversion routines, needed for synthesis.
+ -- These functions are here so that a std_logic_vector can be
+ -- converted to and from sfixed and ufixed. Note that you can
+ -- not cast these vectors because of their negative index.
+ function to_slv (
+ arg : ufixed) -- fp vector
+ return STD_LOGIC_VECTOR;
+-- alias to_StdLogicVector is to_slv [ufixed return STD_LOGIC_VECTOR];
+-- alias to_Std_Logic_Vector is to_slv [ufixed return STD_LOGIC_VECTOR];
+
+ function to_slv (
+ arg : sfixed) -- fp vector
+ return STD_LOGIC_VECTOR;
+-- alias to_StdLogicVector is to_slv [sfixed return STD_LOGIC_VECTOR];
+-- alias to_Std_Logic_Vector is to_slv [sfixed return STD_LOGIC_VECTOR];
+
+ function to_sulv (
+ arg : ufixed) -- fp vector
+ return STD_ULOGIC_VECTOR;
+-- alias to_StdULogicVector is to_sulv [ufixed return STD_ULOGIC_VECTOR];
+-- alias to_Std_ULogic_Vector is to_sulv [ufixed return STD_ULOGIC_VECTOR];
+
+ function to_sulv (
+ arg : sfixed) -- fp vector
+ return STD_ULOGIC_VECTOR;
+-- alias to_StdULogicVector is to_sulv [sfixed return STD_ULOGIC_VECTOR];
+-- alias to_Std_ULogic_Vector is to_sulv [sfixed return STD_ULOGIC_VECTOR];
+
+ function to_ufixed (
+ arg : STD_LOGIC_VECTOR; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed;
+
+ function to_ufixed (
+ arg : STD_LOGIC_VECTOR; -- shifted vector
+ size_res : ufixed) -- for size only
+ return ufixed;
+
+ function to_sfixed (
+ arg : STD_LOGIC_VECTOR; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed;
+
+ function to_sfixed (
+ arg : STD_LOGIC_VECTOR; -- shifted vector
+ size_res : sfixed) -- for size only
+ return sfixed;
+
+ function to_ufixed (
+ arg : STD_ULOGIC_VECTOR; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed;
+
+ function to_ufixed (
+ arg : STD_ULOGIC_VECTOR; -- shifted vector
+ size_res : ufixed) -- for size only
+ return ufixed;
+
+ function to_sfixed (
+ arg : STD_ULOGIC_VECTOR; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed;
+
+ function to_sfixed (
+ arg : STD_ULOGIC_VECTOR; -- shifted vector
+ size_res : sfixed) -- for size only
+ return sfixed;
+
+ -- As a concession to those who use a graphical DSP environment,
+ -- these functions take parameters in those tools format and create
+ -- fixed point numbers. These functions are designed to convert from
+ -- a std_logic_vector to the VHDL fixed point format using the conventions
+ -- of these packages. In a pure VHDL environment you should use the
+ -- "to_ufixed" and "to_sfixed" routines.
+ -- Unsigned fixed point
+ function to_UFix (
+ arg : STD_LOGIC_VECTOR;
+ width : NATURAL; -- width of vector
+ fraction : NATURAL) -- width of fraction
+ return ufixed;
+ -- signed fixed point
+ function to_SFix (
+ arg : STD_LOGIC_VECTOR;
+ width : NATURAL; -- width of vector
+ fraction : NATURAL) -- width of fraction
+ return sfixed;
+ -- finding the bounds of a number. These functions can be used like this:
+ -- signal xxx : ufixed (7 downto -3);
+ -- -- Which is the same as "ufixed (UFix_high (11,3) downto UFix_low(11,3))"
+ -- signal yyy : ufixed (UFix_high (11, 3, "+", 11, 3)
+ -- downto UFix_low(11, 3, "+", 11, 3));
+ -- Where "11" is the width of xxx (xxx'length),
+ -- and 3 is the lower bound (abs (xxx'low))
+ -- In a pure VHDL environment use "ufixed_high" and "ufixed_low"
+ function UFix_high (width, fraction : NATURAL;
+ operation : CHARACTER := 'X';
+ width2, fraction2 : NATURAL := 0)
+ return INTEGER;
+ function UFix_low (width, fraction : NATURAL;
+ operation : CHARACTER := 'X';
+ width2, fraction2 : NATURAL := 0)
+ return INTEGER;
+ -- Same as above but for signed fixed point. Note that the width
+ -- of a signed fixed point number ignores the sign bit, thus
+ -- width = sxxx'length-1
+ function SFix_high (width, fraction : NATURAL;
+ operation : CHARACTER := 'X';
+ width2, fraction2 : NATURAL := 0)
+ return INTEGER;
+ function SFix_low (width, fraction : NATURAL;
+ operation : CHARACTER := 'X';
+ width2, fraction2 : NATURAL := 0)
+ return INTEGER;
+ --===========================================================================
+ -- string and textio Functions
+ --===========================================================================
+-- rtl_synthesis off
+-- synthesis translate_off
+ -- purpose: writes fixed point into a line
+ procedure WRITE (
+ L : inout LINE; -- input line
+ VALUE : in ufixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0);
+
+ -- purpose: writes fixed point into a line
+ procedure WRITE (
+ L : inout LINE; -- input line
+ VALUE : in sfixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0);
+
+ procedure READ(L : inout LINE;
+ VALUE : out ufixed);
+
+ procedure READ(L : inout LINE;
+ VALUE : out ufixed;
+ GOOD : out BOOLEAN);
+
+ procedure READ(L : inout LINE;
+ VALUE : out sfixed);
+
+ procedure READ(L : inout LINE;
+ VALUE : out sfixed;
+ GOOD : out BOOLEAN);
+
+ alias bwrite is WRITE [LINE, ufixed, SIDE, width];
+ alias bwrite is WRITE [LINE, sfixed, SIDE, width];
+ alias bread is READ [LINE, ufixed];
+ alias bread is READ [LINE, ufixed, BOOLEAN];
+ alias bread is READ [LINE, sfixed];
+ alias bread is READ [LINE, sfixed, BOOLEAN];
+
+ -- octal read and write
+ procedure OWRITE (
+ L : inout LINE; -- input line
+ VALUE : in ufixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0);
+
+ procedure OWRITE (
+ L : inout LINE; -- input line
+ VALUE : in sfixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0);
+
+ procedure OREAD(L : inout LINE;
+ VALUE : out ufixed);
+
+ procedure OREAD(L : inout LINE;
+ VALUE : out ufixed;
+ GOOD : out BOOLEAN);
+
+ procedure OREAD(L : inout LINE;
+ VALUE : out sfixed);
+
+ procedure OREAD(L : inout LINE;
+ VALUE : out sfixed;
+ GOOD : out BOOLEAN);
+
+ -- hex read and write
+ procedure HWRITE (
+ L : inout LINE; -- input line
+ VALUE : in ufixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0);
+
+ -- purpose: writes fixed point into a line
+ procedure HWRITE (
+ L : inout LINE; -- input line
+ VALUE : in sfixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0);
+
+ procedure HREAD(L : inout LINE;
+ VALUE : out ufixed);
+
+ procedure HREAD(L : inout LINE;
+ VALUE : out ufixed;
+ GOOD : out BOOLEAN);
+
+ procedure HREAD(L : inout LINE;
+ VALUE : out sfixed);
+
+ procedure HREAD(L : inout LINE;
+ VALUE : out sfixed;
+ GOOD : out BOOLEAN);
+
+ -- returns a string, useful for:
+ -- assert (x = y) report "error found " & to_string(x) severity error;
+ function to_string (
+ value : ufixed;
+ justified : SIDE := right;
+ field : WIDTH := 0
+ ) return STRING;
+
+ alias to_bstring is to_string [ufixed, SIDE, width return STRING];
+
+ function to_ostring (
+ value : ufixed;
+ justified : SIDE := right;
+ field : WIDTH := 0
+ ) return STRING;
+
+ function to_hstring (
+ value : ufixed;
+ justified : SIDE := right;
+ field : WIDTH := 0
+ ) return STRING;
+
+ function to_string (
+ value : sfixed;
+ justified : SIDE := right;
+ field : WIDTH := 0
+ ) return STRING;
+
+ alias to_bstring is to_string [sfixed, SIDE, width return STRING];
+
+ function to_ostring (
+ value : sfixed;
+ justified : SIDE := right;
+ field : WIDTH := 0
+ ) return STRING;
+
+ function to_hstring (
+ value : sfixed;
+ justified : SIDE := right;
+ field : WIDTH := 0
+ ) return STRING;
+
+ -- From string functions allow you to convert a string into a fixed
+ -- point number. Example:
+ -- signal uf1 : ufixed (3 downto -3);
+ -- uf1 <= from_string ("0110.100", uf1'high, uf1'low); -- 6.5
+ -- The "." is optional in this syntax, however it exist and is
+ -- in the wrong location an error is produced. Overflow will
+ -- result in saturation.
+ function from_string (
+ bstring : STRING; -- binary string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed;
+ alias from_bstring is from_string [STRING, INTEGER, INTEGER return ufixed];
+
+ -- Octal and hex conversions work as follows:
+ -- uf1 <= from_hstring ("6.8", 3, -3); -- 6.5 (bottom zeros dropped)
+ -- uf1 <= from_ostring ("06.4", 3, -3); -- 6.5 (top zeros dropped)
+ function from_ostring (
+ ostring : STRING; -- Octal string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed;
+
+ function from_hstring (
+ hstring : STRING; -- hex string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed;
+
+ function from_string (
+ bstring : STRING; -- binary string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed;
+ alias from_bstring is from_string [STRING, INTEGER, INTEGER return sfixed];
+
+ function from_ostring (
+ ostring : STRING; -- Octal string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed;
+
+ function from_hstring (
+ hstring : STRING; -- hex string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed;
+
+ -- Same as above, "size_res" is used for it's range only.
+ function from_string (
+ bstring : STRING; -- binary string
+ size_res : ufixed)
+ return ufixed;
+ alias from_bstring is from_string [STRING, ufixed return ufixed];
+
+ function from_ostring (
+ ostring : STRING; -- Octal string
+ size_res : ufixed)
+ return ufixed;
+
+ function from_hstring (
+ hstring : STRING; -- hex string
+ size_res : ufixed)
+ return ufixed;
+
+ function from_string (
+ bstring : STRING; -- binary string
+ size_res : sfixed)
+ return sfixed;
+ alias from_bstring is from_string [STRING, sfixed return sfixed];
+
+ function from_ostring (
+ ostring : STRING; -- Octal string
+ size_res : sfixed)
+ return sfixed;
+
+ function from_hstring (
+ hstring : STRING; -- hex string
+ size_res : sfixed)
+ return sfixed;
+
+ -- Direct converstion functions. Example:
+ -- signal uf1 : ufixed (3 downto -3);
+ -- uf1 <= from_string ("0110.100"); -- 6.5
+ -- In this case the "." is not optional, and the size of
+ -- the output must match exactly.
+ function from_string (
+ bstring : STRING) -- binary string
+ return ufixed;
+ alias from_bstring is from_string [STRING return ufixed];
+
+ -- Direct octal and hex converstion functions. In this case
+ -- the string lengths must match. Example:
+ -- signal sf1 := sfixed (5 downto -3);
+ -- sf1 <= from_ostring ("71.4") -- -6.5
+ function from_ostring (
+ ostring : STRING) -- Octal string
+ return ufixed;
+
+ function from_hstring (
+ hstring : STRING) -- hex string
+ return ufixed;
+
+ function from_string (
+ bstring : STRING) -- binary string
+ return sfixed;
+ alias from_bstring is from_string [STRING return sfixed];
+
+ function from_ostring (
+ ostring : STRING) -- Octal string
+ return sfixed;
+
+ function from_hstring (
+ hstring : STRING) -- hex string
+ return sfixed;
+
+-- synthesis translate_on
+-- rtl_synthesis on
+ -- This type is here for the floating point package.
+ type round_type is (round_nearest, -- Default, nearest LSB '0'
+ round_inf, -- Round to positive
+ round_neginf, -- Round to negate
+ round_zero); -- Round towards zero
+ -- These are the same as the C FE_TONEAREST, FE_UPWARD, FE_DOWNWARD,
+ -- and FE_TOWARDZERO floating point rounding macros.
+ function to_StdLogicVector (
+ arg : ufixed) -- fp vector
+ return STD_LOGIC_VECTOR;
+ function to_Std_Logic_Vector (
+ arg : ufixed) -- fp vector
+ return STD_LOGIC_VECTOR;
+ function to_StdLogicVector (
+ arg : sfixed) -- fp vector
+ return STD_LOGIC_VECTOR;
+ function to_Std_Logic_Vector (
+ arg : sfixed) -- fp vector
+ return STD_LOGIC_VECTOR;
+end package fixed_pkg;
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+use ieee.math_real.all;
+use std.textio.all;
+use ieee.std_logic_textio.all; -- %%% for testing only
+package body fixed_pkg is
+ -- Author David Bishop (dbishop@vhdl.org)
+ -- Other contributers: Jim Lewis, Yannick Grugni, Ryan W. Hilton
+ -- null array constants
+ constant NAUF : ufixed (0 downto 1) := (others => '0');
+ constant NASF : sfixed (0 downto 1) := (others => '0');
+ constant NSLV : STD_LOGIC_VECTOR (0 downto 1) := (others => '0');
+
+ -- This differed constant will tell you if the package body is synthesizable
+ -- or implemented as real numbers, set to "true" if synthesizable.
+-- constant fixedsynth_or_real : BOOLEAN := true;
+
+ --%%% Can be removed in vhdl-200x, will be implicit.
+ -- purpose: To find the largest of 2 numbers
+ function maximum (l, r : INTEGER)
+ return INTEGER is
+ begin -- function maximum
+ if L > R then return L;
+ else return R;
+ end if;
+ end function maximum;
+
+ function minimum (l, r : INTEGER)
+ return INTEGER is
+ begin -- function minimum
+ if L > R then return R;
+ else return L;
+ end if;
+ end function minimum;
+
+ -- %%% Remove the following function (duplicates of new numeric_std)
+ function "sra" (arg : SIGNED; count : INTEGER)
+ return SIGNED is
+ begin
+ if (COUNT >= 0) then
+ return SHIFT_RIGHT(arg, count);
+ else
+ return SHIFT_LEFT(arg, -count);
+ end if;
+ end function "sra";
+
+ -- %%% Replace or_reducex with "or", and_reducex with "and", and
+ -- %%% xor_reducex with "xor", then remove the following 3 functions
+ -- purpose: OR all of the bits in a vector together
+ -- This is a copy of the proposed "or_reduce" from 1076.3
+ function or_reducex (arg : STD_LOGIC_VECTOR)
+ return STD_LOGIC is
+ variable Upper, Lower : STD_LOGIC;
+ variable Half : INTEGER;
+ variable BUS_int : STD_LOGIC_VECTOR (arg'length - 1 downto 0);
+ variable Result : STD_LOGIC;
+ begin
+ if (arg'length < 1) then -- In the case of a NULL range
+ Result := '0';
+ else
+ BUS_int := to_ux01 (arg);
+ if (BUS_int'length = 1) then
+ Result := BUS_int (BUS_int'left);
+ elsif (BUS_int'length = 2) then
+ Result := BUS_int (BUS_int'right) or BUS_int (BUS_int'left);
+ else
+ Half := (BUS_int'length + 1) / 2 + BUS_int'right;
+ Upper := or_reducex (BUS_int (BUS_int'left downto Half));
+ Lower := or_reducex (BUS_int (Half - 1 downto BUS_int'right));
+ Result := Upper or Lower;
+ end if;
+ end if;
+ return Result;
+ end function or_reducex;
+
+ -- purpose: AND all of the bits in a vector together
+ -- This is a copy of the proposed "and_reduce" from 1076.3
+ function and_reducex (arg : STD_LOGIC_VECTOR)
+ return STD_LOGIC is
+ variable Upper, Lower : STD_LOGIC;
+ variable Half : INTEGER;
+ variable BUS_int : STD_LOGIC_VECTOR (arg'length - 1 downto 0);
+ variable Result : STD_LOGIC;
+ begin
+ if (arg'length < 1) then -- In the case of a NULL range
+ Result := '1';
+ else
+ BUS_int := to_ux01 (arg);
+ if (BUS_int'length = 1) then
+ Result := BUS_int (BUS_int'left);
+ elsif (BUS_int'length = 2) then
+ Result := BUS_int (BUS_int'right) and BUS_int (BUS_int'left);
+ else
+ Half := (BUS_int'length + 1) / 2 + BUS_int'right;
+ Upper := and_reducex (BUS_int (BUS_int'left downto Half));
+ Lower := and_reducex (BUS_int (Half - 1 downto BUS_int'right));
+ Result := Upper and Lower;
+ end if;
+ end if;
+ return Result;
+ end function and_reducex;
+
+ function xor_reducex (arg : STD_LOGIC_VECTOR) return STD_ULOGIC is
+ variable Upper, Lower : STD_ULOGIC;
+ variable Half : INTEGER;
+ variable BUS_int : STD_LOGIC_VECTOR (arg'length - 1 downto 0);
+ variable Result : STD_ULOGIC := '0'; -- In the case of a NULL range
+ begin
+ if (arg'length >= 1) then
+ BUS_int := to_ux01 (arg);
+ if (BUS_int'length = 1) then
+ Result := BUS_int (BUS_int'left);
+ elsif (BUS_int'length = 2) then
+ Result := BUS_int(BUS_int'right) xor BUS_int(BUS_int'left);
+ else
+ Half := (BUS_int'length + 1) / 2 + BUS_int'right;
+ Upper := xor_reducex (BUS_int (BUS_int'left downto Half));
+ Lower := xor_reducex (BUS_int (Half - 1 downto BUS_int'right));
+ Result := Upper xor Lower;
+ end if;
+ end if;
+ return Result;
+ end function xor_reducex;
+
+ --%%% remove the following function and table
+ -- Match table, copied form new std_logic_1164
+ type stdlogic_table is array(STD_ULOGIC, STD_ULOGIC) of STD_ULOGIC;
+ constant match_logic_table : stdlogic_table := (
+ -----------------------------------------------------
+ -- U X 0 1 Z W L H - | |
+ -----------------------------------------------------
+ ('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', '1'), -- | U |
+ ('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '1'), -- | X |
+ ('U', 'X', '1', '0', 'X', 'X', '1', '0', '1'), -- | 0 |
+ ('U', 'X', '0', '1', 'X', 'X', '0', '1', '1'), -- | 1 |
+ ('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '1'), -- | Z |
+ ('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '1'), -- | W |
+ ('U', 'X', '1', '0', 'X', 'X', '1', '0', '1'), -- | L |
+ ('U', 'X', '0', '1', 'X', 'X', '0', '1', '1'), -- | H |
+ ('1', '1', '1', '1', '1', '1', '1', '1', '1') -- | - |
+ );
+
+ constant no_match_logic_table : stdlogic_table := (
+ -----------------------------------------------------
+ -- U X 0 1 Z W L H - | |
+ -----------------------------------------------------
+ ('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', '0'), -- | U |
+ ('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '0'), -- | X |
+ ('U', 'X', '0', '1', 'X', 'X', '0', '1', '0'), -- | 0 |
+ ('U', 'X', '1', '0', 'X', 'X', '1', '0', '0'), -- | 1 |
+ ('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '0'), -- | Z |
+ ('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '0'), -- | W |
+ ('U', 'X', '0', '1', 'X', 'X', '0', '1', '0'), -- | L |
+ ('U', 'X', '1', '0', 'X', 'X', '1', '0', '0'), -- | H |
+ ('0', '0', '0', '0', '0', '0', '0', '0', '0') -- | - |
+ );
+
+ -------------------------------------------------------------------
+ -- ?= functions, Similar to "std_match", but returns "std_ulogic".
+ -------------------------------------------------------------------
+ -- %%% FUNCTION "?=" ( l, r : std_ulogic ) RETURN std_ulogic IS
+ function \?=\ (l, r : STD_ULOGIC) return STD_ULOGIC is
+ begin
+ return match_logic_table (l, r);
+ end function \?=\;
+ -- %%% END FUNCTION "?=";
+ -- %%% FUNCTION "?/=" ( l, r : std_ulogic ) RETURN std_ulogic is
+ function \?/=\ (l, r : STD_ULOGIC) return STD_ULOGIC is
+ begin
+ return no_match_logic_table (l, r);
+ end function \?/=\;
+ -- %%% END FUNCTION "?/=";
+ -- %%% end remove
+
+ -- Special version of "minimum" to do some boundary checking without errors
+ function mins (l, r : INTEGER)
+ return INTEGER is
+ begin -- function mins
+ if (L = INTEGER'low or R = INTEGER'low) then
+ return 0; -- error condition
+ end if;
+ return minimum (L, R);
+ end function mins;
+
+ -- Special version of "minimum" to do some boundary checking with errors
+ function mine (l, r : INTEGER)
+ return INTEGER is
+ begin -- function mine
+ if (L = INTEGER'low or R = INTEGER'low) then
+ report "FIXED_GENERIC_PKG: Unbounded number passed, was a literal used?"
+ severity error;
+ return 0;
+ end if;
+ return minimum (L, R);
+ end function mine;
+
+ -- The following functions are used only internally. Every function
+ -- calls "cleanvec" either directly or indirectly.
+ -- purpose: Fixes "downto" problem and resolves meta states
+ function cleanvec (
+ arg : sfixed) -- input
+ return sfixed is
+ constant left_index : INTEGER := maximum(arg'left, arg'right);
+ constant right_index : INTEGER := mins(arg'left, arg'right);
+ variable result : sfixed (arg'range);
+ begin -- function cleanvec
+ assert not ((arg'left < arg'right) and (arg'low /= INTEGER'low))
+ report "FIXED_GENERIC_PKG: Vector passed using a ""to"" range, expected is ""downto"""
+ severity error;
+ return arg;
+ end function cleanvec;
+
+ -- purpose: Fixes "downto" problem and resolves meta states
+ function cleanvec (
+ arg : ufixed) -- input
+ return ufixed is
+ constant left_index : INTEGER := maximum(arg'left, arg'right);
+ constant right_index : INTEGER := mins(arg'left, arg'right);
+ variable result : ufixed (arg'range);
+ begin -- function cleanvec
+ assert not ((arg'left < arg'right) and (arg'low /= INTEGER'low))
+ report "FIXED_GENERIC_PKG: Vector passed using a ""to"" range, expected is ""downto"""
+ severity error;
+ return arg;
+ end function cleanvec;
+
+ -- Type cast a "unsigned" into a "ufixed", used internally
+ function to_fixed (
+ arg : UNSIGNED; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed is
+ variable result : ufixed (left_index downto right_index);
+-- variable j : INTEGER := arg'high; -- index for arg
+ begin -- function to_fixed
+ result := ufixed(arg);
+-- floop : for i in result'range loop
+-- result(i) := arg(j); -- res(4) := arg (4 + 3)
+-- j := j - 1;
+-- end loop floop;
+ return result;
+ end function to_fixed;
+
+ -- Type cast a "signed" into an "sfixed", used internally
+ function to_fixed (
+ arg : SIGNED; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed is
+ variable result : sfixed (left_index downto right_index);
+-- variable j : INTEGER := arg'high; -- index for arg
+ begin -- function to_fixed
+ result := sfixed(arg);
+-- floop : for i in result'range loop
+-- result(i) := arg(j); -- res(4) := arg (4 + 3)
+-- j := j - 1;
+-- end loop floop;
+ return result;
+ end function to_fixed;
+
+ -- Type cast a "ufixed" into an "unsigned", used internally
+ function to_uns (
+ arg : ufixed) -- fp vector
+ return UNSIGNED is
+ subtype t is UNSIGNED(arg'high - arg'low downto 0);
+ variable slv : t;
+ begin -- function to_uns
+ slv := t(arg);
+-- floop : for i in slv'range loop
+-- slv(i) := arg(i + arg'low); -- slv(7) := arg (7 - 3)
+-- end loop floop;
+ return UNSIGNED(to_X01(std_logic_vector(slv)));
+ end function to_uns;
+
+ -- Type cast an "sfixed" into a "signed", used internally
+ function to_s (
+ arg : sfixed) -- fp vector
+ return SIGNED is
+ subtype t is SIGNED(arg'high - arg'low downto 0);
+ variable slv : t;
+ begin -- function to_s
+ slv := t(arg);
+-- floop : for i in slv'range loop
+-- slv(i) := arg(i + arg'low); -- slv(7) := arg (7 - 3)
+-- end loop floop;
+ return SIGNED(to_X01(std_logic_vector(slv)));
+ end function to_s;
+
+ -- adds 1 to the LSB of the number
+ procedure round_up (arg : in ufixed;
+ result : out ufixed;
+ overflowx : out BOOLEAN) is
+ variable arguns, resuns : UNSIGNED (arg'high-arg'low+1 downto 0) :=
+ (others => '0');
+ begin -- round_up
+ arguns (arguns'high-1 downto 0) := to_uns (arg);
+ resuns := arguns + 1;
+ result := to_fixed(resuns(arg'high-arg'low
+ downto 0), arg'high, arg'low);
+ overflowx := (resuns(resuns'high) = '1');
+ end procedure round_up;
+
+ -- adds 1 to the LSB of the number
+ procedure round_up (arg : in sfixed;
+ result : out sfixed;
+ overflowx : out BOOLEAN) is
+ variable args, ress : SIGNED (arg'high-arg'low+1 downto 0);
+ begin -- round_up
+ args (args'high-1 downto 0) := to_s (arg);
+ args(args'high) := arg(arg'high); -- sign extend
+ ress := args + 1;
+ result := to_fixed(ress (ress'high-1
+ downto 0), arg'high, arg'low);
+ overflowx := ((arg(arg'high) /= ress(ress'high-1))
+ and (or_reducex (STD_LOGIC_VECTOR(ress)) /= '0'));
+ end procedure round_up;
+
+ -- Rounding - Performs a "round_nearest" (IEEE 754) which rounds up
+ -- when the remainder is > 0.5. If the remainder IS 0.5 then if the
+ -- bottom bit is a "1" it is rounded, otherwise it remains the same.
+ function round_fixed (arg : ufixed;
+ remainder : ufixed;
+ overflow_style : BOOLEAN := fixed_overflow_style)
+ return ufixed is
+ variable rounds : BOOLEAN;
+ variable round_overflow : BOOLEAN;
+ variable result : ufixed (arg'range);
+ begin
+ rounds := false;
+ if (remainder'length > 1) then
+ if (remainder (remainder'high) = '1') then
+ rounds := (arg(arg'low) = '1')
+ or (or_reducex (to_slv(remainder(remainder'high-1 downto
+ remainder'low))) = '1');
+ end if;
+ else
+ rounds := (arg(arg'low) = '1') and (remainder (remainder'high) = '1');
+ end if;
+ if rounds then
+ round_up(arg => arg,
+ result => result,
+ overflowx => round_overflow);
+ else
+ result := arg;
+ end if;
+ if (overflow_style = fixed_saturate) and round_overflow then
+ result := saturate (result'high, result'low);
+ end if;
+ return result;
+ end function round_fixed;
+
+ -- Rounding case statement
+ function round_fixed (arg : sfixed;
+ remainder : sfixed;
+ overflow_style : BOOLEAN := fixed_overflow_style)
+ return sfixed is
+ variable rounds : BOOLEAN;
+ variable round_overflow : BOOLEAN;
+ variable result : sfixed (arg'range);
+ begin
+ rounds := false;
+ if (remainder'length > 1) then
+ if (remainder (remainder'high) = '1') then
+ rounds := (arg(arg'low) = '1')
+ or (or_reducex (to_slv(remainder(remainder'high-1 downto
+ remainder'low))) = '1');
+ end if;
+ else
+ rounds := (arg(arg'low) = '1') and (remainder (remainder'high) = '1');
+ end if;
+ if rounds then
+ round_up(arg => arg,
+ result => result,
+ overflowx => round_overflow);
+ else
+ result := arg;
+ end if;
+ if round_overflow then
+ if (overflow_style = fixed_saturate) then
+ if arg(arg'high) = '0' then
+ result := saturate (result'high, result'low);
+ else
+ result := not saturate (result'high, result'low);
+ end if;
+-- else
+-- result(result'high) := arg(arg'high); -- fix sign bit in wrap
+ end if;
+ end if;
+ return result;
+ end function round_fixed;
+
+-----------------------------------------------------------------------------
+-- Visible functions
+-----------------------------------------------------------------------------
+
+ -- casting functions. These are needed for synthesis where typically
+ -- the only input and output type is a std_logic_vector.
+ function to_slv (
+ arg : ufixed) -- fixed point vector
+ return STD_LOGIC_VECTOR is
+ subtype t is STD_LOGIC_VECTOR (arg'high - arg'low downto 0);
+ variable slv : t;
+ begin
+ if arg'length < 1 then
+ return NSLV;
+ end if;
+ slv := t (arg);
+ return slv;
+ end function to_slv;
+
+ function to_slv (
+ arg : sfixed) -- fixed point vector
+ return STD_LOGIC_VECTOR is
+ subtype t is STD_LOGIC_VECTOR (arg'high - arg'low downto 0);
+ variable slv : t;
+ begin
+ if arg'length < 1 then
+ return NSLV;
+ end if;
+ slv := t (arg);
+ return slv;
+ end function to_slv;
+
+ function to_sulv (
+ arg : ufixed) -- fixed point vector
+ return STD_ULOGIC_VECTOR is
+ begin
+ return to_stdulogicvector (to_slv(arg));
+ end function to_sulv;
+
+ function to_sulv (
+ arg : sfixed) -- fixed point vector
+ return STD_ULOGIC_VECTOR is
+ begin
+ return to_stdulogicvector (to_slv(arg));
+ end function to_sulv;
+
+ function to_ufixed (
+ arg : STD_LOGIC_VECTOR; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed is
+ variable result : ufixed (left_index downto right_index);
+ begin
+ if (arg'length < 1 or right_index > left_index) then
+ return NAUF;
+ end if;
+ if (arg'length /= result'length) then
+ report "FIXED_GENERIC_PKG.TO_UFIXED (STD_LOGIC_VECTOR) "
+ & "Vector lengths do not match. Input length is "
+ & INTEGER'image(arg'length) & " and output will be "
+ & INTEGER'image(result'length) & " wide."
+ severity error;
+ return NAUF;
+ else
+ result := to_fixed (arg => UNSIGNED(arg),
+ left_index => left_index,
+ right_index => right_index);
+ return result;
+ end if;
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : STD_LOGIC_VECTOR; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed is
+ variable result : sfixed (left_index downto right_index);
+ begin
+ if (arg'length < 1 or right_index > left_index) then
+ return NASF;
+ end if;
+ if (arg'length /= result'length) then
+ report "FIXED_GENERIC_PKG.TO_SFIXED (STD_LOGIC_VECTOR) "
+ & "Vector lengths do not match. Input length is "
+ & INTEGER'image(arg'length) & " and output will be "
+ & INTEGER'image(result'length) & " wide."
+ severity error;
+ return NASF;
+ else
+ result := to_fixed (arg => SIGNED(arg),
+ left_index => left_index,
+ right_index => right_index);
+ return result;
+ end if;
+ end function to_sfixed;
+
+ function to_ufixed (
+ arg : STD_ULOGIC_VECTOR; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed is
+ begin
+ return to_ufixed (arg => to_stdlogicvector(arg),
+ left_index => left_index,
+ right_index => right_index);
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : STD_ULOGIC_VECTOR; -- shifted vector
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed is
+ begin
+ return to_sfixed (arg => to_stdlogicvector(arg),
+ left_index => left_index,
+ right_index => right_index);
+ end function to_sfixed;
+
+ -- Two's complement number, Grows the vector by 1 bit.
+ -- because "abs (1000.000) = 01000.000" or abs(-16) = 16.
+ function "abs" (
+ arg : sfixed) -- fixed point input
+ return sfixed is
+ constant left_index : INTEGER := arg'high;
+ constant right_index : INTEGER := mine(arg'low, arg'low);
+ variable ressns : SIGNED (arg'length downto 0);
+ variable result : sfixed (left_index+1 downto right_index);
+ begin
+ if (arg'length < 1 or result'length < 1) then
+ return NASF;
+ end if;
+ ressns (arg'length-1 downto 0) := to_s (cleanvec (arg));
+ ressns (arg'length) := ressns (arg'length-1); -- expand sign bit
+ result := to_fixed (abs(ressns), left_index+1, right_index);
+ return result;
+ end function "abs";
+
+ -- also grows the vector by 1 bit.
+ function "-" (
+ arg : sfixed) -- fixed point input
+ return sfixed is
+ constant left_index : INTEGER := arg'high+1;
+ constant right_index : INTEGER := mine(arg'low, arg'low);
+ variable ressns : SIGNED (arg'length downto 0);
+ variable result : sfixed (left_index downto right_index);
+ begin
+ if (arg'length < 1 or result'length < 1) then
+ return NASF;
+ end if;
+ ressns (arg'length-1 downto 0) := to_s (cleanvec(arg));
+ ressns (arg'length) := ressns (arg'length-1); -- expand sign bit
+ result := to_fixed (-ressns, left_index, right_index);
+ return result;
+ end function "-";
+
+ function "abs" (arg : sfixed) return ufixed is
+ constant left_index : INTEGER := arg'high;
+ constant right_index : INTEGER := mine(arg'low, arg'low);
+ variable xarg : sfixed(left_index+1 downto right_index);
+ variable result : ufixed(left_index downto right_index);
+ begin
+ if arg'length < 1 then
+ return NAUF;
+ end if;
+ xarg := abs(arg);
+ result := ufixed (xarg (left_index downto right_index));
+ return result;
+ end function "abs";
+
+ -- Addition
+ function "+" (
+ l, r : ufixed) -- ufixed(a downto b) + ufixed(c downto d) =
+ return ufixed is -- ufixed(max(a,c)+1 downto min(b,d))
+ constant left_index : INTEGER := maximum(l'high, r'high)+1;
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable result : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (left_index-right_index
+ downto 0);
+ variable result_slv : UNSIGNED (left_index-right_index
+ downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ return NAUF;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ result_slv := lslv + rslv;
+ result := to_fixed(result_slv, left_index, right_index);
+ return result;
+ end function "+";
+
+ function "+" (
+ l, r : sfixed) -- sfixed(a downto b) + sfixed(c downto d) =
+ return sfixed is -- sfixed(max(a,c)+1 downto min(b,d))
+ constant left_index : INTEGER := maximum(l'high, r'high)+1;
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable result : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (left_index-right_index downto 0);
+ variable result_slv : SIGNED (left_index-right_index downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ return NASF;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ result_slv := lslv + rslv;
+ result := to_fixed(result_slv, left_index, right_index);
+ return result;
+ end function "+";
+
+ -- Subtraction
+ function "-" (
+ l, r : ufixed) -- ufixed(a downto b) - ufixed(c downto d) =
+ return ufixed is -- ufixed(max(a,c)+1 downto min(b,d))
+ constant left_index : INTEGER := maximum(l'high, r'high)+1;
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable result : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (left_index-right_index
+ downto 0);
+ variable result_slv : UNSIGNED (left_index-right_index
+ downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ return NAUF;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ result_slv := lslv - rslv;
+ result := to_fixed(result_slv, left_index, right_index);
+ return result;
+ end function "-";
+
+ function "-" (
+ l, r : sfixed) -- sfixed(a downto b) - sfixed(c downto d) =
+ return sfixed is -- sfixed(max(a,c)+1 downto min(b,d))
+ constant left_index : INTEGER := maximum(l'high, r'high)+1;
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable result : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (left_index-right_index downto 0);
+ variable result_slv : SIGNED (left_index-right_index downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ return NASF;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ result_slv := lslv - rslv;
+ result := to_fixed(result_slv, left_index, right_index);
+ return result;
+ end function "-";
+
+ function "*" (
+ l, r : ufixed) -- ufixed(a downto b) * ufixed(c downto d) =
+ return ufixed is -- ufixed(a+c+1 downto b+d)
+ variable lslv : UNSIGNED (l'length-1 downto 0);
+ variable rslv : UNSIGNED (r'length-1 downto 0);
+ variable result_slv : UNSIGNED (r'length+l'length-1 downto 0);
+ variable result : ufixed (l'high + r'high+1 downto
+ mine(l'low, l'low) + mine(r'low, r'low));
+ begin
+ if (l'length < 1 or r'length < 1 or
+ result'length /= result_slv'length) then
+ return NAUF;
+ end if;
+ lslv := to_uns (cleanvec(l));
+ rslv := to_uns (cleanvec(r));
+ result_slv := lslv * rslv;
+ result := to_fixed (result_slv, result'high, result'low);
+ return result;
+ end function "*";
+
+ function "*" (
+ l, r : sfixed) -- sfixed(a downto b) * sfixed(c downto d) =
+ return sfixed is -- sfixed(a+c+1 downto b+d)
+ variable lslv : SIGNED (l'length-1 downto 0);
+ variable rslv : SIGNED (r'length-1 downto 0);
+ variable result_slv : SIGNED (r'length+l'length-1 downto 0);
+ variable result : sfixed (l'high + r'high+1 downto
+ mine(l'low, l'low) + mine(r'low, r'low));
+ begin
+ if (l'length < 1 or r'length < 1 or
+ result'length /= result_slv'length) then
+ return NASF;
+ end if;
+ lslv := to_s (cleanvec(l));
+ rslv := to_s (cleanvec(r));
+ result_slv := lslv * rslv;
+ result := to_fixed (result_slv, result'high, result'low);
+ return result;
+ end function "*";
+
+ function "/" (
+ l, r : ufixed) -- ufixed(a downto b) / ufixed(c downto d) =
+ return ufixed is -- ufixed(a-d downto b-c-1)
+ begin
+ return divide (l, r);
+ end function "/";
+
+ function "/" (
+ l, r : sfixed) -- sfixed(a downto b) / sfixed(c downto d) =
+ return sfixed is -- sfixed(a-d+1 downto b-c)
+ begin
+ return divide (l, r);
+ end function "/";
+
+ -- This version of divide gives the user more control
+ -- ufixed(a downto b) / ufixed(c downto d) = ufixed(a-d downto b-c-1)
+ function divide (
+ l, r : ufixed;
+ constant round_style : BOOLEAN := fixed_round_style;
+ constant guard_bits : NATURAL := fixed_guard_bits)
+ return ufixed is
+ variable result : ufixed (l'high - mine(r'low, r'low)
+ downto mine (l'low, l'low) - r'high -1);
+ variable dresult : ufixed (result'high downto result'low -guard_bits);
+ variable lresize : ufixed (l'high downto l'high - dresult'length+1);
+ variable lslv : UNSIGNED (lresize'length-1 downto 0);
+ variable rslv : UNSIGNED (r'length-1 downto 0);
+ variable result_slv : UNSIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1 or
+ mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
+ return NAUF;
+ end if;
+ lresize := resize (l, lresize'high, lresize'low);
+ lslv := to_uns (cleanvec (lresize));
+ rslv := to_uns (cleanvec (r));
+ if (rslv = 0) then
+ report "FIXED_GENERIC_PKG.DIVIDE uFixed point Division by zero" severity error;
+ result := saturate (result'high, result'low); -- saturate
+ else
+ result_slv := lslv / rslv;
+ dresult := to_fixed (result_slv, dresult'high, dresult'low);
+ result := resize (arg => dresult,
+ left_index => result'high,
+ right_index => result'low,
+ round_style => round_style,
+ overflow_style => fixed_wrap); -- overflow impossible
+ end if;
+ return result;
+ end function divide;
+
+ -- sfixed(a downto b) / sfixed(c downto d) = sfixed(a-d+1 downto b-c)
+ function divide (
+ l, r : sfixed;
+ constant round_style : BOOLEAN := fixed_round_style;
+ constant guard_bits : NATURAL := fixed_guard_bits)
+ return sfixed is
+ variable result : sfixed (l'high - mine(r'low, r'low)+1
+ downto mine (l'low, l'low) - r'high);
+ variable dresult : sfixed (result'high downto result'low-guard_bits);
+ variable lresize : sfixed (l'high+1 downto l'high+1 -dresult'length+1);
+ variable lslv : SIGNED (lresize'length-1 downto 0);
+ variable rslv : SIGNED (r'length-1 downto 0);
+ variable result_slv : SIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1 or
+ mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
+ return NASF;
+ end if;
+ lresize := resize (l, lresize'high, lresize'low);
+ lslv := to_s (cleanvec (lresize));
+ rslv := to_s (cleanvec (r));
+ if (rslv = 0) then
+ report "FIXED_GENERIC_PKG.DIVIDE uFixed point Division by zero" severity error;
+ result := saturate (result'high, result'low);
+ else
+ result_slv := lslv / rslv;
+ dresult := to_fixed (result_slv, dresult'high, dresult'low);
+ result := resize (arg => dresult,
+ left_index => result'high,
+ right_index => result'low,
+ round_style => round_style,
+ overflow_style => fixed_wrap); -- overflow impossible
+ end if;
+ return result;
+ end function divide;
+
+ -- 1 / ufixed(a downto b) = ufixed(-b downto -a-1)
+ function reciprocal (
+ arg : ufixed; -- fixed point input
+ constant round_style : BOOLEAN := fixed_round_style;
+ constant guard_bits : NATURAL := fixed_guard_bits)
+ return ufixed is
+ constant one : ufixed (0 downto 0) := "1";
+ begin
+ return divide(l => one,
+ r => arg,
+ round_style => round_style,
+ guard_bits => guard_bits);
+ end function reciprocal;
+
+ -- 1 / sfixed(a downto b) = sfixed(-b+1 downto -a)
+ function reciprocal (
+ arg : sfixed; -- fixed point input
+ constant round_style : BOOLEAN := fixed_round_style;
+ constant guard_bits : NATURAL := fixed_guard_bits)
+ return sfixed is
+ constant one : sfixed (1 downto 0) := "01"; -- extra bit.
+ variable resultx : sfixed (-mine(arg'low, arg'low)+2 downto -arg'high);
+ begin
+ if (arg'length < 1 or resultx'length < 1) then
+ return NASF;
+ else
+ resultx := divide(l => one,
+ r => arg,
+ round_style => round_style,
+ guard_bits => guard_bits);
+ return resultx (resultx'high-1 downto resultx'low); -- remove extra bit
+ end if;
+ end function reciprocal;
+
+ -- ufixed (a downto b) rem ufixed (c downto d)
+ -- = ufixed (min(a,c) downto min(b,d))
+ function "rem" (
+ l, r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return remainder (l => l,
+ r => r,
+ round_style => fixed_round_style);
+ end function "rem";
+
+ -- remainder
+ -- sfixed (a downto b) rem sfixed (c downto d)
+ -- = sfixed (min(a,c) downto min(b,d))
+ function "rem" (
+ l, r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return remainder (l => l,
+ r => r,
+ round_style => fixed_round_style);
+ end function "rem";
+
+ -- ufixed (a downto b) rem ufixed (c downto d)
+ -- = ufixed (min(a,c) downto min(b,d))
+ function remainder (
+ l, r : ufixed; -- fixed point input
+ constant round_style : BOOLEAN := fixed_round_style)
+ return ufixed is
+ variable result : ufixed (minimum(l'high, r'high) downto mine(l'low, r'low));
+ variable dresult : ufixed (r'high downto r'low);
+ variable lresize : ufixed (maximum(l'high, r'low) downto mins(r'low, r'low));
+ variable lslv : UNSIGNED (lresize'length-1 downto 0);
+ variable rslv : UNSIGNED (r'length-1 downto 0);
+ variable result_slv : UNSIGNED (rslv'range);
+ begin
+ if (l'length < 1 or r'length < 1 or
+ mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
+ return NAUF;
+ end if;
+ lresize := resize (arg => l,
+ left_index => lresize'high,
+ right_index => lresize'low,
+ overflow_style => fixed_wrap, -- vector only grows
+ round_style => fixed_truncate);
+ lslv := to_uns (lresize);
+ rslv := to_uns (cleanvec(r));
+ if (rslv = 0) then
+ report "FIXED_GENERIC_PKG.rem uFixed point Division by zero" severity error;
+ result := saturate (result'high, result'low); -- saturate
+ else
+ if (r'low <= l'high) then
+ result_slv := lslv rem rslv;
+ dresult := to_fixed (result_slv, dresult'high, dresult'low);
+ result := resize (arg => dresult,
+ left_index => result'high,
+ right_index => result'low,
+ overflow_style => fixed_wrap,
+ round_style => round_style);
+-- result(result'high downto r'low) := dresult(result'high downto r'low);
+ end if;
+ if l'low < r'low then
+ result(mins(r'low-1, l'high) downto l'low) :=
+ cleanvec(l(mins(r'low-1, l'high) downto l'low));
+ end if;
+ end if;
+ return result;
+ end function remainder;
+
+ -- remainder
+ -- sfixed (a downto b) rem sfixed (c downto d)
+ -- = sfixed (min(a,c) downto min(b,d))
+ function remainder (
+ l, r : sfixed; -- fixed point input
+ constant round_style : BOOLEAN := fixed_round_style)
+ return sfixed is
+ variable l_abs : ufixed (l'range);
+ variable r_abs : ufixed (r'range);
+ variable result : sfixed (minimum(r'high, l'high) downto mine(r'low, l'low));
+ variable neg_result : sfixed (minimum(r'high, l'high)+1 downto mins(r'low, l'low));
+ begin
+ if (l'length < 1 or r'length < 1 or
+ mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
+ return NASF;
+ end if;
+ l_abs := abs(l);
+ r_abs := abs(r);
+ result := sfixed(remainder (l => l_abs,
+ r => r_abs,
+ round_style => round_style));
+ neg_result := -result;
+ if l(l'high) = '1' then
+ result := neg_result(result'range);
+ end if;
+ return result;
+ end function remainder;
+
+ -- modulo
+ -- ufixed (a downto b) mod ufixed (c downto d)
+ -- = ufixed (min(a,c) downto min(b, d))
+ function "mod" (
+ l, r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return modulo (l => l,
+ r => r,
+ round_style => fixed_round_style);
+ end function "mod";
+
+ -- sfixed (a downto b) mod sfixed (c downto d)
+ -- = sfixed (c downto min(b, d))
+ function "mod" (
+ l, r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return modulo(l => l,
+ r => r,
+ round_style => fixed_round_style);
+ end function "mod";
+
+ -- modulo
+ -- ufixed (a downto b) mod ufixed (c downto d)
+ -- = ufixed (min(a,c) downto min(b, d))
+ function modulo (
+ l, r : ufixed; -- fixed point input
+ constant round_style : BOOLEAN := fixed_round_style)
+ return ufixed is
+ begin
+ return remainder(l => l,
+ r => r,
+ round_style => round_style);
+ end function modulo;
+
+ -- sfixed (a downto b) mod sfixed (c downto d)
+ -- = sfixed (c downto min(b, d))
+ function modulo (
+ l, r : sfixed; -- fixed point input
+ constant overflow_style : BOOLEAN := fixed_overflow_style;
+ constant round_style : BOOLEAN := fixed_round_style)
+ return sfixed is
+ variable l_abs : ufixed (l'range);
+ variable r_abs : ufixed (r'range);
+ variable result : sfixed (r'high downto
+ mine(r'low, l'low));
+ variable dresult : sfixed (minimum(r'high, l'high)+1 downto
+ mins(r'low, l'low));
+ variable dresult_not_zero : BOOLEAN;
+ begin
+ if (l'length < 1 or r'length < 1 or
+ mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
+ return NASF;
+ end if;
+ l_abs := abs(l);
+ r_abs := abs(r);
+ dresult := "0" & sfixed(remainder (l => l_abs,
+ r => r_abs,
+ round_style => round_style));
+ if (to_s(dresult) = 0) then
+ dresult_not_zero := false;
+ else
+ dresult_not_zero := true;
+ end if;
+ if to_x01(l(l'high)) = '1' and to_x01(r(r'high)) = '0'
+ and dresult_not_zero then
+ result := resize (arg => r - dresult,
+ left_index => result'high,
+ right_index => result'low,
+ overflow_style => overflow_style,
+ round_style => round_style);
+ elsif to_x01(l(l'high)) = '1' and to_x01(r(r'high)) = '1' then
+ result := resize (arg => -dresult,
+ left_index => result'high,
+ right_index => result'low,
+ overflow_style => overflow_style,
+ round_style => round_style);
+ elsif to_x01(l(l'high)) = '0' and to_x01(r(r'high)) = '1'
+ and dresult_not_zero then
+ result := resize (arg => dresult + r,
+ left_index => result'high,
+ right_index => result'low,
+ overflow_style => overflow_style,
+ round_style => round_style);
+ else
+ result := resize (arg => dresult,
+ left_index => result'high,
+ right_index => result'low,
+ overflow_style => overflow_style,
+ round_style => round_style);
+ end if;
+ return result;
+ end function modulo;
+
+ -- Procedure for those who need an "accumulator" function
+ procedure add_carry (
+ L, R : in ufixed;
+ c_in : in STD_ULOGIC;
+ result : out ufixed;
+ c_out : out STD_ULOGIC) is
+ constant left_index : INTEGER := maximum(l'high, r'high)+1;
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (left_index-right_index
+ downto 0);
+ variable result_slv : UNSIGNED (left_index-right_index
+ downto 0);
+ variable cx : UNSIGNED (0 downto 0); -- Carry in
+ begin
+ if (l'length < 1 or r'length < 1) then
+ result := NAUF;
+ c_out := '0';
+ else
+ cx (0) := c_in;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ result_slv := lslv + rslv + cx;
+ c_out := result_slv(left_index);
+ result := to_fixed(result_slv (left_index-right_index-1 downto 0),
+ left_index-1, right_index);
+ end if;
+ end procedure add_carry;
+
+ procedure add_carry (
+ L, R : in sfixed;
+ c_in : in STD_ULOGIC;
+ result : out sfixed;
+ c_out : out STD_ULOGIC) is
+ constant left_index : INTEGER := maximum(l'high, r'high)+1;
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (left_index-right_index
+ downto 0);
+ variable result_slv : SIGNED (left_index-right_index
+ downto 0);
+ variable cx : SIGNED (1 downto 0); -- Carry in
+ begin
+ if (l'length < 1 or r'length < 1) then
+ result := NASF;
+ c_out := '0';
+ else
+ cx (1) := '0';
+ cx (0) := c_in;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ result_slv := lslv + rslv + cx;
+ c_out := result_slv(left_index);
+ result := to_fixed(result_slv (left_index-right_index-1 downto 0),
+ left_index-1, right_index);
+ end if;
+ end procedure add_carry;
+
+ -- Scales the result by a power of 2. Width of input = width of output with
+ -- the decimal point moved.
+ function scalb (y : ufixed; N : integer) return ufixed is
+ variable result : ufixed (y'high+N downto y'low+N);
+ begin
+ if y'length < 1 then
+ return NAUF;
+ else
+ result := y;
+ return result;
+ end if;
+ end function scalb;
+
+ function scalb (y : ufixed; N : SIGNED) return ufixed is
+ begin
+ return scalb (y => y,
+ N => to_integer(N));
+ end function scalb;
+
+ function scalb (y : sfixed; N : integer) return sfixed is
+ variable result : sfixed (y'high+N downto y'low+N);
+ begin
+ if y'length < 1 then
+ return NASF;
+ else
+ result := y;
+ return result;
+ end if;
+ end function scalb;
+
+ function scalb (y : sfixed; N : SIGNED) return sfixed is
+ begin
+ return scalb (y => y,
+ N => to_integer(N));
+ end function scalb;
+
+ function Is_Negative (arg : sfixed) return BOOLEAN is
+ begin
+ if to_X01(arg(arg'high)) = '1' then
+ return true;
+ else
+ return false;
+ end if;
+ end function Is_Negative;
+
+ function find_lsb (arg : ufixed; y : STD_ULOGIC) return INTEGER is
+ begin
+ for_loop : for i in arg'low to arg'high loop
+ if arg(i) = y then
+ return i;
+ end if;
+ end loop;
+ return arg'high+1; -- return out of bounds 'high
+ end function find_lsb;
+
+ function find_msb (arg : ufixed; y : STD_ULOGIC) return INTEGER is
+ begin
+ for_loop : for i in arg'high downto arg'low loop
+ if arg(i) = y then
+ return i;
+ end if;
+ end loop;
+ return arg'low-1; -- return out of bounds 'low
+ end function find_msb;
+
+ function find_lsb (arg : sfixed; y : STD_ULOGIC) return INTEGER is
+ begin
+ for_loop : for i in arg'low to arg'high loop
+ if arg(i) = y then
+ return i;
+ end if;
+ end loop;
+ return arg'high+1; -- return out of bounds 'high
+ end function find_lsb;
+
+ function find_msb (arg : sfixed; y : STD_ULOGIC) return INTEGER is
+ begin
+ for_loop : for i in arg'high downto arg'low loop
+ if arg(i) = y then
+ return i;
+ end if;
+ end loop;
+ return arg'low-1; -- return out of bounds 'low
+ end function find_msb;
+
+ function "sll" (ARG : ufixed; COUNT : INTEGER) return ufixed is
+ variable argslv : UNSIGNED (arg'length-1 downto 0);
+ variable result : ufixed (arg'range);
+ begin
+ argslv := to_uns (arg);
+ argslv := argslv sll COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "sll";
+
+ function "srl" (ARG : ufixed; COUNT : INTEGER) return ufixed is
+ variable argslv : UNSIGNED (arg'length-1 downto 0);
+ variable result : ufixed (arg'range);
+ begin
+ argslv := to_uns (arg);
+ argslv := argslv srl COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "srl";
+
+ function "rol" (ARG : ufixed; COUNT : INTEGER) return ufixed is
+ variable argslv : UNSIGNED (arg'length-1 downto 0);
+ variable result : ufixed (arg'range);
+ begin
+ argslv := to_uns (arg);
+ argslv := argslv rol COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "rol";
+
+ function "ror" (ARG : ufixed; COUNT : INTEGER) return ufixed is
+ variable argslv : UNSIGNED (arg'length-1 downto 0);
+ variable result : ufixed (arg'range);
+ begin
+ argslv := to_uns (arg);
+ argslv := argslv ror COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "ror";
+
+ function "sla" (ARG : ufixed; COUNT : INTEGER) return ufixed is
+ variable argslv : UNSIGNED (arg'length-1 downto 0);
+ variable result : ufixed (arg'range);
+ begin
+ argslv := to_uns (arg);
+ -- Arithmetic shift on an unsigned is a logical shift
+ argslv := argslv sll COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "sla";
+
+ function "sra" (ARG : ufixed; COUNT : INTEGER) return ufixed is
+ variable argslv : UNSIGNED (arg'length-1 downto 0);
+ variable result : ufixed (arg'range);
+ begin
+ argslv := to_uns (arg);
+ -- Arithmetic shift on an unsigned is a logical shift
+ argslv := argslv srl COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "sra";
+
+ function "sll" (ARG : sfixed; COUNT : INTEGER) return sfixed is
+ variable argslv : SIGNED (arg'length-1 downto 0);
+ variable result : sfixed (arg'range);
+ begin
+ argslv := to_s (arg);
+ argslv := argslv sll COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "sll";
+
+ function "srl" (ARG : sfixed; COUNT : INTEGER) return sfixed is
+ variable argslv : SIGNED (arg'length-1 downto 0);
+ variable result : sfixed (arg'range);
+ begin
+ argslv := to_s (arg);
+ argslv := argslv srl COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "srl";
+
+ function "rol" (ARG : sfixed; COUNT : INTEGER) return sfixed is
+ variable argslv : SIGNED (arg'length-1 downto 0);
+ variable result : sfixed (arg'range);
+ begin
+ argslv := to_s (arg);
+ argslv := argslv rol COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "rol";
+
+ function "ror" (ARG : sfixed; COUNT : INTEGER) return sfixed is
+ variable argslv : SIGNED (arg'length-1 downto 0);
+ variable result : sfixed (arg'range);
+ begin
+ argslv := to_s (arg);
+ argslv := argslv ror COUNT;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "ror";
+
+ function "sla" (ARG : sfixed; COUNT : INTEGER) return sfixed is
+ variable argslv : SIGNED (arg'length-1 downto 0);
+ variable result : sfixed (arg'range);
+ begin
+ argslv := to_s (arg);
+ if COUNT > 0 then
+ -- Arithmetic shift left on a 2's complement number is a logic shift
+ argslv := argslv sll COUNT;
+ else
+ argslv := argslv sra -COUNT;
+ end if;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "sla";
+
+ function "sra" (ARG : sfixed; COUNT : INTEGER) return sfixed is
+ variable argslv : SIGNED (arg'length-1 downto 0);
+ variable result : sfixed (arg'range);
+ begin
+ argslv := to_s (arg);
+ if COUNT > 0 then
+ argslv := argslv sra COUNT;
+ else
+ -- Arithmetic shift left on a 2's complement number is a logic shift
+ argslv := argslv sll -COUNT;
+ end if;
+ result := to_fixed (argslv, result'high, result'low);
+ return result;
+ end function "sra";
+
+ -- Because some people want the older functions.
+ function SHIFT_LEFT (ARG : ufixed; COUNT : NATURAL) return ufixed is
+ begin
+ if (ARG'length < 1) then
+ return NAUF;
+ end if;
+ return ARG sla COUNT;
+ end function SHIFT_LEFT;
+ function SHIFT_RIGHT (ARG : ufixed; COUNT : NATURAL) return ufixed is
+ begin
+ if (ARG'length < 1) then
+ return NAUF;
+ end if;
+ return ARG sra COUNT;
+ end function SHIFT_RIGHT;
+ function SHIFT_LEFT (ARG : sfixed; COUNT : NATURAL) return sfixed is
+ begin
+ if (ARG'length < 1) then
+ return NASF;
+ end if;
+ return ARG sla COUNT;
+ end function SHIFT_LEFT;
+ function SHIFT_RIGHT (ARG : sfixed; COUNT : NATURAL) return sfixed is
+ begin
+ if (ARG'length < 1) then
+ return NASF;
+ end if;
+ return ARG sra COUNT;
+ end function SHIFT_RIGHT;
+
+ ----------------------------------------------------------------------------
+ -- logical functions
+ ----------------------------------------------------------------------------
+ function "not" (L : ufixed) return ufixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ RESULT := not to_slv(L);
+ return to_ufixed(RESULT, L'high, L'low);
+ end function "not";
+
+ function "and" (L, R : ufixed) return ufixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) and to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""and"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_ufixed(RESULT, L'high, L'low);
+ end function "and";
+
+ function "or" (L, R : ufixed) return ufixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) or to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""or"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_ufixed(RESULT, L'high, L'low);
+ end function "or";
+
+ function "nand" (L, R : ufixed) return ufixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) nand to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""nand"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_ufixed(RESULT, L'high, L'low);
+ end function "nand";
+
+ function "nor" (L, R : ufixed) return ufixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) nor to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""nor"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_ufixed(RESULT, L'high, L'low);
+ end function "nor";
+
+ function "xor" (L, R : ufixed) return ufixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) xor to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""xor"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_ufixed(RESULT, L'high, L'low);
+ end function "xor";
+
+ function "xnor" (L, R : ufixed) return ufixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) xnor to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""xnor"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_ufixed(RESULT, L'high, L'low);
+ end function "xnor";
+
+ function "not" (L : sfixed) return sfixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ RESULT := not to_slv(L);
+ return to_sfixed(RESULT, L'high, L'low);
+ end function "not";
+
+ function "and" (L, R : sfixed) return sfixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) and to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""and"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_sfixed(RESULT, L'high, L'low);
+ end function "and";
+
+ function "or" (L, R : sfixed) return sfixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) or to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""or"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_sfixed(RESULT, L'high, L'low);
+ end function "or";
+
+ function "nand" (L, R : sfixed) return sfixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) nand to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""nand"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_sfixed(RESULT, L'high, L'low);
+ end function "nand";
+
+ function "nor" (L, R : sfixed) return sfixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) nor to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""nor"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_sfixed(RESULT, L'high, L'low);
+ end function "nor";
+
+ function "xor" (L, R : sfixed) return sfixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) xor to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""xor"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_sfixed(RESULT, L'high, L'low);
+ end function "xor";
+
+ function "xnor" (L, R : sfixed) return sfixed is
+ variable RESULT : STD_LOGIC_VECTOR(L'length-1 downto 0); -- force downto
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ RESULT := to_slv(L) xnor to_slv(R);
+ else
+ report "FIXED_GENERIC_PKG.""xnor"": Range error L'RANGE /= R'RANGE"
+ severity warning;
+ RESULT := (others => 'U');
+ end if;
+ return to_sfixed(RESULT, L'high, L'low);
+ end function "xnor";
+
+ -- Vector and std_ulogic functions, same as functions in numeric_std
+ function "and" (L : STD_ULOGIC; R : ufixed) return ufixed is
+ variable result : ufixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L and R(i);
+ end loop;
+ return result;
+ end function "and";
+
+ function "and" (L : ufixed; R : STD_ULOGIC) return ufixed is
+ variable result : ufixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) and R;
+ end loop;
+ return result;
+ end function "and";
+
+ function "or" (L : STD_ULOGIC; R : ufixed) return ufixed is
+ variable result : ufixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L or R(i);
+ end loop;
+ return result;
+ end function "or";
+
+ function "or" (L : ufixed; R : STD_ULOGIC) return ufixed is
+ variable result : ufixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) or R;
+ end loop;
+ return result;
+ end function "or";
+
+ function "nand" (L : STD_ULOGIC; R : ufixed) return ufixed is
+ variable result : ufixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L nand R(i);
+ end loop;
+ return result;
+ end function "nand";
+
+ function "nand" (L : ufixed; R : STD_ULOGIC) return ufixed is
+ variable result : ufixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) nand R;
+ end loop;
+ return result;
+ end function "nand";
+
+ function "nor" (L : STD_ULOGIC; R : ufixed) return ufixed is
+ variable result : ufixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L nor R(i);
+ end loop;
+ return result;
+ end function "nor";
+
+ function "nor" (L : ufixed; R : STD_ULOGIC) return ufixed is
+ variable result : ufixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) nor R;
+ end loop;
+ return result;
+ end function "nor";
+
+ function "xor" (L : STD_ULOGIC; R : ufixed) return ufixed is
+ variable result : ufixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L xor R(i);
+ end loop;
+ return result;
+ end function "xor";
+
+ function "xor" (L : ufixed; R : STD_ULOGIC) return ufixed is
+ variable result : ufixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) xor R;
+ end loop;
+ return result;
+ end function "xor";
+
+ function "xnor" (L : STD_ULOGIC; R : ufixed) return ufixed is
+ variable result : ufixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L xnor R(i);
+ end loop;
+ return result;
+ end function "xnor";
+
+ function "xnor" (L : ufixed; R : STD_ULOGIC) return ufixed is
+ variable result : ufixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) xnor R;
+ end loop;
+ return result;
+ end function "xnor";
+
+ function "and" (L : STD_ULOGIC; R : sfixed) return sfixed is
+ variable result : sfixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L and R(i);
+ end loop;
+ return result;
+ end function "and";
+
+ function "and" (L : sfixed; R : STD_ULOGIC) return sfixed is
+ variable result : sfixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) and R;
+ end loop;
+ return result;
+ end function "and";
+
+ function "or" (L : STD_ULOGIC; R : sfixed) return sfixed is
+ variable result : sfixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L or R(i);
+ end loop;
+ return result;
+ end function "or";
+
+ function "or" (L : sfixed; R : STD_ULOGIC) return sfixed is
+ variable result : sfixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) or R;
+ end loop;
+ return result;
+ end function "or";
+
+ function "nand" (L : STD_ULOGIC; R : sfixed) return sfixed is
+ variable result : sfixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L nand R(i);
+ end loop;
+ return result;
+ end function "nand";
+
+ function "nand" (L : sfixed; R : STD_ULOGIC) return sfixed is
+ variable result : sfixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) nand R;
+ end loop;
+ return result;
+ end function "nand";
+
+ function "nor" (L : STD_ULOGIC; R : sfixed) return sfixed is
+ variable result : sfixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L nor R(i);
+ end loop;
+ return result;
+ end function "nor";
+
+ function "nor" (L : sfixed; R : STD_ULOGIC) return sfixed is
+ variable result : sfixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) nor R;
+ end loop;
+ return result;
+ end function "nor";
+
+ function "xor" (L : STD_ULOGIC; R : sfixed) return sfixed is
+ variable result : sfixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L xor R(i);
+ end loop;
+ return result;
+ end function "xor";
+
+ function "xor" (L : sfixed; R : STD_ULOGIC) return sfixed is
+ variable result : sfixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) xor R;
+ end loop;
+ return result;
+ end function "xor";
+
+ function "xnor" (L : STD_ULOGIC; R : sfixed) return sfixed is
+ variable result : sfixed (R'range);
+ begin
+ for i in result'range loop
+ result(i) := L xnor R(i);
+ end loop;
+ return result;
+ end function "xnor";
+
+ function "xnor" (L : sfixed; R : STD_ULOGIC) return sfixed is
+ variable result : sfixed (L'range);
+ begin
+ for i in result'range loop
+ result(i) := L(i) xnor R;
+ end loop;
+ return result;
+ end function "xnor";
+
+ -- Reduction operators, same as numeric_std functions
+ -- %%% remove 12 functions (old syntax)
+ function and_reduce(arg : ufixed) return STD_ULOGIC is
+ begin
+ return and_reducex (to_slv(arg));
+ end function and_reduce;
+
+ function nand_reduce(arg : ufixed) return STD_ULOGIC is
+ begin
+ return not and_reducex (to_slv(arg));
+ end function nand_reduce;
+
+ function or_reduce(arg : ufixed) return STD_ULOGIC is
+ begin
+ return or_reducex (to_slv(arg));
+ end function or_reduce;
+
+ function nor_reduce(arg : ufixed) return STD_ULOGIC is
+ begin
+ return not or_reducex (to_slv(arg));
+ end function nor_reduce;
+
+ function xor_reduce(arg : ufixed) return STD_ULOGIC is
+ begin
+ return xor_reducex (to_slv(arg));
+ end function xor_reduce;
+
+ function xnor_reduce(arg : ufixed) return STD_ULOGIC is
+ begin
+ return not xor_reducex (to_slv(arg));
+ end function xnor_reduce;
+
+ function and_reduce(arg : sfixed) return STD_ULOGIC is
+ begin
+ return and_reducex (to_slv(arg));
+ end function and_reduce;
+
+ function nand_reduce(arg : sfixed) return STD_ULOGIC is
+ begin
+ return not and_reducex (to_slv(arg));
+ end function nand_reduce;
+
+ function or_reduce(arg : sfixed) return STD_ULOGIC is
+ begin
+ return or_reducex (to_slv(arg));
+ end function or_reduce;
+
+ function nor_reduce(arg : sfixed) return STD_ULOGIC is
+ begin
+ return not or_reducex (to_slv(arg));
+ end function nor_reduce;
+
+ function xor_reduce(arg : sfixed) return STD_ULOGIC is
+ begin
+ return xor_reducex (to_slv(arg));
+ end function xor_reduce;
+
+ function xnor_reduce(arg : sfixed) return STD_ULOGIC is
+ begin
+ return not xor_reducex (to_slv(arg));
+ end function xnor_reduce;
+ -- %%% Uncomment the following 12 functions (new syntax)
+ -- function "and" ( arg : ufixed ) RETURN std_ulogic is
+ -- begin
+ -- return and to_slv(arg);
+ -- end function "and";
+ -- function "nand" ( arg : ufixed ) RETURN std_ulogic is
+ -- begin
+ -- return nand to_slv(arg);
+ -- end function "nand";;
+ -- function "or" ( arg : ufixed ) RETURN std_ulogic is
+ -- begin
+ -- return or to_slv(arg);
+ -- end function "or";
+ -- function "nor" ( arg : ufixed ) RETURN std_ulogic is
+ -- begin
+ -- return nor to_slv(arg);
+ -- end function "nor";
+ -- function "xor" ( arg : ufixed ) RETURN std_ulogic is
+ -- begin
+ -- return xor to_slv(arg);
+ -- end function "xor";
+ -- function "xnor" ( arg : ufixed ) RETURN std_ulogic is
+ -- begin
+ -- return xnor to_slv(arg);
+ -- end function "xnor";
+ -- function "and" ( arg : sfixed ) RETURN std_ulogic is
+ -- begin
+ -- return and to_slv(arg);
+ -- end function "and";;
+ -- function "nand" ( arg : sfixed ) RETURN std_ulogic is
+ -- begin
+ -- return nand to_slv(arg);
+ -- end function "nand";;
+ -- function "or" ( arg : sfixed ) RETURN std_ulogic is
+ -- begin
+ -- return or to_slv(arg);
+ -- end function "or";
+ -- function "nor" ( arg : sfixed ) RETURN std_ulogic is
+ -- begin
+ -- return nor to_slv(arg);
+ -- end function "nor";
+ -- function "xor" ( arg : sfixed ) RETURN std_ulogic is
+ -- begin
+ -- return xor to_slv(arg);
+ -- end function "xor";
+ -- function "xnor" ( arg : sfixed ) RETURN std_ulogic is
+ -- begin
+ -- return xnor to_slv(arg);
+ -- end function "xnor";
+
+ -- %%% Replace with the following (new syntax)
+-- function "?=" (L, R : ufixed) return STD_ULOGIC is
+ function \?=\ (L, R : ufixed) return STD_ULOGIC is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable result, result1 : STD_ULOGIC; -- result
+ begin -- ?=
+ if ((L'LENGTH < 1) or (R'LENGTH < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?="": null detected, returning X"
+ severity warning;
+ return 'X';
+ else
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ result := '1';
+ for i in lresize'reverse_range loop
+ result1 := \?=\(lresize(i), rresize(i));
+ if result1 = 'U' then
+ return 'U';
+ elsif result1 = 'X' or result = 'X' then
+ result := 'X';
+ else
+ result := result and result1;
+ end if;
+ end loop;
+ return result;
+ end if;
+ end function \?=\;
+-- end function "?=";
+
+-- function "?/=" (L, R : ufixed) return STD_ULOGIC is
+ function \?/=\ (L, R : ufixed) return STD_ULOGIC is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable result, result1 : STD_ULOGIC; -- result
+ begin -- ?/=
+ if ((L'LENGTH < 1) or (R'LENGTH < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?/="": null detected, returning X"
+ severity warning;
+ return 'X';
+ else
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ result := '0';
+ for i in lresize'reverse_range loop
+ result1 := \?/=\ (lresize(i), rresize(i));
+ if result1 = 'U' then
+ return 'U';
+ elsif result1 = 'X' or result = 'X' then
+ result := 'X';
+ else
+ result := result or result1;
+ end if;
+ end loop;
+ return result;
+ end if;
+ end function \?/=\;
+-- end function "?/=";
+
+-- function "?>" (L, R : ufixed) return STD_ULOGIC is
+ function \?>\ (L, R : ufixed) return STD_ULOGIC is
+ begin -- ?>
+ if ((l'length < 1) or (r'length < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?>"": null detected, returning X"
+ severity warning;
+ return 'X';
+ elsif (find_msb (l, '-') /= l'low-1) or (find_msb (r, '-') /= r'low-1) then
+ report "FIXED_GENERIC_PKG.""?>"": '-' found in compare string"
+ severity error;
+ return 'X';
+ else
+ if is_x(l) or is_x(r) then
+ return 'X';
+ elsif l > r then
+ return '1';
+ else
+ return '0';
+ end if;
+ end if;
+ end function \?>\;
+-- end function "?>";
+
+-- function "?>=" (L, R : ufixed) return STD_ULOGIC is
+ function \?>=\ (L, R : ufixed) return STD_ULOGIC is
+ begin -- ?>=
+ if ((l'length < 1) or (r'length < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?>="": null detected, returning X"
+ severity warning;
+ return 'X';
+ elsif (find_msb (l, '-') /= l'low-1) or (find_msb (r, '-') /= r'low-1) then
+ report "FIXED_GENERIC_PKG.""?>="": '-' found in compare string"
+ severity error;
+ return 'X';
+ else
+ if is_x(l) or is_x(r) then
+ return 'X';
+ elsif l >= r then
+ return '1';
+ else
+ return '0';
+ end if;
+ end if;
+ end function \?>=\;
+-- end function "?>=";
+
+-- function "?<" (L, R : ufixed) return STD_ULOGIC is
+ function \?<\ (L, R : ufixed) return STD_ULOGIC is
+ begin -- ?<
+ if ((l'length < 1) or (r'length < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?<"": null detected, returning X"
+ severity warning;
+ return 'X';
+ elsif (find_msb (l, '-') /= l'low-1) or (find_msb (r, '-') /= r'low-1) then
+ report "FIXED_GENERIC_PKG.""?<"": '-' found in compare string"
+ severity error;
+ return 'X';
+ else
+ if is_x(l) or is_x(r) then
+ return 'X';
+ elsif l < r then
+ return '1';
+ else
+ return '0';
+ end if;
+ end if;
+ end function \?<\;
+-- end function "?<";
+
+-- function "?<=" (L, R : ufixed) return STD_ULOGIC is
+ function \?<=\ (L, R : ufixed) return STD_ULOGIC is
+ begin -- ?<=
+ if ((l'length < 1) or (r'length < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?<="": null detected, returning X"
+ severity warning;
+ return 'X';
+ elsif (find_msb (l, '-') /= l'low-1) or (find_msb (r, '-') /= r'low-1) then
+ report "FIXED_GENERIC_PKG.""?<="": '-' found in compare string"
+ severity error;
+ return 'X';
+ else
+ if is_x(l) or is_x(r) then
+ return 'X';
+ elsif l <= r then
+ return '1';
+ else
+ return '0';
+ end if;
+ end if;
+ end function \?<=\;
+-- end function "?<=";
+
+ -- function "?=" (L, R : sfixed) return STD_ULOGIC is
+ function \?=\ (L, R : sfixed) return STD_ULOGIC is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable result, result1 : STD_ULOGIC; -- result
+ begin -- ?=
+ if ((L'LENGTH < 1) or (R'LENGTH < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?="": null detected, returning X"
+ severity warning;
+ return 'X';
+ else
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ result := '1';
+ for i in lresize'reverse_range loop
+ result1 := \?=\ (lresize(i), rresize(i));
+ if result1 = 'U' then
+ return 'U';
+ elsif result1 = 'X' or result = 'X' then
+ result := 'X';
+ else
+ result := result and result1;
+ end if;
+ end loop;
+ return result;
+ end if;
+ end function \?=\;
+-- end function "?=";
+
+-- function "?/=" (L, R : sfixed) return STD_ULOGIC is
+ function \?/=\ (L, R : sfixed) return STD_ULOGIC is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable result, result1 : STD_ULOGIC; -- result
+ begin -- ?/=
+ if ((L'LENGTH < 1) or (R'LENGTH < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?/="": null detected, returning X"
+ severity warning;
+ return 'X';
+ else
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ result := '0';
+ for i in lresize'reverse_range loop
+ result1 := \?/=\ (lresize(i), rresize(i));
+ if result1 = 'U' then
+ return 'U';
+ elsif result1 = 'X' or result = 'X' then
+ result := 'X';
+ else
+ result := result or result1;
+ end if;
+ end loop;
+ return result;
+ end if;
+ end function \?/=\;
+-- end function "?/=";
+
+-- function "?>" (L, R : sfixed) return STD_ULOGIC is
+ function \?>\ (L, R : sfixed) return STD_ULOGIC is
+ begin -- ?>
+ if ((l'length < 1) or (r'length < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?>"": null detected, returning X"
+ severity warning;
+ return 'X';
+ elsif (find_msb (l, '-') /= l'low-1) or (find_msb (r, '-') /= r'low-1) then
+ report "FIXED_GENERIC_PKG.""?>"": '-' found in compare string"
+ severity error;
+ return 'X';
+ else
+ if is_x(l) or is_x(r) then
+ return 'X';
+ elsif l > r then
+ return '1';
+ else
+ return '0';
+ end if;
+ end if;
+ end function \?>\;
+-- end function "?>";
+
+-- function "?>=" (L, R : sfixed) return STD_ULOGIC is
+ function \?>=\ (L, R : sfixed) return STD_ULOGIC is
+ begin -- ?>=
+ if ((l'length < 1) or (r'length < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?>="": null detected, returning X"
+ severity warning;
+ return 'X';
+ elsif (find_msb (l, '-') /= l'low-1) or (find_msb (r, '-') /= r'low-1) then
+ report "FIXED_GENERIC_PKG.""?>="": '-' found in compare string"
+ severity error;
+ return 'X';
+ else
+ if is_x(l) or is_x(r) then
+ return 'X';
+ elsif l >= r then
+ return '1';
+ else
+ return '0';
+ end if;
+ end if;
+ end function \?>=\;
+-- end function "?>=";
+
+-- function "?<" (L, R : sfixed) return STD_ULOGIC is
+ function \?<\ (L, R : sfixed) return STD_ULOGIC is
+ begin -- ?<
+ if ((l'length < 1) or (r'length < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?<"": null detected, returning X"
+ severity warning;
+ return 'X';
+ elsif (find_msb (l, '-') /= l'low-1) or (find_msb (r, '-') /= r'low-1) then
+ report "FIXED_GENERIC_PKG.""?<"": '-' found in compare string"
+ severity error;
+ return 'X';
+ else
+ if is_x(l) or is_x(r) then
+ return 'X';
+ elsif l < r then
+ return '1';
+ else
+ return '0';
+ end if;
+ end if;
+ end function \?<\;
+-- end function "?<";
+
+-- function "?<=" (L, R : sfixed) return STD_ULOGIC is
+ function \?<=\ (L, R : sfixed) return STD_ULOGIC is
+ begin -- ?<=
+ if ((l'length < 1) or (r'length < 1)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""?<="": null detected, returning X"
+ severity warning;
+ return 'X';
+ elsif (find_msb (l, '-') /= l'low-1) or (find_msb (r, '-') /= r'low-1) then
+ report "FIXED_GENERIC_PKG.""?<="": '-' found in compare string"
+ severity error;
+ return 'X';
+ else
+ if is_x(l) or is_x(r) then
+ return 'X';
+ elsif l <= r then
+ return '1';
+ else
+ return '0';
+ end if;
+ end if;
+ end function \?<=\;
+-- end function "?<=";
+
+ -- %%% end replace
+ -- Match function, similar to "std_match" from numeric_std
+ function std_match (L, R : ufixed) return BOOLEAN is
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ return std_match(to_slv(L), to_slv(R));
+ else
+ report "FIXED_GENERIC_PKG.STD_MATCH: L'RANGE /= R'RANGE, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ end function std_match;
+
+ function std_match (L, R : sfixed) return BOOLEAN is
+ begin
+ if (L'high = R'high and L'low = R'low) then
+ return std_match(to_slv(L), to_slv(R));
+ else
+ report "FIXED_GENERIC_PKG.STD_MATCH: L'RANGE /= R'RANGE, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ end function std_match;
+ --%%% end remove
+
+ -- compare functions
+ function "=" (
+ l, r : ufixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""="": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""="": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ return lslv = rslv;
+ end function "=";
+
+ function "=" (
+ l, r : sfixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""="": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""="": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ return lslv = rslv;
+ end function "=";
+
+ function "/=" (
+ l, r : ufixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""/="": null argument detected, returning TRUE"
+ severity warning;
+ return true;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""/="": metavalue detected, returning TRUE"
+ severity warning;
+ return true;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ return lslv /= rslv;
+ end function "/=";
+
+ function "/=" (
+ l, r : sfixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""/="": null argument detected, returning TRUE"
+ severity warning;
+ return true;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""/="": metavalue detected, returning TRUE"
+ severity warning;
+ return true;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ return lslv /= rslv;
+ end function "/=";
+
+ function ">" (
+ l, r : ufixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG."">"": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG."">"": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ return lslv > rslv;
+ end function ">";
+
+ function ">" (
+ l, r : sfixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG."">"": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG."">"": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ return lslv > rslv;
+ end function ">";
+
+ function "<" (
+ l, r : ufixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""<"": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""<"": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ return lslv < rslv;
+ end function "<";
+
+ function "<" (
+ l, r : sfixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""<"": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""<"": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ return lslv < rslv;
+ end function "<";
+
+ function ">=" (
+ l, r : ufixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG."">="": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG."">="": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ return lslv >= rslv;
+ end function ">=";
+
+ function ">=" (
+ l, r : sfixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG."">="": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG."">="": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ return lslv >= rslv;
+ end function ">=";
+
+ function "<=" (
+ l, r : ufixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : ufixed (left_index downto right_index);
+ variable lslv, rslv : UNSIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""<="": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""<="": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_uns (lresize);
+ rslv := to_uns (rresize);
+ return lslv <= rslv;
+ end function "<=";
+
+ function "<=" (
+ l, r : sfixed) -- fixed point input
+ return BOOLEAN is
+ constant left_index : INTEGER := maximum(l'high, r'high);
+ constant right_index : INTEGER := mins(l'low, r'low);
+ variable lresize, rresize : sfixed (left_index downto right_index);
+ variable lslv, rslv : SIGNED (lresize'length-1 downto 0);
+ begin
+ if (l'length < 1 or r'length < 1) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""<="": null argument detected, returning FALSE"
+ severity warning;
+ return false;
+ elsif (Is_X(l) or Is_X(r)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.""<="": metavalue detected, returning FALSE"
+ severity warning;
+ return false;
+ end if;
+ lresize := resize (l, left_index, right_index);
+ rresize := resize (r, left_index, right_index);
+ lslv := to_s (lresize);
+ rslv := to_s (rresize);
+ return lslv <= rslv;
+ end function "<=";
+
+ -- overloads of the default maximum and minimum functions
+ function maximum (l, r : ufixed) return ufixed is
+ begin
+ if l > r then return l;
+ else return r;
+ end if;
+ end function maximum;
+
+ function maximum (l, r : sfixed) return sfixed is
+ begin
+ if l > r then return l;
+ else return r;
+ end if;
+ end function maximum;
+
+ function minimum (l, r : ufixed) return ufixed is
+ begin
+ if l > r then return r;
+ else return l;
+ end if;
+ end function minimum;
+
+ function minimum (l, r : sfixed) return sfixed is
+ begin
+ if l > r then return r;
+ else return l;
+ end if;
+ end function minimum;
+
+ function to_ufixed (
+ arg : NATURAL; -- integer
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER := 0; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding by default
+ return ufixed is
+ variable argx : INTEGER;
+ constant fw : INTEGER := mine (right_index, right_index); -- catch literals
+ variable result : ufixed (left_index downto fw) := (others => '0');
+ variable sresult : UNSIGNED (left_index downto 0); -- integer portion
+ variable bound : NATURAL; -- find the numerical bounds
+ begin
+ if (left_index < fw) then
+ return NAUF;
+ end if;
+ if left_index >= 0 then
+ if (left_index < 30) then
+ bound := 2**(left_index+1);
+ else
+ bound := INTEGER'high;
+ end if;
+ end if;
+ if (arg /= 0) then
+ if arg >= bound or left_index < 0 then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.TO_UFIXED(NATURAL): vector truncated"
+ severity warning;
+ if (overflow_style = fixed_wrap) then -- wrap
+ if bound = 0 then
+ argx := 0;
+ else
+ argx := arg mod bound;
+ end if;
+ else -- saturate
+ return saturate (result'high, result'low);
+ end if;
+ else
+ argx := arg;
+ end if;
+ else
+ return result; -- return zero
+ end if;
+ sresult := to_unsigned (argx, sresult'high+1);
+ result := resize (arg => ufixed (sresult),
+ left_index => left_index,
+ right_index => right_index,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : INTEGER; -- integer
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER := 0; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding by default
+ return sfixed is
+ variable argx : INTEGER;
+ constant fw : INTEGER := mine (right_index, right_index); -- catch literals
+ variable result : sfixed (left_index downto fw) := (others => '0');
+ variable sresult : SIGNED (left_index+1 downto 0); -- integer portion
+ variable bound : NATURAL := 0;
+ begin
+ if (left_index < fw) then -- null range
+ return NASF;
+ end if;
+ if left_index >= 0 then
+ if (left_index < 30) then
+ bound := 2**(left_index);
+ else
+ bound := INTEGER'high;
+ end if;
+ end if;
+ if (arg /= 0) then
+ if (arg >= bound or arg < -bound or left_index < 0) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.TO_SFIXED(INTEGER): vector truncated"
+ severity warning;
+ if overflow_style = fixed_wrap then -- wrap
+ if bound = 0 then -- negative integer_range trap
+ argx := 0;
+ else -- shift off the top bits
+ argx := arg rem (bound*2);
+ end if;
+ else -- saturate
+ if arg < 0 then
+ result := not saturate (result'high, result'low); -- underflow
+ else
+ result := saturate (result'high, result'low); -- overflow
+ end if;
+ return result;
+ end if;
+ else
+ argx := arg;
+ end if;
+ else
+ return result; -- return zero
+ end if;
+ sresult := to_signed (argx, sresult'length);
+ result := resize (arg => sfixed (sresult),
+ left_index => left_index,
+ right_index => right_index,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end function to_sfixed;
+
+ function to_ufixed (
+ arg : REAL; -- real
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style; -- turn on rounding by default
+ constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
+ return ufixed is
+ constant fw : INTEGER := mine (right_index, right_index); -- catch literals
+ variable result : ufixed (left_index downto fw) := (others => '0');
+ variable Xresult : ufixed (left_index downto fw-guard_bits) := (others => '0');
+ variable presult : REAL;
+ variable overflow_needed : BOOLEAN;
+ begin
+ -- If negative or null range, return.
+ if (left_index < fw) then
+ return NAUF;
+ end if;
+ if (arg < 0.0) then
+ report "FIXED_GENERIC_PKG.TO_UFIXED: Negative argument passed "
+ & REAL'image(arg) severity error;
+ return result;
+ end if;
+ presult := arg;
+ if presult >= (2.0**(left_index+1)) then
+ assert NO_WARNING report "FIXED_GENERIC_PKG.TO_UFIXED(REAL): vector truncated"
+ severity warning;
+ overflow_needed := (overflow_style = fixed_saturate);
+ if overflow_style = fixed_wrap then
+ presult := presult mod (2.0**(left_index+1)); -- wrap
+ else
+ return saturate (result'high, result'low);
+ end if;
+ end if;
+ for i in Xresult'range loop
+ if presult >= 2.0**i then
+ Xresult(i) := '1';
+ presult := presult - 2.0**i;
+ else
+ Xresult(i) := '0';
+ end if;
+ end loop;
+ if guard_bits > 0 and round_style = fixed_round then
+ result := round_fixed (arg => Xresult (left_index
+ downto right_index),
+ remainder => Xresult (right_index-1 downto
+ right_index-guard_bits),
+ overflow_style => overflow_style);
+ else
+ result := Xresult (result'range);
+ end if;
+ return result;
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : REAL; -- real
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style; -- turn on rounding by default
+ constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
+ return sfixed is
+ constant fw : INTEGER := mine (right_index, right_index); -- catch literals
+ variable result : sfixed (left_index downto fw) := (others => '0');
+ variable Xresult : sfixed (left_index+1 downto fw-guard_bits) := (others => '0');
+ variable presult : REAL;
+ begin
+ if (left_index < fw) then -- null range
+ return NASF;
+ end if;
+ if (arg >= (2.0**left_index) or arg < -(2.0**left_index)) then
+ assert NO_WARNING report "FIXED_GENERIC_PKG.TO_SFIXED(REAL): vector truncated"
+ severity warning;
+ if overflow_style = fixed_saturate then
+ if arg < 0.0 then -- saturate
+ result := not saturate (result'high, result'low); -- underflow
+ else
+ result := saturate (result'high, result'low); -- overflow
+ end if;
+ return result;
+ else
+ presult := abs(arg) mod (2.0**(left_index+1)); -- wrap
+ end if;
+ else
+ presult := abs(arg);
+ end if;
+ for i in Xresult'range loop
+ if presult >= 2.0**i then
+ Xresult(i) := '1';
+ presult := presult - 2.0**i;
+ else
+ Xresult(i) := '0';
+ end if;
+ end loop;
+ if arg < 0.0 then
+ Xresult := to_fixed(-to_s(Xresult), Xresult'high, Xresult'low);
+ end if;
+ if guard_bits > 0 and round_style then
+ result := round_fixed (arg => Xresult (left_index
+ downto right_index),
+ remainder => Xresult (right_index-1 downto
+ right_index-guard_bits),
+ overflow_style => overflow_style);
+ else
+ result := Xresult (result'range);
+ end if;
+ return result;
+ end function to_sfixed;
+
+ function to_ufixed (
+ arg : UNSIGNED; -- unsigned
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER := 0; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding by default
+ return ufixed is
+ constant ARG_LEFT : INTEGER := ARG'length-1;
+ alias XARG : UNSIGNED(ARG_LEFT downto 0) is ARG;
+ constant fw : INTEGER := mine (right_index, right_index); -- catch literals
+ variable result : ufixed (left_index downto fw);
+ begin
+ if arg'length < 1 or (left_index < fw) then
+ return NAUF;
+ end if;
+ result := resize (arg => ufixed (XARG),
+ left_index => left_index,
+ right_index => right_index,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end function to_ufixed;
+
+ -- casted version
+ function to_ufixed (
+ arg : UNSIGNED) -- unsigned
+ return ufixed is
+ constant ARG_LEFT : INTEGER := ARG'length-1;
+ alias XARG : UNSIGNED(ARG_LEFT downto 0) is ARG;
+ begin
+ if arg'length < 1 then
+ return NAUF;
+ end if;
+ return ufixed(xarg);
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : SIGNED; -- signed
+ constant left_index : INTEGER; -- size of integer portion
+ constant right_index : INTEGER := 0; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding by default
+ return sfixed is
+ constant ARG_LEFT : INTEGER := ARG'length-1;
+ alias XARG : SIGNED(ARG_LEFT downto 0) is ARG;
+ constant fw : INTEGER := mine (right_index, right_index); -- catch literals
+ variable result : sfixed (left_index downto fw);
+ begin
+ if arg'length < 1 or (left_index < fw) then
+ return NASF;
+ end if;
+ result := resize (arg => sfixed (XARG),
+ left_index => left_index,
+ right_index => right_index,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end function to_sfixed;
+
+ -- casted version
+ function to_sfixed (
+ arg : SIGNED) -- signed
+ return sfixed is
+ constant ARG_LEFT : INTEGER := ARG'length-1;
+ alias XARG : SIGNED(ARG_LEFT downto 0) is ARG;
+ begin
+ if arg'length < 1 then
+ return NASF;
+ end if;
+ return sfixed(xarg);
+ end function to_sfixed;
+
+ function add_sign (arg : ufixed) return sfixed is
+ variable result : sfixed (arg'high+1 downto arg'low);
+ begin
+ if arg'length < 1 then
+ return NASF;
+ end if;
+ result (arg'high downto arg'low) := sfixed(cleanvec(arg));
+ result (arg'high+1) := '0';
+ return result;
+ end function add_sign;
+
+ -- Because of the farily complicated sizing rules in the fixed point
+ -- packages these functions are provided to compute the result ranges
+ -- Example:
+ -- signal uf1 : ufixed (3 downto -3);
+ -- signal uf2 : ufixed (4 downto -2);
+ -- signal uf1multuf2 : ufixed (ufixed_high (3, -3, '*', 4, -2) downto
+ -- ufixed_low (3, -3, '*', 4, -2));
+ -- uf1multuf2 <= uf1 * uf2;
+ -- Valid characters: '+', '-', '*', '/', 'r' or 'R' (rem), 'm' or 'M' (mod),
+ -- '1' (reciprocal), 'A', 'a' (abs), 'N', 'n' (-sfixed)
+ function ufixed_high (left_index, right_index : INTEGER;
+ operation : CHARACTER := 'X';
+ left_index2, right_index2 : INTEGER := 0)
+ return INTEGER is
+ begin
+ case operation is
+ when '+'| '-' => return maximum (left_index, left_index2) + 1;
+ when '*' => return left_index + left_index2 + 1;
+ when '/' => return left_index - right_index2;
+ when '1' => return -right_index; -- reciprocal
+ when 'R'|'r' => return mins (left_index, left_index2); -- "rem"
+ when 'M'|'m' => return mins (left_index, left_index2); -- "mod"
+ when others => return left_index; -- For abs and default
+ end case;
+ end function ufixed_high;
+
+ function ufixed_low (left_index, right_index : INTEGER;
+ operation : CHARACTER := 'X';
+ left_index2, right_index2 : INTEGER := 0)
+ return INTEGER is
+ begin
+ case operation is
+ when '+'| '-' => return mins (right_index, right_index2);
+ when '*' => return right_index + right_index2;
+ when '/' => return right_index - left_index2 - 1;
+ when '1' => return -left_index - 1; -- reciprocal
+ when 'R'|'r' => return mins (right_index, right_index2); -- "rem"
+ when 'M'|'m' => return mins (right_index, right_index2); -- "mod"
+ when others => return right_index; -- for abs and default
+ end case;
+ end function ufixed_low;
+
+ function sfixed_high (left_index, right_index : INTEGER;
+ operation : CHARACTER := 'X';
+ left_index2, right_index2 : INTEGER := 0)
+ return INTEGER is
+ begin
+ case operation is
+ when '+'| '-' => return maximum (left_index, left_index2) + 1;
+ when '*' => return left_index + left_index2 + 1;
+ when '/' => return left_index - right_index2 + 1;
+ when '1' => return -right_index + 1; -- reciprocal
+ when 'R'|'r' => return mins (left_index, left_index2); -- "rem"
+ when 'M'|'m' => return left_index2; -- "mod"
+ when 'A'|'a' => return left_index + 1; -- "abs"
+ when 'N'|'n' => return left_index + 1; -- -sfixed
+ when others => return left_index;
+ end case;
+ end function sfixed_high;
+
+ function sfixed_low (left_index, right_index : INTEGER;
+ operation : CHARACTER := 'X';
+ left_index2, right_index2 : INTEGER := 0)
+ return INTEGER is
+ begin
+ case operation is
+ when '+'| '-' => return mins (right_index, right_index2);
+ when '*' => return right_index + right_index2;
+ when '/' => return right_index - left_index2;
+ when '1' => return -left_index; -- reciprocal
+ when 'R'|'r' => return mins (right_index, right_index2); -- "rem"
+ when 'M'|'m' => return mins (right_index, right_index2); -- "mod"
+ when others => return right_index; -- default for abs, neg and default
+ end case;
+ end function sfixed_low;
+ -- Same as above, but using the "size_res" input only for their ranges:
+ -- signal uf1multuf2 : ufixed (ufixed_high (uf1, '*', uf2) downto
+ -- ufixed_low (uf1, '*', uf2));
+ -- uf1multuf2 <= uf1 * uf2;
+ function ufixed_high (size_res : ufixed;
+ operation : CHARACTER := 'X';
+ size_res2 : ufixed)
+ return INTEGER is
+ begin
+ return ufixed_high (left_index => size_res'high,
+ right_index => size_res'low,
+ operation => operation,
+ left_index2 => size_res2'high,
+ right_index2 => size_res2'low);
+ end function ufixed_high;
+ function ufixed_low (size_res : ufixed;
+ operation : CHARACTER := 'X';
+ size_res2 : ufixed)
+ return INTEGER is
+ begin
+ return ufixed_low (left_index => size_res'high,
+ right_index => size_res'low,
+ operation => operation,
+ left_index2 => size_res2'high,
+ right_index2 => size_res2'low);
+ end function ufixed_low;
+ function sfixed_high (size_res : sfixed;
+ operation : CHARACTER := 'X';
+ size_res2 : sfixed)
+ return INTEGER is
+ begin
+ return sfixed_high (left_index => size_res'high,
+ right_index => size_res'low,
+ operation => operation,
+ left_index2 => size_res2'high,
+ right_index2 => size_res2'low);
+ end function sfixed_high;
+ function sfixed_low (size_res : sfixed;
+ operation : CHARACTER := 'X';
+ size_res2 : sfixed)
+ return INTEGER is
+ begin
+ return sfixed_low (left_index => size_res'high,
+ right_index => size_res'low,
+ operation => operation,
+ left_index2 => size_res2'high,
+ right_index2 => size_res2'low);
+ end function sfixed_low;
+
+ -- purpose: returns a saturated number
+ function saturate (
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed is
+ constant sat : ufixed (left_index downto right_index) := (others => '1');
+ begin
+ return sat;
+ end function saturate;
+
+ -- purpose: returns a saturated number
+ function saturate (
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed is
+ variable sat : sfixed (left_index downto right_index) := (others => '1');
+ begin
+ -- saturate positive, to saturate negative, just do "not saturate()"
+ sat (left_index) := '0';
+ return sat;
+ end function saturate;
+
+ function saturate (
+ size_res : ufixed) -- only the size of this is used
+ return ufixed is
+ begin
+ return saturate (size_res'high, size_res'low);
+ end function saturate;
+
+ function saturate (
+ size_res : sfixed) -- only the size of this is used
+ return sfixed is
+ begin
+ return saturate (size_res'high, size_res'low);
+ end function saturate;
+
+ -- As a concession to those who use a graphical DSP environment,
+ -- these functions take parameters in those tools format and create
+ -- fixed point numbers. These functions are designed to convert from
+ -- a std_logic_vector to the VHDL fixed point format using the conventions
+ -- of these packages. In a pure VHDL environment you should use the
+ -- "to_ufixed" and "to_sfixed" routines.
+ -- Unsigned fixed point
+ function to_UFix (
+ arg : STD_LOGIC_VECTOR;
+ width : NATURAL; -- width of vector
+ fraction : NATURAL) -- width of fraction
+ return ufixed is
+ variable result : ufixed (width-fraction-1 downto -fraction);
+ begin
+ if (arg'length /= result'length) then
+ report "FIXED_GENERIC_PKG.TO_UFIX (STD_LOGIC_VECTOR) "
+ & "Vector lengths do not match. Input length is "
+ & INTEGER'image(arg'length) & " and output will be "
+ & INTEGER'image(result'length) & " wide."
+ severity error;
+ return NAUF;
+ else
+ result := to_ufixed (arg, result'high, result'low);
+ return result;
+ end if;
+ end function to_UFix;
+
+ -- signed fixed point
+ function to_SFix (
+ arg : STD_LOGIC_VECTOR;
+ width : NATURAL; -- width of vector
+ fraction : NATURAL) -- width of fraction
+ return sfixed is
+ variable result : sfixed (width-fraction-1 downto -fraction);
+ begin
+ if (arg'length /= result'length) then
+ report "FIXED_GENERIC_PKG.TO_SFIX (STD_LOGIC_VECTOR) "
+ & "Vector lengths do not match. Input length is "
+ & INTEGER'image(arg'length) & " and output will be "
+ & INTEGER'image(result'length) & " wide."
+ severity error;
+ return NASF;
+ else
+ result := to_sfixed (arg, result'high, result'low);
+ return result;
+ end if;
+ end function to_SFix;
+
+ -- finding the bounds of a number. These functions can be used like this:
+ -- signal xxx : ufixed (7 downto -3);
+ -- -- Which is the same as "ufixed (UFix_high (11,3) downto UFix_low(11,3))"
+ -- signal yyy : ufixed (UFix_high (11, 3, "+", 11, 3)
+ -- downto UFix_low(11, 3, "+", 11, 3));
+ -- Where "11" is the width of xxx (xxx'length),
+ -- and 3 is the lower bound (abs (xxx'low))
+ -- In a pure VHDL environment use "ufixed_high" and "ufixed_low"
+ function ufix_high (
+ width, fraction : NATURAL;
+ operation : CHARACTER := 'X';
+ width2, fraction2 : NATURAL := 0)
+ return INTEGER is
+ begin
+ return ufixed_high (left_index => width - 1 - fraction,
+ right_index => -fraction,
+ operation => operation,
+ left_index2 => width2 - 1 - fraction2,
+ right_index2 => -fraction2);
+ end function ufix_high;
+ function ufix_low (
+ width, fraction : NATURAL;
+ operation : CHARACTER := 'X';
+ width2, fraction2 : NATURAL := 0)
+ return INTEGER is
+ begin
+ return ufixed_low (left_index => width - 1 - fraction,
+ right_index => -fraction,
+ operation => operation,
+ left_index2 => width2 - 1 - fraction2,
+ right_index2 => -fraction2);
+ end function ufix_low;
+ function sfix_high (
+ width, fraction : NATURAL;
+ operation : CHARACTER := 'X';
+ width2, fraction2 : NATURAL := 0)
+ return INTEGER is
+ begin
+ return sfixed_high (left_index => width - fraction,
+ right_index => -fraction,
+ operation => operation,
+ left_index2 => width2 - fraction2,
+ right_index2 => -fraction2);
+ end function sfix_high;
+ function sfix_low (
+ width, fraction : NATURAL;
+ operation : CHARACTER := 'X';
+ width2, fraction2 : NATURAL := 0)
+ return INTEGER is
+ begin
+ return sfixed_low (left_index => width - fraction,
+ right_index => -fraction,
+ operation => operation,
+ left_index2 => width2 - fraction2,
+ right_index2 => -fraction2);
+ end function sfix_low;
+
+ function to_unsigned (
+ arg : ufixed; -- ufixed point input
+ constant size : NATURAL; -- length of output
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return UNSIGNED is
+ begin
+ return to_uns(resize (arg => arg,
+ left_index => size-1,
+ right_index => 0,
+ round_style => round_style,
+ overflow_style => overflow_style));
+ end function to_unsigned;
+
+ function to_unsigned (
+ arg : ufixed; -- ufixed point input
+ size_res : UNSIGNED; -- length of output
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return UNSIGNED is
+ begin
+ return to_unsigned (arg => arg,
+ size => size_res'length,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ end function to_unsigned;
+
+ function to_signed (
+ arg : sfixed; -- ufixed point input
+ constant size : NATURAL; -- length of output
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return SIGNED is
+ begin
+ return to_s(resize (arg => arg,
+ left_index => size-1,
+ right_index => 0,
+ round_style => round_style,
+ overflow_style => overflow_style));
+ end function to_signed;
+
+ function to_signed (
+ arg : sfixed; -- ufixed point input
+ size_res : SIGNED; -- used for length of output
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return SIGNED is
+ begin
+ return to_signed (arg => arg,
+ size => size_res'length,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ end function to_signed;
+
+ function to_real (
+ arg : ufixed) -- ufixed point input
+ return REAL is
+ constant left_index : INTEGER := arg'high;
+ constant right_index : INTEGER := arg'low;
+ variable result : REAL; -- result
+ variable arg_int : ufixed (left_index downto right_index);
+ begin
+ if (arg'length < 1) then
+ return 0.0;
+ end if;
+ arg_int := cleanvec(arg);
+ if (Is_X(arg_int)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.TO_REAL: metavalue detected, returning 0.0"
+ severity warning;
+ return 0.0;
+ end if;
+ result := 0.0;
+ for i in arg_int'range loop
+ if (arg_int(i) = '1') then
+ result := result + (2.0**i);
+ end if;
+ end loop;
+ return result;
+ end function to_real;
+
+ function to_real (
+ arg : sfixed) -- ufixed point input
+ return REAL is
+ constant left_index : INTEGER := arg'high;
+ constant right_index : INTEGER := arg'low;
+ variable result : REAL; -- result
+ variable arg_int : sfixed (left_index downto right_index);
+ -- unsigned version of argument
+ variable arg_uns : ufixed (left_index downto right_index);
+ -- absolute of argument
+ begin
+ if (arg'length < 1) then
+ return 0.0;
+ end if;
+ arg_int := cleanvec(arg);
+ if (Is_X(arg_int)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.TO_REAL: metavalue detected, returning 0.0"
+ severity warning;
+ return 0.0;
+ end if;
+ arg_uns := abs(arg_int);
+ result := to_real (arg_uns);
+ if (arg_int(arg_int'high) = '1') then
+ result := -result;
+ end if;
+ return result;
+ end function to_real;
+
+ function to_integer (
+ arg : ufixed; -- fixed point input
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return NATURAL is
+ constant left_index : INTEGER := arg'high;
+ variable arg_uns : UNSIGNED (minimum(31, left_index+1) downto 0)
+ := (others => '0');
+ begin
+ if (arg'length < 1) then
+ return 0;
+ end if;
+ if (Is_X (arg)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.TO_INTEGER: metavalue detected, returning 0"
+ severity warning;
+ return 0;
+ end if;
+ if (left_index < -1) then
+ return 0;
+ end if;
+ arg_uns := to_uns(resize (arg => arg,
+ left_index => arg_uns'high,
+ right_index => 0,
+ round_style => round_style,
+ overflow_style => overflow_style));
+ return to_integer (arg_uns);
+ end function to_integer;
+
+ function to_integer (
+ arg : sfixed; -- fixed point input
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding by default
+ return INTEGER is
+ constant left_index : INTEGER := arg'high;
+ constant right_index : INTEGER := arg'low;
+ variable arg_s : SIGNED (minimum(31, left_index+1) downto 0);
+ begin
+ if (arg'length < 1) then
+ return 0;
+ end if;
+ if (Is_X (arg)) then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.TO_INTEGER: metavalue detected, returning 0"
+ severity warning;
+ return 0;
+ end if;
+ if (left_index < -1) then
+ return 0;
+ end if;
+ arg_s := to_s(resize (arg => arg,
+ left_index => arg_s'high,
+ right_index => 0,
+ round_style => round_style,
+ overflow_style => overflow_style));
+ return to_integer (arg_s);
+ end function to_integer;
+
+ function to_01 (
+ s : ufixed; -- ufixed point input
+ constant XMAP : STD_LOGIC := '0') -- Map x to
+ return ufixed is
+ variable result : ufixed (s'range); -- result
+ begin
+ for i in s'range loop
+ case s(i) is
+ when '0' | 'L' => result(i) := '0';
+ when '1' | 'H' => result(i) := '1';
+ when others => result(i) := XMAP;
+ end case;
+ end loop;
+ return result;
+ end function to_01;
+
+ function to_01 (
+ s : sfixed; -- ufixed point input
+ constant XMAP : STD_LOGIC := '0') -- Map x to
+ return sfixed is
+ variable result : sfixed (s'range);
+ begin
+ for i in s'range loop
+ case s(i) is
+ when '0' | 'L' => result(i) := '0';
+ when '1' | 'H' => result(i) := '1';
+ when others => result(i) := XMAP;
+ end case;
+ end loop;
+ return result;
+ end function to_01;
+
+ function Is_X (
+ arg : ufixed)
+ return BOOLEAN is
+ variable argslv : STD_LOGIC_VECTOR (arg'length-1 downto 0); -- slv
+ begin
+ argslv := to_slv(arg);
+ return Is_X(argslv);
+ end function Is_X;
+
+ function Is_X (
+ arg : sfixed)
+ return BOOLEAN is
+ variable argslv : STD_LOGIC_VECTOR (arg'length-1 downto 0); -- slv
+ begin
+ argslv := to_slv(arg);
+ return Is_X(argslv);
+ end function Is_X;
+
+ function To_X01 (
+ arg : ufixed)
+ return ufixed is
+ begin
+ return to_ufixed (To_X01(to_slv(arg)), arg'high, arg'low);
+ end function To_X01;
+
+ function to_X01 (
+ arg : sfixed)
+ return sfixed is
+ begin
+ return to_sfixed (To_X01(to_slv(arg)), arg'high, arg'low);
+ end function To_X01;
+
+ function To_X01Z (
+ arg : ufixed)
+ return ufixed is
+ begin
+ return to_ufixed (To_X01Z(to_slv(arg)), arg'high, arg'low);
+ end function To_X01Z;
+
+ function to_X01Z (
+ arg : sfixed)
+ return sfixed is
+ begin
+ return to_sfixed (To_X01Z(to_slv(arg)), arg'high, arg'low);
+ end function To_X01Z;
+
+ function To_UX01 (
+ arg : ufixed)
+ return ufixed is
+ begin
+ return to_ufixed (To_UX01(to_slv(arg)), arg'high, arg'low);
+ end function To_UX01;
+
+ function to_UX01 (
+ arg : sfixed)
+ return sfixed is
+ begin
+ return to_sfixed (To_UX01(to_slv(arg)), arg'high, arg'low);
+ end function To_UX01;
+
+
+ function resize (
+ arg : ufixed; -- input
+ constant left_index : INTEGER; -- integer portion
+ constant right_index : INTEGER; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- overflow
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding
+ return ufixed is
+ constant arghigh : INTEGER := maximum (arg'high, arg'low);
+ constant arglow : INTEGER := mine (arg'high, arg'low);
+ variable invec : ufixed (arghigh downto arglow);
+ variable result : ufixed(left_index downto right_index) :=
+ (others => '0');
+ variable needs_rounding : BOOLEAN := false;
+ begin -- resize
+ if (arg'length < 1) or (result'length < 1) then
+ return NAUF;
+ elsif (invec'length < 1) then
+ return result; -- string literal value
+ else
+ invec := cleanvec(arg);
+ if (right_index > arghigh) then -- return top zeros
+ needs_rounding := (round_style = fixed_round) and
+ (right_index = arghigh+1);
+ elsif (left_index < arglow) then -- return overflow
+ if (overflow_style = fixed_saturate) and
+ (or_reducex(to_slv(invec)) = '1') then
+ result := saturate (result'high, result'low); -- saturate
+ end if;
+ elsif (arghigh > left_index) then
+ -- wrap or saturate?
+ if (overflow_style and
+ or_reducex(to_slv(invec(arghigh downto left_index+1))) = '1')
+ then
+ result := saturate (result'high, result'low); -- saturate
+ else
+ if (arglow >= right_index) then
+ result (left_index downto arglow) :=
+ invec(left_index downto arglow);
+ else
+ result (left_index downto right_index) :=
+ invec (left_index downto right_index);
+ needs_rounding := (round_style = fixed_round); -- round
+ end if;
+ end if;
+ else -- arghigh <= integer width
+ if (arglow >= right_index) then
+ result (arghigh downto arglow) := invec;
+ else
+ result (arghigh downto right_index) :=
+ invec (arghigh downto right_index);
+ needs_rounding := (round_style = fixed_round); -- round
+ end if;
+ end if;
+ -- Round result
+ if needs_rounding then
+ result := round_fixed (arg => result,
+ remainder => invec (right_index-1
+ downto arglow),
+ overflow_style => overflow_style);
+ end if;
+ return result;
+ end if;
+ end function resize;
+
+ function resize (
+ arg : sfixed; -- input
+ constant left_index : INTEGER; -- integer portion
+ constant right_index : INTEGER; -- size of fraction
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- overflow
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding
+ return sfixed is
+ constant arghigh : INTEGER := maximum (arg'high, arg'low);
+ constant arglow : INTEGER := mine (arg'high, arg'low);
+ variable invec : sfixed (arghigh downto arglow);
+ variable result : sfixed(left_index downto right_index) :=
+ (others => '0');
+ variable reduced : STD_ULOGIC;
+ variable needs_rounding : BOOLEAN := false; -- rounding
+ begin -- resize
+ if (arg'length < 1) or (result'length < 1) then
+ return NASF;
+ elsif (invec'length < 1) then
+ return result; -- string literal value
+ else
+ invec := cleanvec(arg);
+ if (right_index > arghigh) then -- return top zeros
+ if (arg'low /= INTEGER'low) then -- check for a literal
+ result := (others => arg(arghigh)); -- sign extend
+ end if;
+ needs_rounding := (round_style = fixed_round) and
+ (right_index = arghigh+1);
+ elsif (left_index < arglow) then -- return overflow
+ if (overflow_style) then
+ reduced := or_reducex(to_slv(invec));
+ if (reduced = '1') then
+ if (invec(arghigh) = '0') then
+ -- saturate POSITIVE
+ result := saturate (result'high, result'low);
+ else
+ -- saturate negative
+ result := not saturate (result'high, result'low);
+ end if;
+ -- else return 0 (input was 0)
+ end if;
+ -- else return 0 (wrap)
+ end if;
+ elsif (arghigh > left_index) then
+ if (invec(arghigh) = '0') then
+ reduced := or_reducex(to_slv(invec(arghigh-1 downto
+ left_index)));
+ if overflow_style and reduced = '1' then
+ -- saturate positive
+ result := saturate (result'high, result'low);
+ else
+ if (right_index > arglow) then
+ result := invec (left_index downto right_index);
+ needs_rounding := (round_style = fixed_round);
+ else
+ result (left_index downto arglow) :=
+ invec (left_index downto arglow);
+ end if;
+ end if;
+ else
+ reduced := and_reducex(to_slv(invec(arghigh-1 downto
+ left_index)));
+ if overflow_style and reduced = '0' then
+ result := not saturate (result'high, result'low);
+ else
+ if (right_index > arglow) then
+ result := invec (left_index downto right_index);
+ needs_rounding := (round_style = fixed_round);
+ else
+ result (left_index downto arglow) :=
+ invec (left_index downto arglow);
+ end if;
+ end if;
+ end if;
+ else -- arghigh <= integer width
+ if (arglow >= right_index) then
+ result (arghigh downto arglow) := invec;
+ else
+ result (arghigh downto right_index) :=
+ invec (arghigh downto right_index);
+ needs_rounding := (round_style = fixed_round); -- round
+ end if;
+ if (left_index > arghigh) then -- sign extend
+ result(left_index downto arghigh+1) := (others => invec(arghigh));
+ end if;
+ end if;
+ -- Round result
+ if (needs_rounding) then
+ result := round_fixed (arg => result,
+ remainder => invec (right_index-1
+ downto arglow),
+ overflow_style => overflow_style);
+ end if;
+ return result;
+ end if;
+ end function resize;
+
+ -- size_res functions
+ -- These functions compute the size from a passed variable named "size_res"
+ -- The only part of this variable used it it's size, it is never passed
+ -- to a lower level routine.
+ function to_ufixed (
+ arg : STD_LOGIC_VECTOR; -- shifted vector
+ size_res : ufixed) -- for size only
+ return ufixed is
+ variable result : ufixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_ufixed (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low);
+ return result;
+ end if;
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : STD_LOGIC_VECTOR; -- shifted vector
+ size_res : sfixed) -- for size only
+ return sfixed is
+ variable result : sfixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_sfixed (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low);
+ return result;
+ end if;
+ end function to_sfixed;
+
+ function to_ufixed (
+ arg : STD_ULOGIC_VECTOR; -- shifted vector
+ size_res : ufixed) -- for size only
+ return ufixed is
+ variable result : ufixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_ufixed (arg => to_stdlogicvector(arg),
+ left_index => size_res'high,
+ right_index => size_res'low);
+ return result;
+ end if;
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : STD_ULOGIC_VECTOR; -- shifted vector
+ size_res : sfixed) -- for size only
+ return sfixed is
+ variable result : sfixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_sfixed (arg => to_stdlogicvector(arg),
+ left_index => size_res'high,
+ right_index => size_res'low);
+ return result;
+ end if;
+ end function to_sfixed;
+
+ function to_ufixed (
+ arg : NATURAL; -- integer
+ size_res : ufixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding by default
+ return ufixed is
+ variable result : ufixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_ufixed (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end if;
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : INTEGER; -- integer
+ size_res : sfixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding by default
+ return sfixed is
+ variable result : sfixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_sfixed (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end if;
+ end function to_sfixed;
+
+ function to_ufixed (
+ arg : REAL; -- real
+ size_res : ufixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style; -- turn on rounding by default
+ constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
+ return ufixed is
+ variable result : ufixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_ufixed (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low,
+ guard_bits => guard_bits,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end if;
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : REAL; -- real
+ size_res : sfixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style; -- turn on rounding by default
+ constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
+ return sfixed is
+ variable result : sfixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_sfixed (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low,
+ guard_bits => guard_bits,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end if;
+ end function to_sfixed;
+
+ function to_ufixed (
+ arg : UNSIGNED; -- unsigned
+ size_res : ufixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- overflow
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding
+ return ufixed is
+ variable result : ufixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_ufixed (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end if;
+ end function to_ufixed;
+
+ function to_sfixed (
+ arg : SIGNED; -- signed
+ size_res : sfixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- saturate by default
+ constant round_style : BOOLEAN := fixed_round_style) -- turn on rounding by default
+ return sfixed is
+ variable result : sfixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_sfixed (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end if;
+ end function to_sfixed;
+
+ function resize (
+ arg : ufixed; -- input
+ size_res : ufixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- overflow
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding
+ return ufixed is
+ variable result : ufixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := resize (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end if;
+ end function resize;
+
+ function resize (
+ arg : sfixed; -- input
+ size_res : sfixed; -- for size only
+ constant overflow_style : BOOLEAN := fixed_overflow_style; -- overflow
+ constant round_style : BOOLEAN := fixed_round_style) -- rounding
+ return sfixed is
+ variable result : sfixed (size_res'left downto size_res'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := resize (arg => arg,
+ left_index => size_res'high,
+ right_index => size_res'low,
+ round_style => round_style,
+ overflow_style => overflow_style);
+ return result;
+ end if;
+ end function resize;
+
+ -- Overloaded functions
+ function "+" (
+ l : ufixed; -- fixed point input
+ r : REAL)
+ return ufixed is
+ begin
+ return (l +
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "+";
+
+ function "+" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ + r);
+ end function "+";
+
+ function "+" (
+ l : sfixed; -- fixed point input
+ r : REAL)
+ return sfixed is
+ begin
+ return (l +
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "+";
+
+ function "+" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ + r);
+ end function "+";
+
+ -- Overloaded functions
+ function "-" (
+ l : ufixed; -- fixed point input
+ r : REAL)
+ return ufixed is
+ begin
+ return (l -
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "-";
+
+ function "-" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ - r);
+ end function "-";
+
+ function "-" (
+ l : sfixed; -- fixed point input
+ r : REAL)
+ return sfixed is
+ begin
+ return (l -
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "-";
+
+ function "-" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ - r);
+ end function "-";
+
+ -- Overloaded functions
+ function "*" (
+ l : ufixed; -- fixed point input
+ r : REAL)
+ return ufixed is
+ begin
+ return (l *
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "*";
+
+ function "*" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ * r);
+ end function "*";
+
+ function "*" (
+ l : sfixed; -- fixed point input
+ r : REAL)
+ return sfixed is
+ begin
+ return (l *
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "*";
+
+ function "*" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ * r);
+ end function "*";
+
+ -- Overloaded functions
+ function "/" (
+ l : ufixed; -- fixed point input
+ r : REAL)
+ return ufixed is
+ begin
+ return (l /
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "/";
+
+ function "/" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ / r);
+ end function "/";
+
+ function "/" (
+ l : sfixed; -- fixed point input
+ r : REAL)
+ return sfixed is
+ begin
+ return (l /
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "/";
+
+ function "/" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ / r);
+ end function "/";
+
+ -- Overloaded functions
+ function "rem" (
+ l : ufixed; -- fixed point input
+ r : REAL)
+ return ufixed is
+ begin
+ return (l rem
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "rem";
+
+ function "rem" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ rem r);
+ end function "rem";
+
+ function "rem" (
+ l : sfixed; -- fixed point input
+ r : REAL)
+ return sfixed is
+ begin
+ return (l rem
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "rem";
+
+ function "rem" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ rem r);
+ end function "rem";
+
+ function "mod" (
+ l : ufixed; -- fixed point input
+ r : REAL)
+ return ufixed is
+ begin
+ return (l mod
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "mod";
+
+ function "mod" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ mod r);
+ end function "mod";
+
+ function "mod" (
+ l : sfixed; -- fixed point input
+ r : REAL)
+ return sfixed is
+ begin
+ return (l mod
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "mod";
+
+ function "mod" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ mod r);
+ end function "mod";
+
+ -- Overloaded functions for integers
+ function "+" (
+ l : ufixed; -- fixed point input
+ r : NATURAL)
+ return ufixed is
+ begin
+ return (l + to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)); -- rounding not needed
+ end function "+";
+
+ function "+" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ + r);
+ end function "+";
+
+ function "+" (
+ l : sfixed; -- fixed point input
+ r : INTEGER)
+ return sfixed is
+ begin
+ return (l + to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "+";
+
+ function "+" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ + r);
+ end function "+";
+
+ -- Overloaded functions
+ function "-" (
+ l : ufixed; -- fixed point input
+ r : NATURAL)
+ return ufixed is
+ begin
+ return (l - to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "-";
+
+ function "-" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ - r);
+ end function "-";
+
+ function "-" (
+ l : sfixed; -- fixed point input
+ r : INTEGER)
+ return sfixed is
+ begin
+ return (l - to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "-";
+
+ function "-" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ - r);
+ end function "-";
+
+ -- Overloaded functions
+ function "*" (
+ l : ufixed; -- fixed point input
+ r : NATURAL)
+ return ufixed is
+ begin
+ return (l * to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "*";
+
+ function "*" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ * r);
+ end function "*";
+
+ function "*" (
+ l : sfixed; -- fixed point input
+ r : INTEGER)
+ return sfixed is
+ begin
+ return (l * to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "*";
+
+ function "*" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ * r);
+ end function "*";
+
+ -- Overloaded functions
+ function "/" (
+ l : ufixed; -- fixed point input
+ r : NATURAL)
+ return ufixed is
+ begin
+ return (l / to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "/";
+
+ function "/" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ / r);
+ end function "/";
+
+ function "/" (
+ l : sfixed; -- fixed point input
+ r : INTEGER)
+ return sfixed is
+ begin
+ return (l / to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "/";
+
+ function "/" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ / r);
+ end function "/";
+
+ -- Overloaded functions
+ function "rem" (
+ l : ufixed; -- fixed point input
+ r : NATURAL)
+ return ufixed is
+ begin
+ return (l rem to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "rem";
+
+ function "rem" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ rem r);
+ end function "rem";
+
+ function "rem" (
+ l : sfixed; -- fixed point input
+ r : INTEGER)
+ return sfixed is
+ begin
+ return (l rem to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "rem";
+
+ function "rem" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ rem r);
+ end function "rem";
+
+ function "mod" (
+ l : ufixed; -- fixed point input
+ r : NATURAL)
+ return ufixed is
+ begin
+ return (l mod to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "mod";
+
+ function "mod" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return ufixed is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ mod r);
+ end function "mod";
+
+ function "mod" (
+ l : sfixed; -- fixed point input
+ r : INTEGER)
+ return sfixed is
+ begin
+ return (l mod to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "mod";
+
+ function "mod" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return sfixed is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ mod r);
+ end function "mod";
+
+ -- overloaded compare functions
+ function "=" (
+ l : ufixed;
+ r : NATURAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l = to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "=";
+
+ function "/=" (
+ l : ufixed;
+ r : NATURAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l /= to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "/=";
+
+ function ">=" (
+ l : ufixed;
+ r : NATURAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l >= to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function ">=";
+
+ function "<=" (
+ l : ufixed;
+ r : NATURAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l <= to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "<=";
+
+ function ">" (
+ l : ufixed;
+ r : NATURAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l > to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function ">";
+
+ function "<" (
+ l : ufixed;
+ r : NATURAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l < to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "<";
+
+ function "=" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ = r);
+ end function "=";
+
+ function "/=" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ /= r);
+ end function "/=";
+
+ function ">=" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ >= r);
+ end function ">=";
+
+ function "<=" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ <= r);
+ end function "<=";
+
+ function ">" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ > r);
+ end function ">";
+
+ function "<" (
+ l : NATURAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ < r);
+ end function "<";
+
+ function "=" (
+ l : ufixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l =
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "=";
+
+ function "/=" (
+ l : ufixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l /=
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "/=";
+
+ function ">=" (
+ l : ufixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l >=
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function ">=";
+
+ function "<=" (
+ l : ufixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l <=
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "<=";
+
+ function ">" (
+ l : ufixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l >
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function ">";
+
+ function "<" (
+ l : ufixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l <
+ to_ufixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "<";
+
+ function "=" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ = r);
+ end function "=";
+
+ function "/=" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ /= r);
+ end function "/=";
+
+ function ">=" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ >= r);
+ end function ">=";
+
+ function "<=" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ <= r);
+ end function "<=";
+
+ function ">" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ > r);
+ end function ">";
+
+ function "<" (
+ l : REAL;
+ r : ufixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_ufixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ < r);
+ end function "<";
+
+ function "=" (
+ l : sfixed;
+ r : INTEGER) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l = to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "=";
+
+ function "/=" (
+ l : sfixed;
+ r : INTEGER) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l /= to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "/=";
+
+ function ">=" (
+ l : sfixed;
+ r : INTEGER) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l >= to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function ">=";
+
+ function "<=" (
+ l : sfixed;
+ r : INTEGER) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l <= to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "<=";
+
+ function ">" (
+ l : sfixed;
+ r : INTEGER) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l > to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function ">";
+
+ function "<" (
+ l : sfixed;
+ r : INTEGER) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l < to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style));
+ end function "<";
+
+ function "=" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ = r);
+ end function "=";
+
+ function "/=" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ /= r);
+ end function "/=";
+
+ function ">=" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ >= r);
+ end function ">=";
+
+ function "<=" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ <= r);
+ end function "<=";
+
+ function ">" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ > r);
+ end function ">";
+
+ function "<" (
+ l : INTEGER;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style)
+ < r);
+ end function "<";
+
+ function "=" (
+ l : sfixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l =
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "=";
+
+ function "/=" (
+ l : sfixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l /=
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "/=";
+
+ function ">=" (
+ l : sfixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l >=
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function ">=";
+
+ function "<=" (
+ l : sfixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l <=
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "<=";
+
+ function ">" (
+ l : sfixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l >
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function ">";
+
+ function "<" (
+ l : sfixed;
+ r : REAL) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (l <
+ to_sfixed (arg => r,
+ left_index => l'high,
+ right_index => l'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits));
+ end function "<";
+
+ function "=" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ = r);
+ end function "=";
+
+ function "/=" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ /= r);
+ end function "/=";
+
+ function ">=" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ >= r);
+ end function ">=";
+
+ function "<=" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ <= r);
+ end function "<=";
+
+ function ">" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ > r);
+ end function ">";
+
+ function "<" (
+ l : REAL;
+ r : sfixed) -- fixed point input
+ return BOOLEAN is
+ begin
+ return (to_sfixed (arg => l,
+ left_index => r'high,
+ right_index => r'low,
+ overflow_style => fixed_overflow_style,
+ round_style => fixed_round_style,
+ guard_bits => fixed_guard_bits)
+ < r);
+ end function "<";
+
+ -- rtl_synthesis off
+ -- synthesis translate_off
+ -- copied from std_logic_textio
+ type MVL9plus is ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-', error);
+ type char_indexed_by_MVL9 is array (STD_ULOGIC) of CHARACTER;
+ type MVL9_indexed_by_char is array (CHARACTER) of STD_ULOGIC;
+ type MVL9plus_indexed_by_char is array (CHARACTER) of MVL9plus;
+
+ constant MVL9_to_char : char_indexed_by_MVL9 := "UX01ZWLH-";
+ constant char_to_MVL9 : MVL9_indexed_by_char :=
+ ('U' => 'U', 'X' => 'X', '0' => '0', '1' => '1', 'Z' => 'Z',
+ 'W' => 'W', 'L' => 'L', 'H' => 'H', '-' => '-', others => 'U');
+ constant char_to_MVL9plus : MVL9plus_indexed_by_char :=
+ ('U' => 'U', 'X' => 'X', '0' => '0', '1' => '1', 'Z' => 'Z',
+ 'W' => 'W', 'L' => 'L', 'H' => 'H', '-' => '-', others => error);
+ constant NBSP : CHARACTER := CHARACTER'val(160); -- space character
+ constant NUS : STRING(2 to 1) := (others => ' ');
+
+ -- purpose: writes fixed point into a line
+ procedure write (
+ L : inout LINE; -- input line
+ VALUE : in ufixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0) is
+ variable s : STRING(1 to value'length +1) := (others => ' ');
+ variable sindx : INTEGER;
+ begin -- function write Example: 0011.1100
+ sindx := 1;
+ for i in value'high downto value'low loop
+ if i = -1 then
+ s(sindx) := '.';
+ sindx := sindx +1;
+ end if;
+ s(sindx) := MVL9_to_char(STD_ULOGIC(value(i)));
+ sindx := sindx +1;
+ end loop;
+ write(l, s, justified, field);
+ end procedure write;
+
+ -- purpose: writes fixed point into a line
+ procedure write (
+ L : inout LINE; -- input line
+ VALUE : in sfixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0) is
+ variable s : STRING(1 to value'length +1);
+ variable sindx : INTEGER;
+ begin -- function write Example: 0011.1100
+ sindx := 1;
+ for i in value'high downto value'low loop
+ if i = -1 then
+ s(sindx) := '.';
+ sindx := sindx +1;
+ end if;
+ s(sindx) := MVL9_to_char(STD_ULOGIC(value(i)));
+ sindx := sindx +1;
+ end loop;
+ write(l, s, justified, field);
+ end procedure write;
+
+ procedure READ(L : inout LINE;
+ VALUE : out ufixed) is
+ -- Possible data: 00000.0000000
+ -- 000000000000
+ variable c : CHARACTER;
+ variable s : STRING(1 to value'length-1);
+ variable readOk : BOOLEAN;
+ variable i : INTEGER; -- index variable
+ begin -- READ
+ VALUE (VALUE'range) := (others => 'U');
+ loop -- skip white space
+ read(l, c, readOk);
+ exit when (readOk = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ i := value'high;
+ readloop : loop
+ if readOk = false then -- Bail out if there was a bad read
+ report "FIXED_GENERIC_PKG.READ(ufixed) "
+ & "Error: end of string encountered"
+ severity error;
+ return;
+ elsif c = ' ' or c = NBSP or c = HT then -- reading done.
+ assert i = value'low
+ report "FIXED_GENERIC_PKG.READ(ufixed) "
+ & "Warning: Value truncated " severity warning;
+ return;
+ elsif c = '.' then -- separator, ignore
+ assert (i = -1)
+ report "FIXED_GENERIC_PKG.READ(ufixed) "
+ & "Warning: Decimal point does not match number format "
+ severity warning;
+ elsif (char_to_MVL9plus(c) = error) then
+ report "FIXED_GENERIC_PKG.READ(ufixed) "
+ & "Error: Character '" & c & "' read, expected STD_ULOGIC literal."
+ severity error;
+ return;
+ else
+ value (i) := char_to_MVL9(c);
+ i := i - 1;
+ if i < value'low then
+ return;
+ end if;
+ end if;
+ read(l, c, readOk);
+ end loop readloop;
+ end procedure READ;
+
+ procedure READ(L : inout LINE;
+ VALUE : out ufixed;
+ GOOD : out BOOLEAN) is
+ -- Possible data: 00000.0000000
+ -- 000000000000
+ variable c : CHARACTER;
+ variable i : INTEGER; -- index variable
+ variable readOk : BOOLEAN;
+ begin -- READ
+ VALUE (VALUE'range) := (others => 'U');
+ loop -- skip white space
+ read(l, c, readOk);
+ exit when (readOk = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ i := value'high;
+ good := true;
+ readloop : loop
+ if readOk = false then -- Bail out if there was a bad read
+ good := false;
+ return;
+ elsif c = ' ' or c = NBSP or c = HT then -- reading done
+ good := false;
+ return;
+ elsif c = '.' then -- separator, ignore
+ good := (i = -1);
+ elsif (char_to_MVL9plus(c) = error) then
+ good := false;
+ return;
+ else
+ value (i) := char_to_MVL9(c);
+ i := i - 1;
+ if i < value'low then
+ return;
+ end if;
+ end if;
+ read(l, c, readOk);
+ end loop readloop;
+ end procedure READ;
+
+ procedure READ(L : inout LINE;
+ VALUE : out sfixed) is
+ -- Possible data: 00000.0000000
+ -- 000000000000
+ variable c : CHARACTER;
+ variable readOk : BOOLEAN;
+ variable i : INTEGER; -- index variable
+ begin -- READ
+ VALUE (VALUE'range) := (others => 'U');
+ loop -- skip white space
+ read(l, c, readOk);
+ exit when (readOk = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ i := value'high;
+ readloop : loop
+ if readOk = false then -- Bail out if there was a bad read
+ report "FIXED_GENERIC_PKG.READ(sfixed) "
+ & "Error end of string encountered"
+ severity error;
+ return;
+ elsif c = ' ' or c = NBSP or c = HT then -- reading done.
+ assert i = value'low
+ report "FIXED_GENERIC_PKG.READ(sfixed) "
+ & "Warning: Value truncated " severity warning;
+ return;
+ elsif c = '.' then -- separator, ignore
+ assert (i = -1)
+ report "FIXED_GENERIC_PKG.READ(sfixed) "
+ & "Warning: Decimal point does not match number format "
+ severity warning;
+ elsif (char_to_MVL9plus(c) = error) then
+ report "FIXED_GENERIC_PKG.READ(sfixed) "
+ & "Error: Character '" & c & "' read, expected STD_ULOGIC literal."
+ severity error;
+ return;
+ else
+ value (i) := char_to_MVL9(c);
+ i := i - 1;
+ if i < value'low then
+ return;
+ end if;
+ end if;
+ read(l, c, readOk);
+ end loop readloop;
+ end procedure READ;
+
+ procedure READ(L : inout LINE;
+ VALUE : out sfixed;
+ GOOD : out BOOLEAN) is
+ -- Possible data: 00000.0000000
+ -- 000000000000
+ variable c : CHARACTER;
+ variable i : INTEGER; -- index variable
+ variable readOk : BOOLEAN;
+ begin -- READ
+ VALUE (VALUE'range) := (others => 'U');
+ loop -- skip white space
+ read(l, c, readOk);
+ exit when (readOk = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ i := value'high;
+ good := true;
+ readloop : loop
+ if readOk = false then -- Bail out if there was a bad read
+ good := false;
+ return;
+ elsif c = ' ' or c = NBSP or c = HT then -- reading done
+ good := false;
+ return;
+ elsif c = '.' then -- separator, ignore
+ good := (i = -1);
+ elsif (char_to_MVL9plus(c) = error) then
+ good := false;
+ return;
+ else
+ value (i) := char_to_MVL9(c);
+ i := i - 1;
+ if i < value'low then
+ return;
+ end if;
+ end if;
+ read(l, c, readOk);
+ end loop readloop;
+ end procedure READ;
+
+ -- octal read and write
+ procedure owrite (
+ L : inout LINE; -- input line
+ VALUE : in ufixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0) is
+ begin -- Example 03.30
+ write (L => L,
+ VALUE => to_ostring (VALUE),
+ JUSTIFIED => JUSTIFIED,
+ FIELD => FIELD);
+ end procedure owrite;
+
+ procedure owrite (
+ L : inout LINE; -- input line
+ VALUE : in sfixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0) is
+ begin -- Example 03.30
+ write (L => L,
+ VALUE => to_ostring (VALUE),
+ JUSTIFIED => JUSTIFIED,
+ FIELD => FIELD);
+ end procedure owrite;
+
+ procedure Char2TriBits (C : CHARACTER;
+ RESULT : out STD_LOGIC_VECTOR(2 downto 0);
+ GOOD : out BOOLEAN;
+ ISSUE_ERROR : in BOOLEAN) is
+ begin
+ case c is
+ when '0' => result := o"0"; good := true;
+ when '1' => result := o"1"; good := true;
+ when '2' => result := o"2"; good := true;
+ when '3' => result := o"3"; good := true;
+ when '4' => result := o"4"; good := true;
+ when '5' => result := o"5"; good := true;
+ when '6' => result := o"6"; good := true;
+ when '7' => result := o"7"; good := true;
+ when 'Z' => result := "ZZZ"; good := true;
+ when 'X' => result := "XXX"; good := true;
+ when others =>
+ assert not ISSUE_ERROR
+ report
+ "FIXED_GENERIC_PKG.OREAD Error: Read a '" & c &
+ "', expected an Octal character (0-7)."
+ severity error;
+ result := "UUU";
+ good := false;
+ end case;
+ end procedure Char2TriBits;
+
+ -- Note that for Octal and Hex read, you can not start with a ".",
+ -- the read is for numbers formatted "A.BC". These routines go to
+ -- the nearest bounds, so "F.E" will fit into an sfixed (2 downto -3).
+ procedure OREAD(L : inout LINE;
+ VALUE : out ufixed) is
+ constant hbv : INTEGER := (((maximum(3, (VALUE'high+1))+2)/3)*3)-1;
+ constant lbv : INTEGER := ((mine(-3, VALUE'low)-2)/3)*3;
+ variable slv : STD_LOGIC_VECTOR (hbv-lbv downto 0); -- high bits
+ variable c : CHARACTER; -- to read the "."
+ variable valuex : ufixed (hbv downto lbv);
+ variable igood : BOOLEAN;
+ variable nybble : STD_LOGIC_VECTOR (2 downto 0); -- 3 bits
+ variable i : INTEGER;
+ begin
+ VALUE (VALUE'range) := (others => 'U'); -- initialize to a "U"
+ loop -- skip white space
+ read(L, c, igood);
+ exit when (igood = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ if igood = false then
+ report "FIXED_GENERIC_PKG.OREAD(ufixed): "
+ & "Error end of string encountered"
+ severity error;
+ return;
+ else
+ Char2triBits(c, nybble, igood, true);
+ i := hbv-lbv - 3; -- Top - 3
+ slv (hbv-lbv downto i+1) := nybble;
+ end if;
+ while (i /= -1) and igood and L.all'length /= 0 loop
+ read (L, c, igood);
+ if igood = false then
+ report "FIXED_GENERIC_PKG.OREAD(ufixed): "
+ & "Error end of string encountered"
+ severity error;
+ elsif (c = '.') then
+ if (i + 1 /= -lbv) then
+ igood := false;
+ report "FIXED_GENERIC_PKG.OREAD(ufixed): "
+ & "encountered ""."" at wrong index"
+ severity error;
+ end if;
+ else
+ Char2TriBits(c, nybble, igood, true);
+ slv (i downto i-2) := nybble;
+ i := i - 3;
+ end if;
+ end loop;
+ if igood then -- We did not get another error
+ assert (i = -1) and -- We read everything, and high bits 0
+ (or_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '0')
+ report "FIXED_GENERIC_PKG.OREAD(ufixed): Vector truncated."
+ severity error;
+ if (or_reducex(slv(VALUE'low-lbv-1 downto 0)) = '1') then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.OREAD(ufixed): Vector truncated"
+ severity warning;
+ end if;
+ end if;
+ valuex := to_ufixed (slv, hbv, lbv);
+ VALUE := valuex (VALUE'range);
+ end procedure OREAD;
+
+ procedure OREAD(L : inout LINE;
+ VALUE : out ufixed;
+ GOOD : out BOOLEAN) is
+ constant hbv : INTEGER := (((maximum(3, (VALUE'high+1))+2)/3)*3)-1;
+ constant lbv : INTEGER := ((mine(-3, VALUE'low)-2)/3)*3;
+ variable slv : STD_LOGIC_VECTOR (hbv-lbv downto 0); -- high bits
+ variable c : CHARACTER; -- to read the "."
+ variable valuex : ufixed (hbv downto lbv);
+ variable igood : BOOLEAN;
+ variable nybble : STD_LOGIC_VECTOR (2 downto 0); -- 3 bits
+ variable i : INTEGER;
+ begin
+ VALUE (VALUE'range) := (others => 'U'); -- initialize to a "U"
+ loop -- skip white space
+ read(L, c, igood);
+ exit when (igood = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ if igood = false then
+ return;
+ else
+ Char2triBits(c, nybble, igood, false);
+ i := hbv-lbv - 3; -- Top - 3
+ slv (hbv-lbv downto i+1) := nybble;
+ end if;
+ while (i /= -1) and igood and L.all'length /= 0 loop
+ read (L, c, igood);
+ if igood then
+ if (c = '.') then
+ igood := igood and (i + 1 = -lbv);
+ else
+ Char2TriBits(c, nybble, igood, false);
+ slv (i downto i-2) := nybble;
+ i := i - 3;
+ end if;
+ end if;
+ end loop;
+ good := igood and -- We did not get another error
+ (i = -1) and -- We read everything, and high bits 0
+ (or_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '0');
+ valuex := to_ufixed (slv, hbv, lbv);
+ VALUE := valuex (VALUE'range);
+ end procedure OREAD;
+
+ procedure OREAD(L : inout LINE;
+ VALUE : out sfixed) is
+ constant hbv : INTEGER := (((maximum(3, (VALUE'high+1))+2)/3)*3)-1;
+ constant lbv : INTEGER := ((mine(-3, VALUE'low)-2)/3)*3;
+ variable slv : STD_LOGIC_VECTOR (hbv-lbv downto 0); -- high bits
+ variable c : CHARACTER; -- to read the "."
+ variable valuex : sfixed (hbv downto lbv);
+ variable igood : BOOLEAN;
+ variable nybble : STD_LOGIC_VECTOR (2 downto 0); -- 3 bits
+ variable i : INTEGER;
+ begin
+ VALUE (VALUE'range) := (others => 'U'); -- initialize to a "U"
+ loop -- skip white space
+ read(L, c, igood);
+ exit when (igood = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ if igood = false then
+ report "FIXED_GENERIC_PKG.OREAD(sfixed): "
+ & "Error end of string encountered"
+ severity error;
+ return;
+ else
+ Char2triBits(c, nybble, igood, true);
+ i := hbv-lbv - 3; -- Top - 3
+ slv (hbv-lbv downto i+1) := nybble;
+ end if;
+ while (i /= -1) and igood and L.all'length /= 0 loop
+ read (L, c, igood);
+ if igood = false then
+ report "FIXED_GENERIC_PKG.OREAD(sfixed): "
+ & "Error end of string encountered"
+ severity error;
+ elsif (c = '.') then
+ if (i + 1 /= -lbv) then
+ igood := false;
+ report "FIXED_GENERIC_PKG.OREAD(sfixed): "
+ & "encountered ""."" at wrong index"
+ severity error;
+ end if;
+ else
+ Char2TriBits(c, nybble, igood, true);
+ slv (i downto i-2) := nybble;
+ i := i - 3;
+ end if;
+ end loop;
+ if igood then -- We did not get another error
+ assert (i = -1) and -- We read everything
+ ((slv(VALUE'high-lbv) = '0' and -- sign bits = extra bits
+ or_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '0') or
+ (slv(VALUE'high-lbv) = '1' and
+ and_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '1'))
+ report "FIXED_GENERIC_PKG.OREAD(sfixed): Vector truncated."
+ severity error;
+ if (or_reducex(slv(VALUE'low-lbv-1 downto 0)) = '1') then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.OREAD(sfixed): Vector truncated"
+ severity warning;
+ end if;
+ end if;
+ valuex := to_sfixed (slv, hbv, lbv);
+ VALUE := valuex (VALUE'range);
+ end procedure OREAD;
+
+ procedure OREAD(L : inout LINE;
+ VALUE : out sfixed;
+ GOOD : out BOOLEAN) is
+ constant hbv : INTEGER := (((maximum(3, (VALUE'high+1))+2)/3)*3)-1;
+ constant lbv : INTEGER := ((mine(-3, VALUE'low)-2)/3)*3;
+ variable slv : STD_LOGIC_VECTOR (hbv-lbv downto 0); -- high bits
+ variable c : CHARACTER; -- to read the "."
+ variable valuex : sfixed (hbv downto lbv);
+ variable igood : BOOLEAN;
+ variable nybble : STD_LOGIC_VECTOR (2 downto 0); -- 3 bits
+ variable i : INTEGER;
+ begin
+ VALUE (VALUE'range) := (others => 'U'); -- initialize to a "U"
+ loop -- skip white space
+ read(L, c, igood);
+ exit when (igood = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ if igood = false then
+ return;
+ else
+ Char2triBits(c, nybble, igood, false);
+ i := hbv-lbv - 3; -- Top - 3
+ slv (hbv-lbv downto i+1) := nybble;
+ end if;
+ while (i /= -1) and igood and L.all'length /= 0 loop
+ read (L, c, igood);
+ if igood then
+ if (c = '.') then
+ igood := igood and (i + 1 = -lbv);
+ else
+ Char2TriBits(c, nybble, igood, false);
+ slv (i downto i-2) := nybble;
+ i := i - 3;
+ end if;
+ end if;
+ end loop;
+ good := igood -- We did not get another error
+ and (i = -1) -- We read everything
+ and ((slv(VALUE'high-lbv) = '0' and -- sign bits = extra bits
+ or_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '0') or
+ (slv(VALUE'high-lbv) = '1' and
+ and_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '1'));
+ valuex := to_sfixed (slv, hbv, lbv);
+ VALUE := valuex (VALUE'range);
+ end procedure OREAD;
+
+ -- hex read and write
+ procedure hwrite (
+ L : inout LINE; -- input line
+ VALUE : in ufixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0) is
+ begin -- Example 03.30
+ write (L => L,
+ VALUE => to_hstring (VALUE),
+ JUSTIFIED => JUSTIFIED,
+ FIELD => FIELD);
+ end procedure hwrite;
+
+ -- purpose: writes fixed point into a line
+ procedure hwrite (
+ L : inout LINE; -- input line
+ VALUE : in sfixed; -- fixed point input
+ JUSTIFIED : in SIDE := right;
+ FIELD : in WIDTH := 0) is
+ begin -- Example 03.30
+ write (L => L,
+ VALUE => to_hstring (VALUE),
+ JUSTIFIED => JUSTIFIED,
+ FIELD => FIELD);
+ end procedure hwrite;
+
+ -- Hex Read and Write procedures for STD_ULOGIC_VECTOR.
+ -- Modified from the original to be more forgiving.
+
+ procedure Char2QuadBits (C : CHARACTER;
+ RESULT : out STD_LOGIC_VECTOR(3 downto 0);
+ GOOD : out BOOLEAN;
+ ISSUE_ERROR : in BOOLEAN) is
+ begin
+ case c is
+ when '0' => result := x"0"; good := true;
+ when '1' => result := x"1"; good := true;
+ when '2' => result := x"2"; good := true;
+ when '3' => result := x"3"; good := true;
+ when '4' => result := x"4"; good := true;
+ when '5' => result := x"5"; good := true;
+ when '6' => result := x"6"; good := true;
+ when '7' => result := x"7"; good := true;
+ when '8' => result := x"8"; good := true;
+ when '9' => result := x"9"; good := true;
+ when 'A' | 'a' => result := x"A"; good := true;
+ when 'B' | 'b' => result := x"B"; good := true;
+ when 'C' | 'c' => result := x"C"; good := true;
+ when 'D' | 'd' => result := x"D"; good := true;
+ when 'E' | 'e' => result := x"E"; good := true;
+ when 'F' | 'f' => result := x"F"; good := true;
+ when 'Z' => result := "ZZZZ"; good := true;
+ when 'X' => result := "XXXX"; good := true;
+ when others =>
+ assert not ISSUE_ERROR
+ report
+ "FIXED_GENERIC_PKG.HREAD Error: Read a '" & c &
+ "', expected a Hex character (0-F)."
+ severity error;
+ result := "UUUU";
+ good := false;
+ end case;
+ end procedure Char2QuadBits;
+
+ procedure HREAD(L : inout LINE;
+ VALUE : out ufixed) is
+ constant hbv : INTEGER := (((maximum(4, (VALUE'high+1))+3)/4)*4)-1;
+ constant lbv : INTEGER := ((mine(-4, VALUE'low)-3)/4)*4;
+ variable slv : STD_LOGIC_VECTOR (hbv-lbv downto 0); -- high bits
+ variable c : CHARACTER; -- to read the "."
+ variable valuex : ufixed (hbv downto lbv);
+ variable igood : BOOLEAN;
+ variable nybble : STD_LOGIC_VECTOR (3 downto 0); -- 4 bits
+ variable i : INTEGER;
+ begin
+ VALUE (VALUE'range) := (others => 'U'); -- initialize to a "U"
+ loop -- skip white space
+ read(L, c, igood);
+ exit when (igood = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ if igood = false then
+ report "FIXED_GENERIC_PKG.HREAD(ufixed): "
+ & "Error end of string encountered"
+ severity error;
+ return;
+ else
+ Char2QuadBits(c, nybble, igood, true);
+ i := hbv-lbv - 4; -- Top - 4
+ slv (hbv-lbv downto i+1) := nybble;
+ end if;
+ while (i /= -1) and igood and L.all'length /= 0 loop
+ read (L, c, igood);
+ if igood = false then
+ report "FIXED_GENERIC_PKG.HREAD(ufixed): "
+ & "Error end of string encountered"
+ severity error;
+ elsif (c = '.') then
+ if (i + 1 /= -lbv) then
+ igood := false;
+ report "FIXED_GENERIC_PKG.HREAD(ufixed): "
+ & "encountered ""."" at wrong index"
+ severity error;
+ end if;
+ else
+ Char2QuadBits(c, nybble, igood, true);
+ slv (i downto i-3) := nybble;
+ i := i - 4;
+ end if;
+ end loop;
+ if igood then -- We did not get another error
+ assert (i = -1) and -- We read everything, and high bits 0
+ (or_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '0')
+ report "FIXED_GENERIC_PKG.HREAD(ufixed): Vector truncated."
+ severity error;
+ if (or_reducex(slv(VALUE'low-lbv-1 downto 0)) = '1') then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.HREAD(ufixed): Vector truncated"
+ severity warning;
+ end if;
+ end if;
+ valuex := to_ufixed (slv, hbv, lbv);
+ VALUE := valuex (VALUE'range);
+ end procedure HREAD;
+
+ procedure HREAD(L : inout LINE;
+ VALUE : out ufixed;
+ GOOD : out BOOLEAN) is
+ constant hbv : INTEGER := (((maximum(4, (VALUE'high+1))+3)/4)*4)-1;
+ constant lbv : INTEGER := ((mine(-4, VALUE'low)-3)/4)*4;
+ variable slv : STD_LOGIC_VECTOR (hbv-lbv downto 0); -- high bits
+ variable c : CHARACTER; -- to read the "."
+ variable valuex : ufixed (hbv downto lbv);
+ variable igood : BOOLEAN;
+ variable nybble : STD_LOGIC_VECTOR (3 downto 0); -- 4 bits
+ variable i : INTEGER;
+ begin
+ VALUE (VALUE'range) := (others => 'U'); -- initialize to a "U"
+ loop -- skip white space
+ read(L, c, igood);
+ exit when (igood = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ if igood = false then
+ return;
+ else
+ Char2QuadBits(c, nybble, igood, false);
+ i := hbv-lbv - 4; -- Top - 4
+ slv (hbv-lbv downto i+1) := nybble;
+ end if;
+ while (i /= -1) and igood and L.all'length /= 0 loop
+ read (L, c, igood);
+ if igood then
+ if (c = '.') then
+ igood := igood and (i + 1 = -lbv);
+ else
+ Char2QuadBits(c, nybble, igood, false);
+ slv (i downto i-3) := nybble;
+ i := i - 4;
+ end if;
+ end if;
+ end loop;
+ good := igood and -- We did not get another error
+ (i = -1) and -- We read everything, and high bits 0
+ (or_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '0');
+ valuex := to_ufixed (slv, hbv, lbv);
+ VALUE := valuex (VALUE'range);
+ end procedure HREAD;
+
+ procedure HREAD(L : inout LINE;
+ VALUE : out sfixed) is
+ constant hbv : INTEGER := (((maximum(4, (VALUE'high+1))+3)/4)*4)-1;
+ constant lbv : INTEGER := ((mine(-4, VALUE'low)-3)/4)*4;
+ variable slv : STD_LOGIC_VECTOR (hbv-lbv downto 0); -- high bits
+ variable c : CHARACTER; -- to read the "."
+ variable valuex : sfixed (hbv downto lbv);
+ variable igood : BOOLEAN;
+ variable nybble : STD_LOGIC_VECTOR (3 downto 0); -- 4 bits
+ variable i : INTEGER;
+ begin
+ VALUE (VALUE'range) := (others => 'U'); -- initialize to a "U"
+ loop -- skip white space
+ read(L, c, igood);
+ exit when (igood = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ if igood = false then
+ report "FIXED_GENERIC_PKG.HREAD(sfixed): "
+ & "Error end of string encountered"
+ severity error;
+ return;
+ else
+ Char2QuadBits(c, nybble, igood, true);
+ i := hbv-lbv - 4; -- Top - 4
+ slv (hbv-lbv downto i+1) := nybble;
+ end if;
+ while (i /= -1) and igood and L.all'length /= 0 loop
+ read (L, c, igood);
+ if igood = false then
+ report "FIXED_GENERIC_PKG.HREAD(sfixed): "
+ & "Error end of string encountered"
+ severity error;
+ elsif (c = '.') then
+ if (i + 1 /= -lbv) then
+ igood := false;
+ report "FIXED_GENERIC_PKG.HREAD(sfixed): "
+ & "encountered ""."" at wrong index"
+ severity error;
+ end if;
+ else
+ Char2QuadBits(c, nybble, igood, true);
+ slv (i downto i-3) := nybble;
+ i := i - 4;
+ end if;
+ end loop;
+ if igood then -- We did not get another error
+ assert (i = -1) -- We read everything
+ and ((slv(VALUE'high-lbv) = '0' and -- sign bits = extra bits
+ or_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '0') or
+ (slv(VALUE'high-lbv) = '1' and
+ and_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '1'))
+ report "FIXED_GENERIC_PKG.HREAD(sfixed): Vector truncated."
+ severity error;
+ if (or_reducex(slv(VALUE'low-lbv-1 downto 0)) = '1') then
+ assert NO_WARNING
+ report "FIXED_GENERIC_PKG.HREAD(sfixed): Vector truncated"
+ severity warning;
+ end if;
+ end if;
+ valuex := to_sfixed (slv, hbv, lbv);
+ VALUE := valuex (VALUE'range);
+ end procedure HREAD;
+
+ procedure HREAD(L : inout LINE;
+ VALUE : out sfixed;
+ GOOD : out BOOLEAN) is
+ constant hbv : INTEGER := (((maximum(4, (VALUE'high+1))+3)/4)*4)-1;
+ constant lbv : INTEGER := ((mine(-4, VALUE'low)-3)/4)*4;
+ variable slv : STD_LOGIC_VECTOR (hbv-lbv downto 0); -- high bits
+ variable c : CHARACTER; -- to read the "."
+ variable valuex : sfixed (hbv downto lbv);
+ variable igood : BOOLEAN;
+ variable nybble : STD_LOGIC_VECTOR (3 downto 0); -- 4 bits
+ variable i : INTEGER;
+ begin
+ VALUE (VALUE'range) := (others => 'U'); -- initialize to a "U"
+ loop -- skip white space
+ read(L, c, igood);
+ exit when (igood = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT));
+ end loop;
+ if igood = false then
+ return;
+ else
+ Char2QuadBits(c, nybble, igood, false);
+ i := hbv-lbv - 4; -- Top - 4
+ slv (hbv-lbv downto i+1) := nybble;
+ end if;
+ while (i /= -1) and igood and L.all'length /= 0 loop
+ read (L, c, igood);
+ if igood then
+ if (c = '.') then
+ igood := igood and (i + 1 = -lbv);
+ else
+ Char2QuadBits(c, nybble, igood, false);
+ slv (i downto i-3) := nybble;
+ i := i - 4;
+ end if;
+ end if;
+ end loop;
+ good := igood and -- We did not get another error
+ (i = -1) and -- We read everything
+ ((slv(VALUE'high-lbv) = '0' and -- sign bits = extra bits
+ or_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '0') or
+ (slv(VALUE'high-lbv) = '1' and
+ and_reducex(slv(hbv-lbv downto VALUE'high+1-lbv)) = '1'));
+ valuex := to_sfixed (slv, hbv, lbv);
+ VALUE := valuex (VALUE'range);
+ end procedure HREAD;
+
+ -----------------------------------------------------------------------------
+ -- %%% Remove the following 3 functions. They are a duplicate needed for
+ -- testing
+ -----------------------------------------------------------------------------
+ -- purpose: Justify a string to the right
+ function justify (
+ value : STRING;
+ justified : SIDE := right;
+ field : width := 0)
+ return STRING is
+ constant VAL_LEN : INTEGER := value'length;
+ variable result : STRING (1 to field) := (others => ' ');
+ begin -- function justify
+ -- return value if field is too small
+ if VAL_LEN >= field then
+ return value;
+ end if;
+ if justified = left then
+ result(1 to VAL_LEN) := value;
+ elsif justified = right then
+ result(field - VAL_LEN + 1 to field) := value;
+ end if;
+ return result;
+ end function justify;
+
+ function to_ostring (
+ value : STD_LOGIC_VECTOR;
+ justified : SIDE := right;
+ field : width := 0
+ ) return STRING is
+ constant ne : INTEGER := (value'length+2)/3;
+ variable pad : STD_LOGIC_VECTOR(0 to (ne*3 - value'length) - 1);
+ variable ivalue : STD_LOGIC_VECTOR(0 to ne*3 - 1);
+ variable result : STRING(1 to ne);
+ variable tri : STD_LOGIC_VECTOR(0 to 2);
+ begin
+ if value'length < 1 then
+ return NUS;
+ else
+ if value (value'left) = 'Z' then
+ pad := (others => 'Z');
+ else
+ pad := (others => '0');
+ end if;
+ ivalue := pad & value;
+ for i in 0 to ne-1 loop
+ tri := To_X01Z(ivalue(3*i to 3*i+2));
+ case tri is
+ when o"0" => result(i+1) := '0';
+ when o"1" => result(i+1) := '1';
+ when o"2" => result(i+1) := '2';
+ when o"3" => result(i+1) := '3';
+ when o"4" => result(i+1) := '4';
+ when o"5" => result(i+1) := '5';
+ when o"6" => result(i+1) := '6';
+ when o"7" => result(i+1) := '7';
+ when "ZZZ" => result(i+1) := 'Z';
+ when others => result(i+1) := 'X';
+ end case;
+ end loop;
+ return justify(result, justified, field);
+ end if;
+ end function to_ostring;
+ -------------------------------------------------------------------
+ function to_hstring (
+ value : STD_LOGIC_VECTOR;
+ justified : SIDE := right;
+ field : width := 0
+ ) return STRING is
+ constant ne : INTEGER := (value'length+3)/4;
+ variable pad : STD_LOGIC_VECTOR(0 to (ne*4 - value'length) - 1);
+ variable ivalue : STD_LOGIC_VECTOR(0 to ne*4 - 1);
+ variable result : STRING(1 to ne);
+ variable quad : STD_LOGIC_VECTOR(0 to 3);
+ begin
+ if value'length < 1 then
+ return NUS;
+ else
+ if value (value'left) = 'Z' then
+ pad := (others => 'Z');
+ else
+ pad := (others => '0');
+ end if;
+ ivalue := pad & value;
+ for i in 0 to ne-1 loop
+ quad := To_X01Z(ivalue(4*i to 4*i+3));
+ case quad is
+ when x"0" => result(i+1) := '0';
+ when x"1" => result(i+1) := '1';
+ when x"2" => result(i+1) := '2';
+ when x"3" => result(i+1) := '3';
+ when x"4" => result(i+1) := '4';
+ when x"5" => result(i+1) := '5';
+ when x"6" => result(i+1) := '6';
+ when x"7" => result(i+1) := '7';
+ when x"8" => result(i+1) := '8';
+ when x"9" => result(i+1) := '9';
+ when x"A" => result(i+1) := 'A';
+ when x"B" => result(i+1) := 'B';
+ when x"C" => result(i+1) := 'C';
+ when x"D" => result(i+1) := 'D';
+ when x"E" => result(i+1) := 'E';
+ when x"F" => result(i+1) := 'F';
+ when "ZZZZ" => result(i+1) := 'Z';
+ when others => result(i+1) := 'X';
+ end case;
+ end loop;
+ return justify(result, justified, field);
+ end if;
+ end function to_hstring;
+ -- %%% End remove here
+
+ function to_string (
+ value : ufixed;
+ justified : SIDE := right;
+ field : width := 0
+ ) return STRING is
+ variable s : STRING(1 to value'length +1) := (others => ' ');
+ variable sindx : INTEGER;
+ begin
+ if value'length < 1 then
+ return NUS;
+ else
+ if value'high < 0 then
+ return to_string (resize (value, 0, value'low), justified, field);
+ elsif value'low > 0 then
+ return to_string (resize (value, value'high, -1), justified, field);
+ else
+ sindx := 1;
+ for i in value'high downto value'low loop
+ if i = -1 then
+ s(sindx) := '.';
+ sindx := sindx +1;
+ end if;
+ s(sindx) := MVL9_to_char(STD_ULOGIC(value(i)));
+ sindx := sindx +1;
+ end loop;
+ return justify(s, justified, field);
+ end if;
+ end if;
+ end function to_string;
+
+ function to_string (
+ value : sfixed;
+ justified : SIDE := right;
+ field : width := 0
+ ) return STRING is
+ variable s : STRING(1 to value'length +1) := (others => ' ');
+ variable sindx : INTEGER;
+ begin
+ if value'length < 1 then
+ return NUS;
+ else
+ if value'high < 0 then
+ return to_string (resize (value, 0, value'low), justified, field);
+ elsif value'low > 0 then
+ return to_string (resize (value, value'high, -1), justified, field);
+ else
+ sindx := 1;
+ for i in value'high downto value'low loop
+ if i = -1 then
+ s(sindx) := '.';
+ sindx := sindx +1;
+ end if;
+ s(sindx) := MVL9_to_char(STD_ULOGIC(value(i)));
+ sindx := sindx +1;
+ end loop;
+ return justify(s, justified, field);
+ end if;
+ end if;
+ end function to_string;
+
+ function to_ostring (
+ value : ufixed;
+ justified : SIDE := right;
+ field : width := 0
+ ) return STRING is
+ constant lne : INTEGER := (-VALUE'low+2)/3;
+ constant lpad : STD_LOGIC_VECTOR (0 to (lne*3 + VALUE'low) -1) :=
+ (others => '0');
+ variable slv : STD_LOGIC_VECTOR (value'length-1 downto 0);
+ begin
+ if value'length < 1 then
+ return NUS;
+ else
+ if value'high < 0 then
+ return to_ostring (resize (value, 2, value'low), justified, field);
+ elsif value'low > 0 then
+ return to_ostring (resize (value, value'high, -3), justified, field);
+ else
+ slv := to_slv (value);
+ return justify(to_ostring(slv(slv'high downto slv'high-VALUE'high))
+ & "."
+ & to_ostring(slv(slv'high-VALUE'high-1 downto 0)&lpad),
+ justified, field);
+ end if;
+ end if;
+ end function to_ostring;
+
+ function to_hstring (
+ value : ufixed;
+ justified : SIDE := right;
+ field : width := 0
+ ) return STRING is
+ constant lne : INTEGER := (-VALUE'low+3)/4;
+ constant lpad : STD_LOGIC_VECTOR (0 to (lne*4 + VALUE'low) -1) :=
+ (others => '0');
+ variable slv : STD_LOGIC_VECTOR (value'length-1 downto 0);
+ begin
+ if value'length < 1 then
+ return NUS;
+ else
+ if value'high < 0 then
+ return to_hstring (resize (value, 3, value'low), justified, field);
+ elsif value'low > 0 then
+ return to_hstring (resize (value, value'high, -4), justified, field);
+ else
+ slv := to_slv (value);
+ return justify(to_hstring(slv(slv'high downto slv'high-VALUE'high))
+ & "."
+ & to_hstring(slv(slv'high-VALUE'high-1 downto 0)&lpad),
+ justified, field);
+ end if;
+ end if;
+ end function to_hstring;
+
+ function to_ostring (
+ value : sfixed;
+ justified : SIDE := right;
+ field : width := 0
+ ) return STRING is
+ constant ne : INTEGER := ((value'high+1)+2)/3;
+ variable pad : STD_LOGIC_VECTOR(0 to (ne*3 - (value'high+1)) - 1);
+ constant lne : INTEGER := (-VALUE'low+2)/3;
+ constant lpad : STD_LOGIC_VECTOR (0 to (lne*3 + VALUE'low) -1) :=
+ (others => '0');
+ variable slv : STD_LOGIC_VECTOR (VALUE'high - VALUE'low downto 0);
+ begin
+ if value'length < 1 then
+ return NUS;
+ else
+ pad := (others => value(value'high));
+ if value'high < 0 then
+ return to_ostring (resize (value, 2, value'low), justified, field);
+ elsif value'low > 0 then
+ return to_ostring (resize (value, value'high, -3), justified, field);
+ else
+ slv := to_slv (value);
+ return justify(to_ostring(pad
+ & slv(slv'high downto slv'high-VALUE'high))
+ & "."
+ & to_ostring(slv(slv'high-VALUE'high-1 downto 0)
+ & lpad),
+ justified, field);
+ end if;
+ end if;
+ end function to_ostring;
+
+ function to_hstring (
+ value : sfixed;
+ justified : SIDE := right;
+ field : width := 0
+ ) return STRING is
+ constant ne : INTEGER := ((value'high+1)+3)/4;
+ variable pad : STD_LOGIC_VECTOR(0 to (ne*4 - (value'high+1)) - 1);
+ constant lne : INTEGER := (-VALUE'low+3)/4;
+ constant lpad : STD_LOGIC_VECTOR (0 to (lne*4 + VALUE'low) -1) :=
+ (others => '0');
+ variable slv : STD_LOGIC_VECTOR (value'length-1 downto 0);
+ begin
+ if value'length < 1 then
+ return NUS;
+ else
+ pad := (others => value(value'high));
+ if value'high < 0 then
+ return to_hstring (resize (value, 3, value'low), justified, field);
+ elsif value'low > 0 then
+ return to_hstring (resize (value, value'high, -4), justified, field);
+ else
+ slv := to_slv (value);
+ return justify(to_hstring(pad&slv(slv'high downto slv'high-VALUE'high))
+ & "."
+ & to_hstring(slv(slv'high-VALUE'high-1 downto 0)&lpad),
+ justified, field);
+ end if;
+ end if;
+ end function to_hstring;
+
+ -- From string functions allow you to convert a string into a fixed
+ -- point number. Example:
+ -- signal uf1 : ufixed (3 downto -3);
+ -- uf1 <= from_string ("0110.100", uf1'high, uf1'low); -- 6.5
+ -- The "." is optional in this syntax, however it exist and is
+ -- in the wrong location an error is produced. Overflow will
+ -- result in saturation.
+ function from_string (
+ bstring : STRING; -- binary string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed is
+ variable result : ufixed (left_index downto right_index);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(bstring);
+ read (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_string: Bad string "& bstring severity error;
+ return result;
+ end function from_string;
+
+ -- Octal and hex conversions work as follows:
+ -- uf1 <= from_hstring ("6.8", 3, -3); -- 6.5 (bottom zeros dropped)
+ -- uf1 <= from_ostring ("06.4", 3, -3); -- 6.5 (top zeros dropped)
+ function from_ostring (
+ ostring : STRING; -- Octal string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed is
+ variable result : ufixed (left_index downto right_index);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(ostring);
+ oread (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_ostring: Bad string "& ostring severity error;
+ return result;
+ end function from_ostring;
+
+ function from_hstring (
+ hstring : STRING; -- hex string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return ufixed is
+ variable result : ufixed (left_index downto right_index);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(hstring);
+ hread (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_hstring: Bad string "& hstring severity error;
+ return result;
+ end function from_hstring;
+
+ function from_string (
+ bstring : STRING; -- binary string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed is
+ variable result : sfixed (left_index downto right_index);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(bstring);
+ read (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_string: Bad string "& bstring severity error;
+ return result;
+ end function from_string;
+
+ function from_ostring (
+ ostring : STRING; -- Octal string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed is
+ variable result : sfixed (left_index downto right_index);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(ostring);
+ oread (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_ostring: Bad string "& ostring severity error;
+ return result;
+ end function from_ostring;
+
+ function from_hstring (
+ hstring : STRING; -- hex string
+ constant left_index : INTEGER;
+ constant right_index : INTEGER)
+ return sfixed is
+ variable result : sfixed (left_index downto right_index);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(hstring);
+ hread (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_hstring: Bad string "& hstring severity error;
+ return result;
+ end function from_hstring;
+
+ -- Same as above, "size_res" is used for it's range only.
+ function from_string (
+ bstring : STRING; -- binary string
+ size_res : ufixed)
+ return ufixed is
+ variable result : ufixed (size_res'high downto size_res'low);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(bstring);
+ read (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_string: Bad string "& bstring severity error;
+ return result;
+ end function from_string;
+
+ function from_ostring (
+ ostring : STRING; -- Octal string
+ size_res : ufixed)
+ return ufixed is
+ variable result : ufixed (size_res'high downto size_res'low);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(ostring);
+ oread (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_ostring: Bad string "& ostring severity error;
+ return result;
+ end function from_ostring;
+
+ function from_hstring (
+ hstring : STRING; -- hex string
+ size_res : ufixed)
+ return ufixed is
+ variable result : ufixed (size_res'high downto size_res'low);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(hstring);
+ hread (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_hstring: Bad string "& hstring severity error;
+ return result;
+ end function from_hstring;
+
+ function from_string (
+ bstring : STRING; -- binary string
+ size_res : sfixed)
+ return sfixed is
+ variable result : sfixed (size_res'high downto size_res'low);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(bstring);
+ read (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_string: Bad string "& bstring severity error;
+ return result;
+ end function from_string;
+
+ function from_ostring (
+ ostring : STRING; -- Octal string
+ size_res : sfixed)
+ return sfixed is
+ variable result : sfixed (size_res'high downto size_res'low);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(ostring);
+ oread (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_ostring: Bad string "& ostring severity error;
+ return result;
+ end function from_ostring;
+
+ function from_hstring (
+ hstring : STRING; -- hex string
+ size_res : sfixed)
+ return sfixed is
+ variable result : sfixed (size_res'high downto size_res'low);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ begin
+ L := new STRING'(hstring);
+ hread (L, result, good);
+ deallocate (L);
+ assert (good)
+ report "fixed_generic_pkg.from_hstring: Bad string "& hstring severity error;
+ return result;
+ end function from_hstring;
+
+ -- purpose: find a dot in a string, return -1 if no dot (internal function)
+ function finddot (
+ arg : STRING)
+ return INTEGER is
+ alias xarg : STRING (arg'length downto 1) is arg; -- make it a downto
+ begin
+ for i in xarg'reverse_range loop
+ if (xarg(i) = '.') then
+ return i-1;
+ end if;
+ end loop;
+ return -1;
+ end function finddot;
+
+ -- Direct converstion functions. Example:
+ -- signal uf1 : ufixed (3 downto -3);
+ -- uf1 <= from_string ("0110.100"); -- 6.5
+ -- In this case the "." is not optional, and the size of
+ -- the output must match exactly.
+ function from_string (
+ bstring : STRING) -- binary string
+ return ufixed is
+ variable result : ufixed (bstring'length-2 downto 0);
+ variable result_nodot : ufixed (bstring'length-1 downto 0);
+ variable bstring_nodot : STRING (1 to bstring'length-1);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ variable dot, i, j : INTEGER;
+ begin
+ dot := finddot(bstring);
+ if (dot = -1) then
+ L := new STRING'(bstring);
+ read (L, result_nodot, good);
+ assert (good)
+ report "fixed_generic_pkg.from_string: Bad string "& bstring severity error;
+ deallocate (L);
+ return result_nodot;
+ else
+ j := 1;
+ for i in 1 to bstring'high loop
+ if (bstring(i) /= '.') then
+ bstring_nodot(j) := bstring(i); -- get rid of the dot.
+ j := j + 1;
+ end if;
+ end loop;
+ L := new STRING'(bstring_nodot);
+ read (L, result, good);
+ assert (good)
+ report "fixed_generic_pkg.from_string: Bad string "& bstring severity error;
+ deallocate (L);
+ return to_ufixed(to_slv(result), bstring'length-dot-2, -dot);
+ end if;
+ end function from_string;
+
+ -- Direct octal and hex converstion functions. In this case
+ -- the string lengths must match. Example:
+ -- signal sf1 := sfixed (5 downto -3);
+ -- sf1 <= from_ostring ("71.4") -- -6.5
+ function from_ostring (
+ ostring : STRING) -- Octal string
+ return ufixed is
+ variable result : STD_LOGIC_VECTOR((ostring'length-1)*3-1 downto 0);
+ variable result_nodot : STD_LOGIC_VECTOR((ostring'length)*3-1 downto 0);
+ variable ostring_nodot : STRING (1 to ostring'length-1);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ variable dot, i, j : INTEGER;
+ begin
+ dot := finddot(ostring);
+ if (dot = -1) then
+ L := new STRING'(ostring);
+ oread (L, result_nodot, good);
+ assert (good)
+ report "fixed_generic_pkg.from_ostring: Bad string "& ostring severity error;
+ deallocate (L);
+ return to_ufixed(UNSIGNED(result_nodot));
+ else
+ j := 1;
+ for i in 1 to ostring'high loop
+ if (ostring(i) /= '.') then
+ ostring_nodot(j) := ostring(i); -- get rid of the dot.
+ j := j + 1;
+ end if;
+ end loop;
+ L := new STRING'(ostring_nodot);
+ oread (L, result, good);
+ assert (good)
+ report "fixed_generic_pkg.from_ostring: Bad string "& ostring severity error;
+ deallocate (L);
+ return to_ufixed(result, (ostring'length-1-dot)*3-1, -dot*3);
+ end if;
+ end function from_ostring;
+
+ function from_hstring (
+ hstring : STRING) -- hex string
+ return ufixed is
+ variable result : STD_LOGIC_VECTOR((hstring'length-1)*4-1 downto 0);
+ variable result_nodot : STD_LOGIC_VECTOR((hstring'length)*4-1 downto 0);
+ variable hstring_nodot : STRING (1 to hstring'length-1);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ variable dot, i, j : INTEGER;
+ begin
+ dot := finddot(hstring);
+ if (dot = -1) then
+ L := new STRING'(hstring);
+ hread (L, result_nodot, good);
+ assert (good)
+ report "fixed_generic_pkg.from_hstring: Bad string "& hstring severity error;
+ deallocate (L);
+ return to_ufixed(UNSIGNED(result_nodot));
+ else
+ j := 1;
+ for i in 1 to hstring'high loop
+ if (hstring(i) /= '.') then
+ hstring_nodot(j) := hstring(i); -- get rid of the dot.
+ j := j + 1;
+ end if;
+ end loop;
+ L := new STRING'(hstring_nodot);
+ hread (L, result, good);
+ assert (good)
+ report "fixed_generic_pkg.from_hstring: Bad string "& hstring severity error;
+ deallocate (L);
+ return to_ufixed(result, (hstring'length-1-dot)*4-1, -dot*4);
+ end if;
+ end function from_hstring;
+
+ function from_string (
+ bstring : STRING) -- binary string
+ return sfixed is
+ variable result : sfixed (bstring'length-2 downto 0);
+ variable result_nodot : sfixed (bstring'length-1 downto 0);
+ variable bstring_nodot : STRING (1 to bstring'length-1);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ variable dot, i, j : INTEGER;
+ begin
+ dot := finddot(bstring);
+ if (dot = -1) then
+ L := new STRING'(bstring);
+ read (L, result_nodot, good);
+ assert (good)
+ report "fixed_generic_pkg.from_string: Bad string "& bstring severity error;
+ deallocate (L);
+ return result_nodot;
+ else
+ j := 1;
+ for i in 1 to bstring'high loop
+ if (bstring(i) /= '.') then
+ bstring_nodot(j) := bstring(i); -- get rid of the dot.
+ j := j + 1;
+ end if;
+ end loop;
+ L := new STRING'(bstring_nodot);
+ read (L, result, good);
+ assert (good)
+ report "fixed_generic_pkg.from_string: Bad string "& bstring severity error;
+ deallocate (L);
+ return to_sfixed(to_slv(result), bstring'length-dot-2, -dot);
+ end if;
+ end function from_string;
+
+ function from_ostring (
+ ostring : STRING) -- Octal string
+ return sfixed is
+ variable result : STD_LOGIC_VECTOR((ostring'length-1)*3-1 downto 0);
+ variable result_nodot : STD_LOGIC_VECTOR((ostring'length)*3-1 downto 0);
+ variable ostring_nodot : STRING (1 to ostring'length-1);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ variable dot, i, j : INTEGER;
+ begin
+ dot := finddot(ostring);
+ if (dot = -1) then
+ L := new STRING'(ostring);
+ oread (L, result_nodot, good);
+ assert (good)
+ report "fixed_generic_pkg.from_ostring: Bad string "& ostring severity error;
+ deallocate (L);
+ return to_sfixed(SIGNED(result_nodot));
+ else
+ j := 1;
+ for i in 1 to ostring'high loop
+ if (ostring(i) /= '.') then
+ ostring_nodot(j) := ostring(i); -- get rid of the dot.
+ j := j + 1;
+ end if;
+ end loop;
+ L := new STRING'(ostring_nodot);
+ oread (L, result, good);
+ assert (good)
+ report "fixed_generic_pkg.from_ostring: Bad string "& ostring severity error;
+ deallocate (L);
+ return to_sfixed(result, (ostring'length-1-dot)*3-1, -dot*3);
+ end if;
+ end function from_ostring;
+
+ function from_hstring (
+ hstring : STRING) -- hex string
+ return sfixed is
+ variable result : STD_LOGIC_VECTOR((hstring'length-1)*4-1 downto 0);
+ variable result_nodot : STD_LOGIC_VECTOR((hstring'length)*4-1 downto 0);
+ variable hstring_nodot : STRING (1 to hstring'length-1);
+ variable L : LINE;
+ variable good : BOOLEAN;
+ variable dot, i, j : INTEGER;
+ begin
+ dot := finddot(hstring);
+ if (dot = -1) then
+ L := new STRING'(hstring);
+ hread (L, result_nodot, good);
+ assert (good)
+ report "fixed_generic_pkg.from_hstring: Bad string "& hstring severity error;
+ deallocate (L);
+ return sfixed(SIGNED(result_nodot));
+ else
+ j := 1;
+ for i in 1 to hstring'high loop
+ if (hstring(i) /= '.') then
+ hstring_nodot(j) := hstring(i); -- get rid of the dot.
+ j := j + 1;
+ end if;
+ end loop;
+ L := new STRING'(hstring_nodot);
+ hread (L, result, good);
+ assert (good)
+ report "fixed_generic_pkg.from_hstring: Bad string "& hstring severity error;
+ deallocate (L);
+ return to_sfixed(result, (hstring'length-1-dot)*4-1, -dot*4);
+ end if;
+ end function from_hstring;
+
+-- synthesis translate_on
+-- rtl_synthesis on
+ function to_StdLogicVector (
+ arg : ufixed) -- fp vector
+ return STD_LOGIC_VECTOR is
+ begin
+ return to_slv (arg);
+ end function to_StdLogicVector;
+ function to_Std_Logic_Vector (
+ arg : ufixed) -- fp vector
+ return STD_LOGIC_VECTOR is
+ begin
+ return to_slv (arg);
+ end function to_Std_Logic_Vector;
+ function to_StdLogicVector (
+ arg : sfixed) -- fp vector
+ return STD_LOGIC_VECTOR is
+ begin
+ return to_slv (arg);
+ end function to_StdLogicVector;
+ function to_Std_Logic_Vector (
+ arg : sfixed) -- fp vector
+ return STD_LOGIC_VECTOR is
+ begin
+ return to_slv (arg);
+ end function to_Std_Logic_Vector;
+ function to_StdULogicVector (
+ arg : ufixed) -- fp vector
+ return STD_ULOGIC_VECTOR is
+ begin
+ return to_sulv (arg);
+ end function to_StdULogicVector;
+ function to_Std_ULogic_Vector (
+ arg : ufixed) -- fp vector
+ return STD_ULOGIC_VECTOR is
+ begin
+ return to_sulv (arg);
+ end function to_Std_ULogic_Vector;
+ function to_StdULogicVector (
+ arg : sfixed) -- fp vector
+ return STD_ULOGIC_VECTOR is
+ begin
+ return to_sulv (arg);
+ end function to_StdULogicVector;
+ function to_Std_ULogic_Vector (
+ arg : sfixed) -- fp vector
+ return STD_ULOGIC_VECTOR is
+ begin
+ return to_sulv (arg);
+ end function to_Std_ULogic_Vector;
+end package body fixed_pkg;
diff --git a/lib/fixed_ja/fixed_ja.vhd b/lib/fixed_ja/fixed_ja.vhd
new file mode 100644
index 0000000..bcd2700
--- /dev/null
+++ b/lib/fixed_ja/fixed_ja.vhd
@@ -0,0 +1,322 @@
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use ieee.numeric_std.all;
+
+package fixed_ja is
+
+
+ type ufixed_t is array (integer range <>) of STD_LOGIC;
+ type sfixed_t is array (integer range <>) of STD_LOGIC;
+ type ufixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC;
+ type sfixed_array_t is array (natural range <>, integer range <>) of STD_LOGIC;
+
+ type round_mode_t is (none, round_to_zero, round_pos_infinity, round_neg_infinity, round_half_up, round_half_down, round_nearest, round_convergent);
+ type saturate_mode_t is (none, saturate);
+
+ -- Declare functions and procedure
+
+ constant ASSERT_NO_WARN : boolean := false;
+ constant default_round_mode : round_mode_t := none;
+ constant default_saturate_mode : saturate_mode_t := none;
+
+ -- null array constants
+ constant NAUF : ufixed_t (0 downto 1) := (others => '0');
+ constant NASF : sfixed_t (0 downto 1) := (others => '0');
+ constant NSLV : STD_LOGIC_VECTOR (0 downto 1) := (others => '0');
+
+ -- Constructor helpers
+ -- Use: variable v8u2 : ufixed_t(ufixed(8,2)'range);
+ function uproto (nbits : integer; nbits_int : integer) return ufixed_t;
+
+ -- Use: variable v8s2 : sfixed_t(sfixed(8,2)'range);
+ function sproto (nbits : integer; nbits_int : integer) return sfixed_t;
+
+ function uproto (a : ufixed_t; op : character; b : ufixed_t) return ufixed_t;
+ function sproto (a : sfixed_t; op : character; b : sfixed_t) return sfixed_t;
+
+ -- Conversion Functions
+ function to_ufixed(src : ufixed_t) return ufixed_t;
+ function to_sfixed(src : sfixed_t) return sfixed_t;
+ function to_ufixed(src : sfixed_t) return ufixed_t;
+ function to_sfixed(src : ufixed_t) return sfixed_t;
+
+ function to_ufixed
+ (
+ src : ufixed_t;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t;
+
+ function to_ufixed
+ (
+ src : ufixed_t;
+ proto : ufixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t;
+
+ function to_sfixed
+ (
+ src : sfixed_t;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t;
+
+ function to_sfixed
+ (
+ src : sfixed_t;
+ proto : sfixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t;
+
+ -- fixed <= integer
+ function to_ufixed (src : integer; nbits : integer; nbits_int : integer) return ufixed_t;
+ function to_ufixed (src : integer; proto : ufixed_t) return ufixed_t;
+
+ -- fixed <= integer
+ function to_sfixed (src : integer; nbits : integer; nbits_int : integer) return sfixed_t;
+ function to_sfixed (src : integer; proto : sfixed_t) return sfixed_t;
+
+ -- ufixed <= unsigned
+ function to_ufixed (src : unsigned; nbits : integer; nbits_int : integer) return ufixed_t;
+ function to_ufixed (src : unsigned; proto : ufixed_t) return ufixed_t;
+
+ -- sfixed <= signed
+ function to_sfixed (src : signed; nbits : integer; nbits_int : integer) return sfixed_t;
+ function to_sfixed (src : signed; proto : sfixed_t) return sfixed_t;
+
+ -- fixed <= slv
+ function to_ufixed (src : STD_LOGIC_VECTOR; nbits : integer; nbits_int : integer) return ufixed_t;
+ function to_ufixed (src : STD_LOGIC_VECTOR; proto : ufixed_t) return ufixed_t;
+ function to_sfixed (src : STD_LOGIC_VECTOR; nbits : integer; nbits_int : integer) return sfixed_t;
+ function to_sfixed (src : STD_LOGIC_VECTOR; proto : sfixed_t) return sfixed_t;
+
+ -- ufixed <= real
+ function to_ufixed
+ (
+ src : real;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t;
+
+ function to_ufixed
+ (
+ src : real;
+ proto : ufixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t;
+
+ -- sfixed <= real
+ function to_sfixed
+ (
+ src : real;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t;
+
+ function to_sfixed
+ (
+ src : real;
+ proto : sfixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t;
+
+ -- Slicing functions for unconstrained array types
+ function to_ufixed(src : ufixed_array_t; index : integer) return ufixed_t;
+ function to_sfixed(src : sfixed_array_t; index : integer) return sfixed_t;
+
+ -- ufixed <= string
+ function to_ufixed (src : string) return ufixed_t;
+
+ -- sfixed <= string
+ function to_sfixed (src : string) return sfixed_t;
+
+ -- real <= ufixed
+ function to_real(src : ufixed_t) return real;
+
+ -- real <= sfixed
+ function to_real(src : sfixed_t) return real;
+
+ -- slv <= ufixed
+ function to_slv(src : ufixed_t) return std_logic_vector;
+
+ -- slv <= sfixed
+ function to_slv(src : sfixed_t) return std_logic_vector;
+
+ -- UNSIGNED <= ufixed
+ function to_unsigned (src : ufixed_t) return UNSIGNED;
+
+ -- SIGNED <= sfixed
+ function to_signed (src : sfixed_t) return SIGNED;
+
+ -- integer <= ufixed
+ function to_integer (src : ufixed_t) return integer;
+
+ -- integer <= sfixed
+ function to_integer (src : sfixed_t) return integer;
+
+ function to_string(src : ufixed_t) return string;
+ function to_string(src : sfixed_t) return string;
+ function to_string(src : std_logic_vector) return string;
+
+ -------------------------------------------------------------
+ -- Arithmetic shift left
+ -------------------------------------------------------------
+ function "sla" (src : ufixed_t; count : integer) return ufixed_t;
+ function "sla" (src : sfixed_t; count : integer) return sfixed_t;
+
+ -------------------------------------------------------------
+ -- Arithmetic shift right
+ -------------------------------------------------------------
+ function "sra" (src : ufixed_t; count : integer) return ufixed_t;
+ function "sra" (src : sfixed_t; count : integer) return sfixed_t;
+
+ -------------------------------------------------------------
+ -- Multiplication
+ -------------------------------------------------------------
+ function "*" (a : ufixed_t; b : ufixed_t) return ufixed_t;
+ function "*" (a : sfixed_t; b : sfixed_t) return sfixed_t;
+ function "*" (a : ufixed_t; b : sfixed_t) return sfixed_t;
+ function "*" (a : sfixed_t; b : ufixed_t) return sfixed_t;
+
+ -------------------------------------------------------------
+ -- Sum
+ -------------------------------------------------------------
+ function "+" (a : ufixed_t; b : integer) return ufixed_t;
+ function "+" (a : sfixed_t; b : integer) return sfixed_t;
+ function "+" (a : ufixed_t; b : unsigned) return ufixed_t;
+ function "+" (a : sfixed_t; b : signed) return sfixed_t;
+ function "+" (a : ufixed_t; b : ufixed_t) return ufixed_t;
+ function "+" (a : sfixed_t; b : sfixed_t) return sfixed_t;
+ function "+" (a : ufixed_t; b : sfixed_t) return sfixed_t;
+ function "+" (a : sfixed_t; b : ufixed_t) return sfixed_t;
+ function "+" (a : ufixed_t; b : std_logic) return ufixed_t;
+ function "+" (a : sfixed_t; b : std_logic) return sfixed_t;
+
+
+ -------------------------------------------------------------
+ -- Difference
+ -------------------------------------------------------------
+ function "-" (a : ufixed_t; b : integer) return ufixed_t;
+ function "-" (a : sfixed_t; b : integer) return sfixed_t;
+ function "-" (a : ufixed_t; b : unsigned) return ufixed_t;
+ function "-" (a : sfixed_t; b : signed) return sfixed_t;
+ function "-" (a : ufixed_t; b : ufixed_t) return ufixed_t;
+ function "-" (a : sfixed_t; b : sfixed_t) return sfixed_t;
+ function "-" (a : ufixed_t; b : sfixed_t) return sfixed_t;
+ function "-" (a : sfixed_t; b : ufixed_t) return sfixed_t;
+ function "-" (a : ufixed_t; b : std_logic) return ufixed_t;
+ function "-" (a : sfixed_t; b : std_logic) return sfixed_t;
+
+ -------------------------------------------------------------
+ -- Equality
+ -------------------------------------------------------------
+ function "=" (a : ufixed_t; b : ufixed_t) return boolean;
+ function "=" (a : sfixed_t; b : sfixed_t) return boolean;
+ function "=" (a : ufixed_t; b : sfixed_t) return boolean;
+ function "=" (a : sfixed_t; b : ufixed_t) return boolean;
+
+ -------------------------------------------------------------
+ -- Inequality
+ -------------------------------------------------------------
+ function "/=" (a : ufixed_t; b : ufixed_t) return boolean;
+ function "/=" (a : sfixed_t; b : sfixed_t) return boolean;
+ function "/=" (a : ufixed_t; b : sfixed_t) return boolean;
+ function "/=" (a : sfixed_t; b : ufixed_t) return boolean;
+
+ -------------------------------------------------------------
+ -- Less than
+ -------------------------------------------------------------
+ function "<" (a : ufixed_t; b : ufixed_t) return boolean;
+ function "<" (a : sfixed_t; b : sfixed_t) return boolean;
+ function "<" (a : ufixed_t; b : sfixed_t) return boolean;
+ function "<" (a : sfixed_t; b : ufixed_t) return boolean;
+
+ -------------------------------------------------------------
+ -- Greater than
+ -------------------------------------------------------------
+ function ">" (a : ufixed_t; b : ufixed_t) return boolean;
+ function ">" (a : sfixed_t; b : sfixed_t) return boolean;
+ function ">" (a : ufixed_t; b : sfixed_t) return boolean;
+ function ">" (a : sfixed_t; b : ufixed_t) return boolean;
+
+ -------------------------------------------------------------
+ -- Less or equal than
+ -------------------------------------------------------------
+ function "<=" (a : ufixed_t; b : ufixed_t) return boolean;
+ function "<=" (a : sfixed_t; b : sfixed_t) return boolean;
+ function "<=" (a : ufixed_t; b : sfixed_t) return boolean;
+ function "<=" (a : sfixed_t; b : ufixed_t) return boolean;
+
+ -------------------------------------------------------------
+ -- Greater or equal than
+ -------------------------------------------------------------
+ function ">=" (a : ufixed_t; b : ufixed_t) return boolean;
+ function ">=" (a : sfixed_t; b : sfixed_t) return boolean;
+ function ">=" (a : ufixed_t; b : sfixed_t) return boolean;
+ function ">=" (a : sfixed_t; b : ufixed_t) return boolean;
+
+ -------------------------------------------------------------
+ -- Unary Arithmetic Operators
+ -------------------------------------------------------------
+ function "abs" (src : sfixed_t) return sfixed_t;
+ function "-" (src : ufixed_t) return sfixed_t;
+ function "-" (src : sfixed_t) return sfixed_t;
+
+ -------------------------------------------------------------
+ -- Misc. Operators
+ -------------------------------------------------------------
+ function ipart (src : ufixed_t) return ufixed_t;
+ function fpart (src : ufixed_t) return ufixed_t;
+ function ipart (src : sfixed_t) return sfixed_t;
+ function fpart (src : sfixed_t) return sfixed_t;
+
+ -------------------------------------------------------------
+ -- Print function
+ -------------------------------------------------------------
+ procedure print_info(src : in ufixed_t; prefix : in string);
+ procedure print_info(src : in sfixed_t; prefix : in string);
+ procedure print_info(src : in string; prefix : in string);
+
+ -------------------------------------------------------------
+ -- Helpers
+ -------------------------------------------------------------
+ function cmsb(src : ufixed_t) return integer;
+ function clsb(src : ufixed_t) return integer;
+
+ function MIN (X, Y: INTEGER) return INTEGER;
+ function MAX (X, Y: INTEGER) return INTEGER;
+
+ function "MOD" (X, Y: in REAL ) return REAL;
+ function ipart(src : real) return real;
+ function fpart(src : real) return real;
+
+ function and_red(arg : ufixed_t) return STD_ULOGIC;
+ function nand_red(arg : ufixed_t) return STD_ULOGIC;
+ function or_red(arg : ufixed_t) return STD_ULOGIC;
+ function nor_red(arg : ufixed_t) return STD_ULOGIC;
+ function xor_red(arg : ufixed_t) return STD_ULOGIC;
+ function xnor_red(arg : ufixed_t) return STD_ULOGIC;
+ function and_red(arg : sfixed_t) return STD_ULOGIC;
+ function nand_red(arg : sfixed_t) return STD_ULOGIC;
+ function or_red(arg : sfixed_t) return STD_ULOGIC;
+ function nor_red(arg : sfixed_t) return STD_ULOGIC;
+ function xor_red(arg : sfixed_t) return STD_ULOGIC;
+ function xnor_red(arg : sfixed_t) return STD_ULOGIC;
+
+ --------------------------------------------------------------
+
+end; -- package fixed_ja;
+
diff --git a/lib/fixed_ja/fixed_ja_body.vhd b/lib/fixed_ja/fixed_ja_body.vhd
new file mode 100644
index 0000000..a85b626
--- /dev/null
+++ b/lib/fixed_ja/fixed_ja_body.vhd
@@ -0,0 +1,1921 @@
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use ieee.numeric_std.all;
+use ieee.math_real.all;
+use std.textio.all;
+
+package body fixed_ja is
+
+ -------------------------------------------------------------
+ -- Local Procedures
+ -------------------------------------------------------------
+ -- adds 1 to the LSB of the number
+ procedure round_up
+ (
+ src : in ufixed_t;
+ result : out ufixed_t;
+ overflowx : out BOOLEAN ) is
+
+ variable srcuns, resuns : UNSIGNED (src'high-src'low+1 downto 0) := (others => '0');
+ begin -- round_up
+ srcuns (srcuns'high-1 downto 0) := to_unsigned (src);
+ resuns := srcuns + 1;
+
+ result := to_ufixed(resuns(src'high-src'low downto 0), src);
+ overflowx := (resuns(resuns'high) = '1');
+
+ end procedure round_up;
+
+ -------------------------------------------------------------
+ -- adds 1 to the LSB of the number
+ procedure round_up
+ (
+ src : in sfixed_t;
+ result : out sfixed_t;
+ overflowx : out BOOLEAN ) is
+
+ variable srcs, ress : SIGNED (src'high-src'low+1 downto 0);
+ begin -- round_up
+ srcs (srcs'high-1 downto 0) := to_signed (src);
+ srcs(srcs'high) := src(src'high); -- sign extend
+ ress := srcs + 1;
+
+ result := to_sfixed(ress (ress'high-1 downto 0), src);
+ overflowx := ((src(src'high) /= ress(ress'high-1)) and (or_red (sfixed_t(ress)) /= '0'));
+
+ end procedure round_up;
+
+ -------------------------------------------------------------
+ -- Local functions
+ -------------------------------------------------------------
+ -- round_fixed()
+-- function round_fixed
+-- (
+-- src : ufixed_t;
+-- remainder : ufixed_t;
+-- rnd_mode : round_mode_t := default_round_mode
+-- ) return ufixed_t is
+-- variable res : ufixed_t(src'range);
+-- begin
+-- return res;
+--
+-- end round_fixed;
+
+ -------------------------------------------------------------
+-- function round_fixed
+-- (
+-- src : sfixed_t;
+-- remainder : sfixed_t;
+-- rnd_mode : round_mode_t := default_round_mode
+-- ) return sfixed_t is
+-- variable res : signed(src'length-1 downto 0);
+-- begin
+-- return src;
+--
+-- end round_fixed;
+
+ -------------------------------------------------------------
+ function reshape
+ (
+ src : ufixed_t;
+ proto : ufixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t is
+
+ variable RemainLow : ufixed_t (proto'low-1 downto src'low) := (others => '0');
+ variable RemainHigh : ufixed_t (src'high downto proto'high+1) := (others => '0');
+ variable dst, tmp : ufixed_t (proto'high downto proto'low) := (others => '0');
+ variable ovf, isTruncLo, isTruncHi : boolean := false;
+ begin
+
+ if proto'high < -1 then
+ assert false report "U: reshape: Bad dual point (Upper bound < (-1))" severity error;
+ end if;
+
+ -- Check for high and low truncation
+ isTruncLo := (src'low < dst'low);
+ isTruncHi := (src'high > dst'high);
+
+ -- Reshape
+ dst := (others => '0');
+ dst(min(src'high, dst'high) downto max(src'low, dst'low)) := src(min(src'high, dst'high) downto max(src'low, dst'low));
+ tmp := dst;
+
+ -- Get low remainder
+ if isTruncLo then
+ RemainLow := src(RemainLow'range);
+ end if;
+
+ -- Get high remainder
+ if isTruncHi then
+ RemainHigh := src(RemainHigh'range);
+ end if;
+
+ ovf := false;
+
+ -- Rounding
+ if isTruncLo then
+
+ case rnd_mode is
+
+ -- Round to positive infinity (round ceiling)
+ when round_pos_infinity =>
+ if or_red(RemainLow) = '1' then
+ round_up(tmp, dst, ovf);
+ end if;
+
+ -- Round Half-up
+ -- Round nearest
+ when round_half_up | round_nearest =>
+ if (RemainLow(RemainLow'high) = '1') then
+ round_up(tmp, dst, ovf);
+ end if;
+
+ -- Round convergent
+ when round_convergent =>
+ if RemainLow(RemainLow'high) = '1' then
+ if or_red(RemainLow(RemainLow'high-1 downto RemainLow'low)) = '1' then
+ round_up(tmp, dst, ovf);
+ elsif tmp(dst'low) = '1' then
+ round_up(tmp, dst, ovf);
+ end if;
+ end if;
+
+ -- Round to zero
+ when round_to_zero | none => null;
+
+ when others =>
+ assert false report "Reshape(U): Rounding mode (" & round_mode_t'image(rnd_mode) & ") not implemented!" severity error;
+
+ end case;
+ end if;
+
+ -- Saturating
+ if sat_mode = saturate then
+
+ -- Check overflow
+ if isTruncHi then
+ ovf := ovf or or_red(RemainHigh) = '1';
+ end if;
+
+ -- Saturate
+ if ovf then
+ dst := (others => '1');
+ end if;
+
+ end if;
+
+ return dst;
+
+ end reshape;
+
+ -------------------------------------------------------------
+ function reshape
+ (
+ src : ufixed_t;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t is
+
+ begin
+ return reshape(src, uproto(nbits, nbits_int), rnd_mode, sat_mode);
+
+ end reshape;
+
+ -------------------------------------------------------------
+ function reshape
+ (
+ src : sfixed_t;
+ proto : sfixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t is
+
+ variable RemainLow : sfixed_t (proto'low-1 downto src'low) := (others => '0');
+ variable RemainHigh : sfixed_t (src'high-1 downto proto'high) := (others => '0');
+ variable dst, tmp : sfixed_t (proto'high downto proto'low) := (others => '0');
+ variable ovf, isTruncLo, isTruncHi : boolean := false;
+ variable sign : std_logic;
+ begin
+
+ if proto'high < 0 then
+ assert false report "Reshape(S): Bad dual point (Upper bound < (0))" severity error;
+ end if;
+
+ -- Check for high and low truncation
+ isTruncLo := (src'low < dst'low);
+ isTruncHi := (src'high > dst'high);
+
+ -- Reshape
+ sign := src(src'high);
+ dst := (others => '0');
+ dst(dst'high downto max(src'low, dst'low)) := (dst'high downto min(src'high, dst'high) => sign) & src(min(src'high, dst'high)-1 downto max(src'low, dst'low));
+ tmp := dst;
+
+ -- Get low remainder
+ if isTruncLo then
+ RemainLow := src(RemainLow'range);
+ end if;
+
+ -- Get high remainder
+ if isTruncHi then
+ RemainHigh := src(RemainHigh'range);
+ end if;
+
+ ovf := false;
+
+ -- Rounding
+ if isTruncLo then
+
+ case rnd_mode is
+
+ -- Round to positive infinity (round ceiling)
+ when round_pos_infinity =>
+ round_up(tmp, dst, ovf);
+ if ovf then
+ dst(dst'high) := '0';
+ end if;
+
+ -- Round Half-up
+ when round_half_up =>
+ if RemainLow(RemainLow'high) = '1' then
+ round_up(tmp, dst, ovf);
+ end if;
+
+ -- Round nearest
+ when round_nearest =>
+ if RemainLow(RemainLow'high) = '1' then
+ if RemainLow'length = 1 then
+ if sign = '0' then
+ round_up(tmp, dst, ovf);
+ end if;
+ elsif sign = '0' or (sign and or_red(RemainLow(RemainLow'high-1 downto RemainLow'low))) = '1' then
+ round_up(tmp, dst, ovf);
+ end if;
+ end if;
+
+ -- Round convergent
+ when round_convergent =>
+ if RemainLow(RemainLow'high) = '1' then
+ if or_red(RemainLow(RemainLow'high-1 downto RemainLow'low)) = '1' then
+ round_up(tmp, dst, ovf);
+ elsif tmp(dst'low) = '1' then
+ round_up(tmp, dst, ovf);
+ end if;
+ end if;
+
+ -- Round to zero
+ when round_to_zero =>
+ if (or_red(RemainLow) = '1' and sign = '1') then
+ round_up(tmp, dst, ovf);
+ end if;
+
+ -- No Round
+ when none =>
+ -- Same as RoundToZero but overflow detection is omitted
+ dst := tmp + (or_red(RemainLow) and sign);
+
+ when others =>
+ assert false report "Reshape(S): Rounding mode (" & round_mode_t'image(rnd_mode) & ") not implemented!" severity error;
+
+ end case;
+
+ -- Check negative zero
+ if dst(dst'high) = '1' then
+ if or_red(dst(dst'high-1 downto dst'low)) = '0' then
+ dst(dst'high) := '0';
+ -- assert false report "Reshape(S): -0 detected" severity note;
+ end if;
+ end if;
+ end if;
+
+ -- Saturating
+ if sat_mode = saturate then
+
+ -- Check overflow
+ if isTruncHi then
+ ovf := ovf or
+ (sign = '1' and src(dst'high) = '0' and or_red(tmp(dst'high-1 downto dst'low)) = '1') or
+ (sign = '1' and src(dst'high) = '1' and or_red(tmp(dst'high-1 downto dst'low)) = '0') or
+ (sign = '0' and or_red(RemainHigh) = '1');
+ end if;
+
+ -- Saturate
+ if ovf then
+ if (sign = '1') then
+ dst := '1' & (dst'high-1 downto dst'low+1 => '0') & '1';
+ else
+ dst := '0' & (dst'high-1 downto dst'low => '1');
+ end if;
+ end if;
+
+ end if;
+
+ return dst;
+
+ end reshape;
+
+ -------------------------------------------------------------
+ function reshape
+ (
+ src : sfixed_t;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t is
+
+ begin
+ return reshape(src, sproto(nbits, nbits_int), rnd_mode, sat_mode);
+
+ end reshape;
+
+ -------------------------------------------------------------
+ -- Constuctor helpers
+ -------------------------------------------------------------
+ function uproto (nbits : integer; nbits_int : integer) return ufixed_t is
+ constant result : ufixed_t (nbits_int-1 downto nbits_int-nbits) := (others => '0');
+ begin
+ return result(nbits_int-1 downto nbits_int-nbits);
+ end uproto;
+
+ -------------------------------------------------------------
+ function sproto (nbits : integer; nbits_int : integer) return sfixed_t is
+ constant result : sfixed_t (nbits_int downto nbits_int-nbits+1) := (others => '0');
+ begin
+ return result(nbits_int downto nbits_int-nbits+1);
+ end sproto;
+
+ -------------------------------------------------------------
+ function uproto (a : ufixed_t; op : character; b : ufixed_t) return ufixed_t is
+ constant result : ufixed_t(a'high + b'high + 4 downto a'low + b'low - 4) := (others => '0');
+ variable hi, lo : integer := 0;
+
+ begin
+
+ case op is
+ when '+' =>
+ hi := max(a'high, b'high);
+ if a'high = b'high then
+ hi := hi + 1;
+ end if;
+ lo := min(a'low, b'low);
+
+ when '-' =>
+ hi := max(a'high, b'high);
+ lo := min(a'low, b'low);
+
+ when '*' =>
+ hi := a'high + b'high + 1;
+ if (a'high < 0 or b'high < 0) then
+ if (hi > -1) then
+ hi := hi-1;
+ end if;
+ end if;
+ lo := hi - a'length - b'length + 1;
+
+ when others => null;
+
+ end case;
+
+ return result(hi downto lo);
+ end uproto;
+
+ -------------------------------------------------------------
+ function sproto (a : sfixed_t; op : character; b : sfixed_t) return sfixed_t is
+ constant result : sfixed_t(a'high + b'high + 4 downto a'low + b'low - 4) := (others => '0');
+ variable hi, lo : integer := 0;
+
+ begin
+
+ case op is
+ when '+' =>
+ hi := max(a'high, b'high);
+ if a'high = b'high then
+ hi := hi + 1;
+ end if;
+ lo := min(a'low, b'low);
+
+ when '-' =>
+ hi := max(a'high, b'high);
+ lo := min(a'low, b'low);
+
+ when '*' =>
+ hi := a'high + b'high;
+ if (a'high = 0 or b'high = 0) then
+ if (hi > 0) then
+ hi := hi-1;
+ end if;
+ end if;
+ lo := hi - a'length - b'length + 1;
+
+ when others => null;
+
+ end case;
+
+ return result(hi downto lo);
+ end sproto;
+
+ -------------------------------------------------------------
+ -- Type conversions
+ -------------------------------------------------------------
+ -- ufixed <= ufixed
+ function to_ufixed(src : ufixed_t) return ufixed_t is
+ begin
+ return to_ufixed(src, src);
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- ufixed <= sfixed
+ function to_ufixed(src : sfixed_t) return ufixed_t is
+ variable dst : ufixed_t(src'range) := (others => '0');
+ begin
+ dst := ufixed_t(abs(src));
+ return dst(src'high-1 downto src'low);
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= sfixed
+ function to_sfixed(src : sfixed_t) return sfixed_t is
+ begin
+ return src;
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= ufixed
+ function to_sfixed(src : ufixed_t) return sfixed_t is
+ variable dst : sfixed_t(src'high+1 downto src'low) := (others => '0');
+ begin
+ dst(src'range) := sfixed_t(src);
+ return dst;
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ -- ufixed <= ufixed
+ function to_ufixed
+ (
+ src : ufixed_t;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t is
+ begin
+ return reshape(src, nbits, nbits_int, rnd_mode, sat_mode);
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- ufixed <= ufixed
+ function to_ufixed
+ (
+ src : ufixed_t;
+ proto : ufixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t is
+ begin
+ return reshape(src, proto, rnd_mode, sat_mode);
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= sfixed
+ function to_sfixed
+ (
+ src : sfixed_t;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t is
+ begin
+ return reshape(src, nbits, nbits_int, rnd_mode, sat_mode);
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= sfixed
+ function to_sfixed
+ (
+ src : sfixed_t;
+ proto : sfixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t is
+ begin
+ return reshape(src, proto, rnd_mode, sat_mode);
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ -- ufixed <= integer
+ function to_ufixed (src : integer; nbits : integer; nbits_int : integer) return ufixed_t is
+ begin
+ return to_ufixed(src, uproto(nbits, nbits_int));
+
+ end to_ufixed;
+
+ function to_ufixed (src : integer; proto : ufixed_t) return ufixed_t is
+ begin
+ return to_ufixed(to_unsigned(src, proto'length), proto);
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- ufixed <= unsigned
+ function to_ufixed (src : unsigned; nbits : integer; nbits_int : integer) return ufixed_t is
+ begin
+ return to_ufixed(src, uproto(nbits, nbits_int));
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- ufixed <= unsigned
+ function to_ufixed(src : unsigned; proto : ufixed_t) return ufixed_t is
+ variable dst : ufixed_t(proto'high downto proto'low) := (others => '0');
+ begin
+
+ dst(dst'low + min(dst'length, src'length)-1 downto dst'low) := ufixed_t(src(min(dst'length, src'length)-1 downto 0));
+
+ return dst;
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= integer
+ function to_sfixed (src : integer; nbits : integer; nbits_int : integer) return sfixed_t is
+ begin
+ return to_sfixed(src, sproto(nbits, nbits_int));
+
+ end to_sfixed;
+
+ function to_sfixed (src : integer; proto : sfixed_t) return sfixed_t is
+ begin
+
+ return to_sfixed(to_signed(src, proto'length), proto);
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= signed
+ function to_sfixed (src : signed; nbits : integer; nbits_int : integer) return sfixed_t is
+ begin
+ return to_sfixed(src, sproto(nbits, nbits_int));
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= signed
+ function to_sfixed(src : signed; proto : sfixed_t) return sfixed_t is
+ variable dst : sfixed_t(proto'high downto proto'low) := (others => '0');
+ begin
+
+ dst(dst'low + min(dst'length, src'length)-2 downto dst'low) := sfixed_t(src(min(dst'length, src'length)-2 downto 0));
+ dst(dst'high) := src(src'high);
+
+ return dst;
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ function to_ufixed (src : STD_LOGIC_VECTOR; proto : ufixed_t) return ufixed_t is
+ variable result : ufixed_t (proto'left downto proto'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_ufixed (unsigned(src), proto);
+ return result;
+ end if;
+
+ end function to_ufixed;
+
+ -------------------------------------------------------------
+ function to_ufixed (src : STD_LOGIC_VECTOR; nbits : integer; nbits_int : integer) return ufixed_t is
+ begin
+ return to_ufixed(src, uproto(nbits, nbits_int));
+
+ end function to_ufixed;
+
+ -------------------------------------------------------------
+ function to_sfixed (src : STD_LOGIC_VECTOR; proto : sfixed_t) return sfixed_t is
+ variable result : sfixed_t (proto'left downto proto'right);
+ begin
+ if (result'length < 1) then
+ return result;
+ else
+ result := to_sfixed (signed(src), proto);
+ return result;
+ end if;
+
+ end function to_sfixed;
+
+ -------------------------------------------------------------
+ function to_sfixed (src : STD_LOGIC_VECTOR; nbits : integer; nbits_int : integer) return sfixed_t is
+ begin
+ return to_sfixed(src, sproto(nbits, nbits_int));
+
+ end to_sfixed;
+ -------------------------------------------------------------
+
+ -- ufixed <= real
+ function to_ufixed
+ (
+ src : real;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t is
+
+ constant nbits_ext : integer := nbits + 1;
+ constant fix_hi : integer := nbits_int - 1;
+ constant fix_lo : integer := nbits_int - nbits_ext;
+
+ variable dst : ufixed_t (fix_hi downto fix_lo) := (others => '0');
+ variable i : integer := 0;
+ variable remain : real := 0.0;
+
+ begin
+
+ if (nbits_int < 0) then
+ assert false report "to_ufixed: Bad dual point (N integer bits < 0)" severity error;
+ end if;
+
+ if ((2.0**nbits_int - 1.0) < ipart(abs(src))) then
+-- assert ASSERT_NO_WARN report "to_ufixed: Overflow (" & REAL'image(src) & ") " severity warning;
+-- print_info(dst, "dst: ");
+ end if;
+
+ remain := abs(src);
+ for i in dst'range loop
+ if remain >= 2.0**i then
+ dst(i) := '1';
+ remain := remain - 2.0**i;
+ else
+ dst(i) := '0';
+ end if;
+ end loop;
+
+ return to_ufixed(dst, nbits, nbits_int, rnd_mode, sat_mode);
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= real
+ function to_sfixed
+ (
+ src : real;
+ proto : sfixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t is
+
+ variable utmp : ufixed_t(proto'high-1 downto proto'low) := (others => '0');
+ variable dst : sfixed_t(proto'high downto proto'low) := (others => '0');
+
+ begin
+ utmp := to_ufixed(src, utmp, rnd_mode, sat_mode);
+ if (src < 0.0) then
+ dst := -to_sfixed(utmp);
+ else
+ dst := to_sfixed(utmp);
+ end if;
+
+ return dst;
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ -- ufixed <= real
+ function to_ufixed
+ (
+ src : real;
+ proto : ufixed_t;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return ufixed_t is
+ begin
+ return to_ufixed(src, proto'length, proto'high+1, rnd_mode, sat_mode);
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= real
+ function to_sfixed
+ (
+ src : real;
+ nbits : integer;
+ nbits_int : integer;
+ rnd_mode : round_mode_t := default_round_mode;
+ sat_mode : saturate_mode_t := default_saturate_mode
+ ) return sfixed_t is
+ begin
+ return to_sfixed(src, sproto(nbits, nbits_int), rnd_mode, sat_mode);
+ end to_sfixed;
+
+ -------------------------------------------------------------------------------
+ -- ufixed <= ufixed_array(i)
+ function to_ufixed(src : ufixed_array_t; index : integer) return ufixed_t is
+ variable dst : ufixed_t(src'range(2));
+ begin
+ for j in src'range(2) loop
+ dst(j) := src(index, j);
+ end loop;
+
+ return dst;
+
+ end to_ufixed;
+
+ -------------------------------------------------------------------------------
+ -- sfixed <= sfixed_array(i)
+ function to_sfixed(src : sfixed_array_t; index : integer) return sfixed_t is
+ variable dst : sfixed_t(src'range(2));
+ begin
+ for j in src'range(2) loop
+ dst(j) := src(index, j);
+ end loop;
+
+ return dst;
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ -- ufixed <= string
+ function to_ufixed (src : string) return ufixed_t is
+
+ variable i, j, nbits, nbits_int, nbits_frac : integer := 0;
+ variable dst : unsigned(src'length downto 0) := (others => '0');
+ variable dp_found : boolean := false;
+ begin
+
+ for i in src'reverse_range loop
+ case src(i) is
+ when '.' =>
+ if dp_found then
+ assert false report "More than one DP not found." severity error;
+ else
+ dp_found := true;
+ nbits_frac := j;
+ end if;
+
+ when '0' => dst(nbits) := '0'; nbits := nbits + 1; j := j + 1;
+ when '1' => dst(nbits) := '1'; nbits := nbits + 1; j := j + 1;
+ when others =>
+ assert false report "Illegal character in binary string." severity error;
+
+ end case;
+
+ end loop ;
+ if not dp_found then
+ assert ASSERT_NO_WARN report "DP not found. Using left alignment." severity warning;
+ end if;
+
+ nbits_int := nbits - nbits_frac;
+
+ return to_ufixed(dst(nbits-1 downto 0), nbits, nbits_int);
+
+ end to_ufixed;
+
+ -------------------------------------------------------------
+ -- sfixed <= string
+ function to_sfixed (src : string) return sfixed_t is
+
+ variable i, j, nbits, nbits_int, nbits_frac : integer := 0;
+ variable dst : signed(src'length downto 0) := (others => '0');
+ variable dp_found : boolean := false;
+ variable is_neg : boolean := false;
+ begin
+
+ is_neg := src(src'left) = '-';
+
+ for i in src'reverse_range loop
+ case src(i) is
+ when '-' => null;
+ when '+' => null;
+
+ when '.' =>
+ if dp_found then
+ assert false report "More than one DP not found." severity error;
+ else
+ dp_found := true;
+ nbits_frac := j;
+ end if;
+
+ when '0' => dst(nbits) := '0'; nbits := nbits + 1; j := j + 1;
+ when '1' => dst(nbits) := '1'; nbits := nbits + 1; j := j + 1;
+ when others =>
+ assert false report "Illegal character in binary string." severity error;
+ end case;
+ end loop ;
+ nbits := nbits + 1;
+
+ if not dp_found then
+ assert ASSERT_NO_WARN report "DP not found. Using left alignment." severity warning;
+ end if;
+
+ nbits_int := nbits - nbits_frac-1;
+
+ if is_neg then
+ dst(nbits-1 downto 0) := -dst(nbits-1 downto 0);
+ end if;
+
+ return to_sfixed(dst(nbits-1 downto 0), nbits, nbits_int);
+
+ end to_sfixed;
+
+ -------------------------------------------------------------
+ function to_unsigned (src : ufixed_t) return UNSIGNED is
+ subtype t is UNSIGNED(src'high - src'low downto 0);
+ variable slv : t;
+ begin
+ slv := t(src);
+ return UNSIGNED(to_X01(std_logic_vector(slv)));
+
+ end function to_unsigned;
+
+ -------------------------------------------------------------
+ function to_signed (src : sfixed_t) return SIGNED is
+ subtype t is SIGNED(src'high - src'low downto 0);
+ variable slv : t;
+ begin
+ slv := t(src);
+ return SIGNED(to_X01(std_logic_vector(slv)));
+
+ end function to_signed;
+
+ -------------------------------------------------------------
+ -- integer <= ufixed
+ function to_integer (src : ufixed_t) return integer is
+ begin
+ return to_integer(to_unsigned(src));
+ end to_integer;
+
+ -------------------------------------------------------------
+ -- integer <= sfixed
+ function to_integer (src : sfixed_t) return integer is
+ begin
+ return to_integer(to_signed(src));
+ end to_integer;
+
+ -------------------------------------------------------------
+ -- to_real
+ function to_real(src : ufixed_t) return real is
+ variable dst : real := 0.0;
+ begin
+ for i in src'range loop
+ if (src(i) = '1') then
+ dst := dst + real(2.0**i);
+ end if;
+ end loop;
+ return dst;
+
+ end to_real;
+
+ -------------------------------------------------------------
+ function to_real(src : sfixed_t) return real is
+ variable dst : real := 0.0;
+ begin
+ dst := to_real(to_ufixed(src));
+
+ if (src(src'high) = '1') then
+ dst := -dst;
+ end if;
+
+ return dst;
+
+ end to_real;
+
+ -------------------------------------------------------------
+ -- to_slv
+ function to_slv (src : ufixed_t) return STD_LOGIC_VECTOR is
+ subtype t is STD_LOGIC_VECTOR (src'high - src'low downto 0);
+ variable slv : t;
+ begin
+ if src'length < 1 then
+ return NSLV;
+ end if;
+ slv := t (src);
+ return slv;
+
+ end function to_slv;
+
+ -------------------------------------------------------------
+ -- to_slv
+ function to_slv (src : sfixed_t) return STD_LOGIC_VECTOR is
+ subtype t is STD_LOGIC_VECTOR (src'high - src'low downto 0);
+ variable slv : t;
+ begin
+ if src'length < 1 then
+ return NSLV;
+ end if;
+ slv := t (src);
+ return slv;
+
+ end function to_slv;
+
+ -------------------------------------------------------------
+ function to_string(src : ufixed_t) return string is
+ variable str : string(src'length+1 downto 1) := (others => '0');
+ variable i, j : integer := 0;
+
+ begin
+ j := src'length+1;
+ for i in src'high downto 0 loop
+ if (src(i) = '1') then
+ str(j) := '1';
+ end if;
+ j := j - 1;
+ end loop;
+
+ str(j) := '.';
+ j := j - 1;
+
+ for i in -1 downto src'low loop
+ if (src(i) = '1') then
+ str(j) := '1';
+ end if;
+ j := j - 1;
+ end loop;
+
+ return str;
+
+ end to_string;
+
+ -------------------------------------------------------------
+ function to_string(src : sfixed_t) return string is
+ variable str : string(src'length+1 downto 1) := (others => '0');
+ variable i, j, start : integer := 0;
+ variable strlen : integer := 0;
+ variable src_abs : sfixed_t(src'range) := (others => '0');
+
+ begin
+ if (src'high < 0) then
+ assert false report "Illegal signed fix point number" severity error;
+ end if;
+
+ start := src'high;
+ strlen := src'length;
+
+ j := src'length+1;
+ if (src(start) = '1') then
+ str(j) := '-';
+ j := j - 1;
+ start := start - 1;
+ strlen := strlen + 1;
+ end if;
+
+ src_abs := abs(src);
+
+ for i in start downto 0 loop
+ if (src_abs(i) = '1') then
+ str(j) := '1';
+ end if;
+ j := j - 1;
+ end loop;
+
+ str(j) := '.';
+ j := j - 1;
+
+ for i in -1 downto src'low loop
+ if (src_abs(i) = '1') then
+ str(j) := '1';
+ end if;
+ j := j - 1;
+ end loop;
+
+ return str(strlen downto 1);
+
+ end to_string;
+
+ -------------------------------------------------------------
+ function to_string(src : std_logic_vector) return string is
+ variable str : string(src'length downto 1) := (others => '0');
+ variable i : integer := 0;
+
+ begin
+ for i in src'range loop
+ if (src(i) = '1') then
+ str(i+1) := '1';
+ end if;
+ end loop;
+
+ return str;
+
+ end to_string;
+
+ -------------------------------------------------------------
+ -- Binary Operators
+ -------------------------------------------------------------
+ function "sla" (src : ufixed_t; count : integer) return ufixed_t is
+ variable result : ufixed_t (src'high downto src'low) := (others => '0');
+
+ begin
+ if (count = 0) then
+ result := src;
+ elsif (count < 0) then
+ result := src sra -count;
+ elsif (count < src'length) then
+ result(src'high downto src'low) := src(src'high-count downto src'low) & (count-1 downto 0 => '0');
+ end if;
+ return result;
+
+ end "sla";
+
+ -------------------------------------------------------------
+ function "sla" (src : sfixed_t; count : integer) return sfixed_t is
+ variable result : sfixed_t (src'high downto src'low) := (others => '0');
+ variable sign : std_logic := '0';
+
+ begin
+ sign := src(src'high);
+ if (count = 0) then
+ result := src;
+ elsif (count < 0) then
+ result := src sra -count;
+ elsif (count < src'length-1) then
+ result(src'high downto src'low) := sign & src(src'high-count-1 downto src'low) & (count-1 downto 0 => '0');
+ end if;
+ return result;
+
+ end "sla";
+
+ -------------------------------------------------------------
+ function "sra" (src : ufixed_t; count : integer) return ufixed_t is
+ variable result : ufixed_t (src'high downto src'low) := (others => '0');
+
+ begin
+ if (count = 0) then
+ result := src;
+ elsif (count < 0) then
+ result := src sla -count;
+ elsif (count < src'length) then
+ result(src'high downto src'low) := (count-1 downto 0 => '0') & src(src'high downto src'low + count);
+ end if;
+ return result;
+
+ end "sra";
+
+ -------------------------------------------------------------
+ function "sra" (src : sfixed_t; count : integer) return sfixed_t is
+ variable result : sfixed_t (src'high downto src'low) := (others => '0');
+ variable res_slv, src_slv : signed (src'length-1 downto 0) := (others => '0');
+ variable sign, do_sub : std_logic := '0';
+
+ begin
+ src_slv := to_signed(src);
+ sign := src(src'high);
+ do_sub := src(src'high) and src(src'low);
+ if (count = 0) then
+ result := src;
+ elsif (count < 0) then
+ result := src sla -count;
+ elsif (count < src'length-1) then
+ res_slv := (count downto 0 => sign) & src_slv(src'length-2 downto count);
+ if (do_sub = '1') then
+ result(src'high downto src'low) := to_sfixed(res_slv+1, result);
+ else
+ result(src'high downto src'low) := to_sfixed(res_slv, result);
+ end if;
+ end if;
+ return result;
+
+ end "sra";
+
+ -------------------------------------------------------------
+ function "*" (a : ufixed_t; b : ufixed_t) return ufixed_t is
+ variable result : ufixed_t (uproto(a,'*',b)'high downto uproto(a,'*',b)'low);
+
+ begin
+ if (a'high < 0 and b'high >= 0) or (a'high >= 0 and b'high < 0) then
+ result := to_ufixed(to_unsigned(a) * to_unsigned(b), result) sla 1;
+ else
+ result := to_ufixed(to_unsigned(a) * to_unsigned(b), result);
+ end if;
+ return result;
+
+ end "*";
+
+ -------------------------------------------------------------
+ function "*" (a : sfixed_t; b : sfixed_t) return sfixed_t is
+ variable result : sfixed_t (sproto(a,'*',b)'high downto sproto(a,'*',b)'low);
+
+ begin
+ if (a'high = 0 and b'high > 0) or (a'high > 0 and b'high = 0) then
+ result := to_sfixed(signed(a) * signed(b), result) sla 2;
+ else
+ result := to_sfixed(signed(a) * signed(b), result) sla 1;
+ end if;
+ return result;
+
+ end "*";
+
+ -------------------------------------------------------------
+ function "*" (a : ufixed_t; b : sfixed_t) return sfixed_t is
+
+ begin
+ return to_sfixed(a) * b;
+
+ end "*";
+
+ -------------------------------------------------------------
+ function "*" (a : sfixed_t; b : ufixed_t) return sfixed_t is
+
+ begin
+ return b * a;
+
+ end "*";
+
+ -------------------------------------------------------------
+ function "+" (a : ufixed_t; b : ufixed_t) return ufixed_t is
+ variable result : ufixed_t (uproto(a,'+',b)'high downto uproto(a,'+',b)'low);
+
+ begin
+ result := ufixed_t(unsigned(reshape(a, result)) + unsigned(reshape(b, result)));
+ return result;
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : sfixed_t; b : sfixed_t) return sfixed_t is
+ variable result : sfixed_t (sproto(a,'+',b)'high downto sproto(a,'+',b)'low);
+
+ begin
+ result := to_sfixed(signed(reshape(a,result)) + signed(reshape(b,result)), result);
+-- result := to_sfixed(signed(a) + signed(b), result);
+ return result;
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : ufixed_t; b : sfixed_t) return sfixed_t is
+
+ begin
+ return to_sfixed(a) + b;
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : sfixed_t; b : ufixed_t) return sfixed_t is
+
+ begin
+ return b + a;
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : ufixed_t; b : unsigned) return ufixed_t is
+
+ begin
+
+ return ufixed_t(unsigned(a) + b);
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : sfixed_t; b : signed) return sfixed_t is
+
+ begin
+
+ return sfixed_t(signed(a) + b);
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : ufixed_t; b : integer) return ufixed_t is
+
+ begin
+
+ return ufixed_t(unsigned(a) + to_unsigned(b, a'length));
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : sfixed_t; b : integer) return sfixed_t is
+
+ begin
+
+ return sfixed_t(signed(a) + to_signed(b, a'length));
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : ufixed_t; b : std_logic) return ufixed_t is
+ variable result : ufixed_t (a'high downto a'low);
+ variable buns : unsigned(a'length-1 downto 0);
+
+ begin
+ buns := (a'length-1 downto 1 => '0') & b;
+ result := ufixed_t(to_unsigned(a) + buns);
+ return result;
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "+" (a : sfixed_t; b : std_logic) return sfixed_t is
+ variable result : sfixed_t (a'high downto a'low);
+ variable bs : signed(a'length-1 downto 0);
+
+ begin
+ bs := (a'length-1 downto 1 => '0') & b;
+ result := sfixed_t(to_signed(a) + bs);
+ return result;
+
+ end "+";
+
+ -------------------------------------------------------------
+ function "-" (a : ufixed_t; b : ufixed_t) return ufixed_t is
+ variable result : ufixed_t (uproto(a,'-',b)'high downto uproto(a,'-',b)'low);
+ begin
+ result := to_ufixed(to_sfixed(a) - to_sfixed(b));
+ return result;
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : sfixed_t; b : sfixed_t) return sfixed_t is
+ variable result : sfixed_t (sproto(a,'-',b)'high downto sproto(a,'-',b)'low);
+
+ begin
+ result := to_sfixed(signed(reshape(a,result)) - signed(reshape(b,result)), result);
+ return result;
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : ufixed_t; b : sfixed_t) return sfixed_t is
+ begin
+ return to_sfixed(a) - b;
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : sfixed_t; b : ufixed_t) return sfixed_t is
+
+ begin
+ return a - to_sfixed(b);
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : ufixed_t; b : unsigned) return ufixed_t is
+
+ begin
+ return ufixed_t(unsigned(a) - b);
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : sfixed_t; b : signed) return sfixed_t is
+
+ begin
+ return sfixed_t(signed(a) - b);
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : ufixed_t; b : integer) return ufixed_t is
+
+ begin
+
+ return ufixed_t(unsigned(a) - to_unsigned(b, a'length));
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : sfixed_t; b : integer) return sfixed_t is
+
+ begin
+
+ return sfixed_t(signed(a) - to_signed(b, a'length));
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : ufixed_t; b : std_logic) return ufixed_t is
+ variable result : ufixed_t (a'high downto a'low);
+ variable buns : unsigned(a'length-1 downto 0);
+
+ begin
+ buns := (a'length-1 downto 1 => '0') & b;
+ result := ufixed_t(unsigned(a) - buns);
+ return result;
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (a : sfixed_t; b : std_logic) return sfixed_t is
+ variable result : sfixed_t (a'high downto a'low);
+ variable bs : signed(a'length-1 downto 0);
+
+ begin
+ bs := (a'length-1 downto 1 => '0') & b;
+ result := sfixed_t(signed(a) - bs);
+ return result;
+
+ end "-";
+
+ -------------------------------------------------------------
+ -- Unary Operators
+ -------------------------------------------------------------
+ function "abs" (src : sfixed_t) return sfixed_t is
+ begin
+ return to_sfixed(abs(signed(src)), src);
+
+ end "abs";
+
+ -------------------------------------------------------------
+ function "-" (src : ufixed_t) return sfixed_t is
+ begin
+ return -to_sfixed(src);
+
+ end "-";
+
+ -------------------------------------------------------------
+ function "-" (src : sfixed_t) return sfixed_t is
+ begin
+ return to_sfixed(-signed(src), src);
+
+ end "-";
+
+ -------------------------------------------------------------
+ -- Binary Equality
+ -------------------------------------------------------------
+ function "=" (a : ufixed_t; b : ufixed_t) return boolean is
+ variable ta, tb: ufixed_t(max(a'high, b'high) downto min(a'low, b'low));
+ begin
+ ta := (others => '0');
+ tb := (others => '0');
+ ta := to_ufixed(a, ta);
+ tb := to_ufixed(b, tb);
+ return to_unsigned(ta) = to_unsigned(tb);
+
+ end "=";
+
+ -------------------------------------------------------------
+ function "=" (a : sfixed_t; b : sfixed_t) return boolean is
+ variable ta, tb: sfixed_t(max(a'high, b'high) downto min(a'low, b'low));
+ begin
+ ta := (others => '0');
+ tb := (others => '0');
+ ta := to_sfixed(a, ta);
+ tb := to_sfixed(b, tb);
+ return to_signed(ta) = to_signed(tb);
+
+ end "=";
+
+ -------------------------------------------------------------
+ function "=" (a : ufixed_t; b : sfixed_t) return boolean is
+ begin
+ return to_sfixed(a) = b;
+ end "=";
+
+ -------------------------------------------------------------
+ function "=" (a : sfixed_t; b : ufixed_t) return boolean is
+ begin
+ return b = a;
+ end "=";
+
+ -------------------------------------------------------------
+ -- Binary Inequality
+ -------------------------------------------------------------
+ function "/=" (a : ufixed_t; b : ufixed_t) return boolean is
+ begin
+ return not (a = b);
+
+ end "/=";
+
+ -------------------------------------------------------------
+ function "/=" (a : sfixed_t; b : sfixed_t) return boolean is
+ begin
+ return not (a = b);
+
+ end "/=";
+
+ -------------------------------------------------------------
+ function "/=" (a : ufixed_t; b : sfixed_t) return boolean is
+ begin
+ return not (a = b);
+ end "/=";
+
+ -------------------------------------------------------------
+ function "/=" (a : sfixed_t; b : ufixed_t) return boolean is
+ begin
+ return not (a = b);
+ end "/=";
+
+ -------------------------------------------------------------
+ -- Binary less than
+ -------------------------------------------------------------
+ function "<" (a : ufixed_t; b : ufixed_t) return boolean is
+ variable ta, tb: ufixed_t(max(a'high, b'high) downto min(a'low, b'low));
+ begin
+ ta := (others => '0');
+ tb := (others => '0');
+ ta := to_ufixed(a, ta);
+ tb := to_ufixed(b, tb);
+ return to_unsigned(ta) < to_unsigned(tb);
+
+ end "<";
+
+ -------------------------------------------------------------
+ function "<" (a : sfixed_t; b : sfixed_t) return boolean is
+ variable ta, tb: sfixed_t(max(a'high, b'high) downto min(a'low, b'low));
+ begin
+ ta := (others => '0');
+ tb := (others => '0');
+ ta := to_sfixed(a, ta);
+ tb := to_sfixed(b, tb);
+ return to_signed(ta) < to_signed(tb);
+
+ end "<";
+
+ -------------------------------------------------------------
+ function "<" (a : ufixed_t; b : sfixed_t) return boolean is
+ begin
+ return to_sfixed(a) < b;
+
+ end "<";
+
+ -------------------------------------------------------------
+ function "<" (a : sfixed_t; b : ufixed_t) return boolean is
+ begin
+ return a < to_sfixed(b);
+
+ end "<";
+
+ -------------------------------------------------------------
+ -- Binary greater than
+ -------------------------------------------------------------
+ function ">" (a : ufixed_t; b : ufixed_t) return boolean is
+ variable ta, tb: ufixed_t(max(a'high, b'high) downto min(a'low, b'low));
+ begin
+ ta := (others => '0');
+ tb := (others => '0');
+ ta := to_ufixed(a, ta);
+ tb := to_ufixed(b, tb);
+ return to_unsigned(ta) > to_unsigned(tb);
+
+ end ">";
+
+ -------------------------------------------------------------
+ function ">" (a : sfixed_t; b : sfixed_t) return boolean is
+ variable ta, tb: sfixed_t(max(a'high, b'high) downto min(a'low, b'low));
+ begin
+ ta := (others => '0');
+ tb := (others => '0');
+ ta := to_sfixed(a, ta);
+ tb := to_sfixed(b, tb);
+ return to_signed(ta) > to_signed(tb);
+
+ end ">";
+
+ -------------------------------------------------------------
+ function ">" (a : ufixed_t; b : sfixed_t) return boolean is
+ begin
+ return to_sfixed(a) > b;
+ end ">";
+
+ -------------------------------------------------------------
+ function ">" (a : sfixed_t; b : ufixed_t) return boolean is
+ begin
+ return a > to_sfixed(b);
+ end ">";
+
+ -------------------------------------------------------------
+ -- Binary less equal than
+ -------------------------------------------------------------
+ function "<=" (a : ufixed_t; b : ufixed_t) return boolean is
+ begin
+ return not (a > b);
+ end "<=";
+
+ function "<=" (a : sfixed_t; b : sfixed_t) return boolean is
+ begin
+ return not (a > b);
+ end "<=";
+
+ function "<=" (a : ufixed_t; b : sfixed_t) return boolean is
+ begin
+ return not (a > b);
+ end "<=";
+
+ function "<=" (a : sfixed_t; b : ufixed_t) return boolean is
+ begin
+ return not (a > b);
+ end "<=";
+
+ -------------------------------------------------------------
+ -- Binary greater or equal than
+ -------------------------------------------------------------
+ function ">=" (a : ufixed_t; b : ufixed_t) return boolean is
+ begin
+ return not (a < b);
+ end ">=";
+
+ function ">=" (a : sfixed_t; b : sfixed_t) return boolean is
+ begin
+ return not (a < b);
+ end ">=";
+
+ function ">=" (a : ufixed_t; b : sfixed_t) return boolean is
+ begin
+ return not (a < b);
+ end ">=";
+
+ function ">=" (a : sfixed_t; b : ufixed_t) return boolean is
+ begin
+ return not (a < b);
+ end ">=";
+
+ -------------------------------------------------------------
+ -- Misc. Operators
+ -------------------------------------------------------------
+ function ipart (src : ufixed_t) return ufixed_t is
+ begin
+ return src(src'high downto 0);
+ end ipart;
+
+ function fpart (src : ufixed_t) return ufixed_t is
+ begin
+ return src(-1 downto src'low);
+ end fpart;
+
+ function ipart (src : sfixed_t) return sfixed_t is
+ begin
+ return src(src'high-1 downto 0);
+ end ipart;
+
+ function fpart (src : sfixed_t) return sfixed_t is
+ begin
+ return src(-1 downto src'low);
+ end fpart;
+
+ -------------------------------------------------------------
+ -- Print functions
+ -------------------------------------------------------------
+ procedure print_info(src : in ufixed_t; prefix : in string) is
+ variable L : line;
+
+ begin
+ write (L, prefix & "'length = ");write (L, src'length);
+ writeline (output, L);
+
+ write (L, prefix & "'high(left) = ");
+ write (L, src'high);
+ write (L, '(');
+ write (L, src'left);
+ write (L, ')');
+ writeline (output, L);
+
+ write (L, prefix & "'low(right) = ");
+ write (L, src'low);
+ write (L, '(');
+ write (L, src'right);
+ write (L, ')');
+ writeline (output, L);
+
+ write (L, prefix & "'value = B");write (L, to_string(src));
+ writeline (output, L);
+
+ write (L, prefix & "'value = ");write (L, to_real(src));
+ writeline (output, L);
+
+ -- write (L, prefix & "'cmsb = ");write (L, cmsb(src));
+ -- writeline (output, L);
+
+ -- write (L, prefix & "'clsb = ");write (L, clsb(src));
+ -- writeline (output, L);
+
+ writeline (output, L);
+
+ end print_info;
+
+ -------------------------------------------------------------
+ procedure print_info(src : in sfixed_t; prefix : in string) is
+ variable L : line;
+
+ begin
+ write (L, prefix & "'length = ");write (L, src'length);
+ writeline (output, L);
+
+ write (L, prefix & "'high(left) = ");
+ write (L, src'high);
+ write (L, '(');
+ write (L, src'left);
+ write (L, ')');
+ writeline (output, L);
+
+ write (L, prefix & "'low(right) = ");
+ write (L, src'low);
+ write (L, '(');
+ write (L, src'right);
+ write (L, ')');
+ writeline (output, L);
+
+ write (L, prefix & "'value = B");write (L, to_string(src));
+ writeline (output, L);
+
+ write (L, prefix & "'value = ");write (L, to_real(src));
+ writeline (output, L);
+
+ -- write (L, prefix & "'cmsb = ");write (L, cmsb(src));
+ -- writeline (output, L);
+
+ -- write (L, prefix & "'clsb = ");write (L, clsb(src));
+ -- writeline (output, L);
+
+ writeline (output, L);
+
+ end print_info;
+
+ -------------------------------------------------------------
+ procedure print_info(src : in string; prefix : in string) is
+ variable L : line;
+
+ begin
+ write (L, prefix & "'length = ");write (L, src'length);
+ writeline (output, L);
+
+ write (L, prefix & "'high(left) = ");
+ write (L, src'high);
+ write (L, '(');
+ write (L, src'left);
+ write (L, ')');
+ writeline (output, L);
+
+ write (L, prefix & "'low(right) = ");
+ write (L, src'low);
+ write (L, '(');
+ write (L, src'right);
+ write (L, ')');
+ writeline (output, L);
+
+ writeline (output, L);
+
+ end print_info;
+
+ -------------------------------------------------------------
+ -- Helpers
+ -------------------------------------------------------------
+ -- Count significant bits for integer part
+ function cmsb(src : ufixed_t) return integer is
+ variable j, i : integer := src'high;
+ begin
+ for i in src'range loop
+ if src(i) = '1' then
+ exit;
+ end if;
+ j := j - 1;
+ end loop;
+
+ -- LRM nachlesen: hier is i=src'high re-initialisert
+
+ return j;
+
+ end cmsb;
+
+ -------------------------------------------------------------
+ -- Count significant bits for fractional part
+ function clsb(src : ufixed_t) return integer is
+ variable j, i : integer := src'low;
+ begin
+ for i in src'reverse_range loop
+ if src(i) = '1' then
+ exit;
+ end if;
+ j := j + 1;
+ end loop;
+
+ -- LRM nachlesen: hier is i=src'low re-initialisert
+
+ return j;
+
+ end clsb;
+
+ -------------------------------------------------------------
+ function MIN (X, Y: INTEGER) return INTEGER is
+ variable res : integer := X;
+ begin
+ if Y < X then
+ res := Y;
+ end if;
+
+ return res;
+
+ end MIN;
+
+ -------------------------------------------------------------
+ function MAX (X, Y: INTEGER) return INTEGER is
+ variable res : integer := X;
+ begin
+ if Y > X then
+ res := Y;
+ end if;
+
+ return res;
+
+ end MAX;
+
+ -------------------------------------------------------------
+ function "MOD" (X, Y: in REAL ) return REAL is
+ -- Description:
+ -- See function declaration in IEEE Std 1076.2-1996
+ -- Notes:
+ -- a) Returns 0.0 on error
+
+ variable XNEGATIVE : BOOLEAN := X < 0.0;
+ variable YNEGATIVE : BOOLEAN := Y < 0.0;
+ variable VALUE : REAL;
+ begin
+ -- Check validity of input arguments
+ if (Y = 0.0) then
+ assert FALSE
+ report "MOD(X, 0.0) is undefined"
+ severity ERROR;
+ return 0.0;
+ end if;
+
+ -- Compute value
+ if ( XNEGATIVE ) then
+ if ( YNEGATIVE ) then
+ VALUE := X + (FLOOR(ABS(X)/ABS(Y)))*ABS(Y);
+ else
+ VALUE := X + (CEIL(ABS(X)/ABS(Y)))*ABS(Y);
+ end if;
+ else
+ if ( YNEGATIVE ) then
+ VALUE := X - (CEIL(ABS(X)/ABS(Y)))*ABS(Y);
+ else
+ VALUE := X - (FLOOR(ABS(X)/ABS(Y)))*ABS(Y);
+ end if;
+ end if;
+
+ return VALUE;
+
+ end "MOD";
+
+ -------------------------------------------------------------
+ -- misc. conversion
+ function ipart(src : real) return real is
+ begin
+ return floor(src);
+
+ end ipart;
+
+ -------------------------------------------------------------
+ function fpart(src : real) return real is
+ begin
+ return src - floor(src);
+
+ end fpart;
+
+ -------------------------------------------------------------
+ function or_red (arg : STD_LOGIC_VECTOR)
+ return STD_LOGIC is
+ variable Upper, Lower : STD_LOGIC;
+ variable Half : INTEGER;
+ variable BUS_int : STD_LOGIC_VECTOR (arg'length - 1 downto 0);
+ variable Result : STD_LOGIC;
+ begin
+ if (arg'length < 1) then -- In the case of a NULL range
+ Result := '0';
+ else
+ BUS_int := to_ux01 (arg);
+ if (BUS_int'length = 1) then
+ Result := BUS_int (BUS_int'left);
+ elsif (BUS_int'length = 2) then
+ Result := BUS_int (BUS_int'right) or BUS_int (BUS_int'left);
+ else
+ Half := (BUS_int'length + 1) / 2 + BUS_int'right;
+ Upper := or_red (BUS_int (BUS_int'left downto Half));
+ Lower := or_red (BUS_int (Half - 1 downto BUS_int'right));
+ Result := Upper or Lower;
+ end if;
+ end if;
+ return Result;
+
+ end function or_red;
+
+ -------------------------------------------------------------
+ function and_red (arg : STD_LOGIC_VECTOR)
+ return STD_LOGIC is
+ variable Upper, Lower : STD_LOGIC;
+ variable Half : INTEGER;
+ variable BUS_int : STD_LOGIC_VECTOR (arg'length - 1 downto 0);
+ variable Result : STD_LOGIC;
+ begin
+ if (arg'length < 1) then -- In the case of a NULL range
+ Result := '1';
+ else
+ BUS_int := to_ux01 (arg);
+ if (BUS_int'length = 1) then
+ Result := BUS_int (BUS_int'left);
+ elsif (BUS_int'length = 2) then
+ Result := BUS_int (BUS_int'right) and BUS_int (BUS_int'left);
+ else
+ Half := (BUS_int'length + 1) / 2 + BUS_int'right;
+ Upper := and_red (BUS_int (BUS_int'left downto Half));
+ Lower := and_red (BUS_int (Half - 1 downto BUS_int'right));
+ Result := Upper and Lower;
+ end if;
+ end if;
+ return Result;
+
+ end function and_red;
+
+ -------------------------------------------------------------
+ function xor_red (arg : STD_LOGIC_VECTOR) return STD_ULOGIC is
+ variable Upper, Lower : STD_ULOGIC;
+ variable Half : INTEGER;
+ variable BUS_int : STD_LOGIC_VECTOR (arg'length - 1 downto 0);
+ variable Result : STD_ULOGIC := '0'; -- In the case of a NULL range
+ begin
+ if (arg'length >= 1) then
+ BUS_int := to_ux01 (arg);
+ if (BUS_int'length = 1) then
+ Result := BUS_int (BUS_int'left);
+ elsif (BUS_int'length = 2) then
+ Result := BUS_int(BUS_int'right) xor BUS_int(BUS_int'left);
+ else
+ Half := (BUS_int'length + 1) / 2 + BUS_int'right;
+ Upper := xor_red (BUS_int (BUS_int'left downto Half));
+ Lower := xor_red (BUS_int (Half - 1 downto BUS_int'right));
+ Result := Upper xor Lower;
+ end if;
+ end if;
+ return Result;
+
+ end function xor_red;
+
+ -------------------------------------------------------------
+ -- Reduction operators, same as numeric_std functions
+ function and_red(arg : ufixed_t) return STD_ULOGIC is
+ begin
+ return and_red (to_slv(arg));
+ end function and_red;
+
+ function nand_red(arg : ufixed_t) return STD_ULOGIC is
+ begin
+ return not and_red (to_slv(arg));
+ end function nand_red;
+
+ function or_red(arg : ufixed_t) return STD_ULOGIC is
+ begin
+ return or_red (to_slv(arg));
+ end function or_red;
+
+ function nor_red(arg : ufixed_t) return STD_ULOGIC is
+ begin
+ return not or_red (to_slv(arg));
+ end function nor_red;
+
+ function xor_red(arg : ufixed_t) return STD_ULOGIC is
+ begin
+ return xor_red (to_slv(arg));
+ end function xor_red;
+
+ function xnor_red(arg : ufixed_t) return STD_ULOGIC is
+ begin
+ return not xor_red (to_slv(arg));
+ end function xnor_red;
+
+ function and_red(arg : sfixed_t) return STD_ULOGIC is
+ begin
+ return and_red (to_slv(arg));
+ end function and_red;
+
+ function nand_red(arg : sfixed_t) return STD_ULOGIC is
+ begin
+ return not and_red (to_slv(arg));
+ end function nand_red;
+
+ function or_red(arg : sfixed_t) return STD_ULOGIC is
+ begin
+ return or_red (to_slv(arg));
+ end function or_red;
+
+ function nor_red(arg : sfixed_t) return STD_ULOGIC is
+ begin
+ return not or_red (to_slv(arg));
+ end function nor_red;
+
+ function xor_red(arg : sfixed_t) return STD_ULOGIC is
+ begin
+ return xor_red (to_slv(arg));
+ end function xor_red;
+
+ function xnor_red(arg : sfixed_t) return STD_ULOGIC is
+ begin
+ return not xor_red (to_slv(arg));
+ end function xnor_red;
+
+ -------------------------------------------------------------
+
+end; -- package body fixed_ja;
diff --git a/lib/jasm/cg.inc.jsm b/lib/jasm/cg.inc.jsm
new file mode 100644
index 0000000..01c36c4
--- /dev/null
+++ b/lib/jasm/cg.inc.jsm
@@ -0,0 +1,72 @@
+; -------------------------------------------------
+; lcd.inc.jsm
+; -------------------------------------------------
+; needs xio-address equates for
+; reg_cg_char_addr: equ 0xXX ; RW
+; reg_cg_line_addr: equ 0xXX ; RW
+; reg_cg_data: equ 0xXX ; RW
+; reg_cg_ctrl: equ 0xXX ; WO
+
+; needs delay.inc.jsm
+
+; -------------------------------------------------
+cg_clr_line: push R0
+ mov R0, 2
+ xout (reg_cg_ctrl), R0
+ pop R0
+ ret
+
+; -------------------------------------------------
+cg_clr_screen: push R0
+ mov R0, 1
+ xout (reg_cg_ctrl), R0
+ pop R0
+ ret
+
+; -------------------------------------------------
+; R0 : char address
+; R1 : line address
+cg_set_addr: call cg_wait_rdy
+ xout (reg_cg_line_addr), R1
+ xout (reg_cg_char_addr), R0
+ ret
+
+; -------------------------------------------------
+; R0 : character
+cg_putchar: call cg_wait_rdy
+ xout (reg_cg_data), R0
+ ret
+
+; -------------------------------------------------
+; R1 : ptr to string
+cg_puts: push R0
+cg_p_lp: movx R0, (R1)
+ inc R1
+ tst R0
+ jz ex_cgp
+ call cg_putchar
+ jmp cg_p_lp
+ex_cgp: pop R0
+ ret
+
+; -------------------------------------------------
+; R1 : ptr to string
+cg_clr_puts: call cg_clr_line
+ call cg_puts
+ ret
+
+; -------------------------------------------------
+; R1 : ptr to string
+cg_puts_clr: call cg_puts
+ call cg_clr_line
+ ret
+
+; -------------------------------------------------
+cg_wait_rdy: push R0
+cg_wr_lp: xin R0, (reg_hwstat)
+ and R0, 0x02
+ jz cg_wr_lp
+ pop R0
+ ret
+
+; -------------------------------------------------
diff --git a/lib/jasm/cregs.inc.jsm b/lib/jasm/cregs.inc.jsm
new file mode 100644
index 0000000..06d39d9
--- /dev/null
+++ b/lib/jasm/cregs.inc.jsm
@@ -0,0 +1,7 @@
+; JCPU On-Chip register
+cpu_revision: equ 0x00 ; RO
+cpu_control: equ 0x01 ; R/W
+cpu_status: equ 0x02 ; RO
+cpu_int_ctrl: equ 0x03 ; RW
+cpu_cmem_high: equ 0x04 ; RW
+cpu_stack_high: equ 0x05 ; RW
diff --git a/lib/jasm/delays.inc.jsm b/lib/jasm/delays.inc.jsm
new file mode 100644
index 0000000..6f002ee
--- /dev/null
+++ b/lib/jasm/delays.inc.jsm
@@ -0,0 +1,64 @@
+; -------------------------------------------------
+; Delays
+; -------------------------------------------------
+delay1s: push R15
+ mov R15, 10
+loop1s: call delay100ms
+ dec R15
+ jnz loop1s
+ pop R15
+ ret
+
+delay100ms: push R15
+ mov R15, 10
+loop100ms: call delay10ms
+ dec R15
+ jnz loop100ms
+ pop R15
+ ret
+
+delay10ms: push R15
+ mov R15, 10
+loop10ms: call delay1ms
+ dec R15
+ jnz loop10ms
+ pop R15
+ ret
+
+delay1ms: push R15
+ mov R15, 10
+loop1ms: call delay100us
+ dec R15
+ jnz loop1ms
+ pop R15
+ ret
+
+delay100us: push R15
+ mov R15, 10
+loop100us: call delay10us
+ dec R15
+ jnz loop100us
+ pop R15
+ ret
+
+delay10us: push R15
+ mov R15, 99
+loop10us: nop
+ nop
+ nop
+ dec R15
+ jnz loop10us
+ pop R15
+ ret
+
+delay1us: push R15
+ mov R15, 9
+loop1us: nop
+ nop
+ nop
+ dec R15
+ jnz loop1us
+ pop R15
+ ret
+
+; -------------------------------------------------
diff --git a/lib/jasm/lcd.inc.jsm b/lib/jasm/lcd.inc.jsm
new file mode 100644
index 0000000..d2883fa
--- /dev/null
+++ b/lib/jasm/lcd.inc.jsm
@@ -0,0 +1,208 @@
+; -------------------------------------------------
+; lcd.inc.jsm
+; -------------------------------------------------
+; needs xmem-address definition for
+; - lcd_port (LCD-Base)
+
+; needs delay.inc.jsm
+
+; -------------------------------------------------
+lcd_cmd: equ 0x00
+lcd_rd: equ 0x20
+lcd_data: equ 0x40
+lcd_enable: equ 0x80
+
+LCD_CMD_Z1: equ 0x80
+LCD_CMD_Z2: equ 0xC0
+LCD_CMD_CLEAR: equ 0x01
+
+; -------------------------------------------------
+; Init LCD
+; -------------------------------------------------
+LCD_init: mov R2, 0x00
+ mov R0, 0x03
+ call _write_lcd
+ call delay10ms
+ mov R2, 0x00
+ mov R0, 0x03
+ call _write_lcd
+ call delay10ms
+
+ mov R2, 0x00
+ mov R0, 0x02
+ call _write_lcd
+ call delay1ms
+
+ ; 1. Function set: 4-Bit mode, two display lines
+ mov R0, 0x28
+ call LCD_writecmd
+
+ ; 2. Display on, no cursor
+ mov R0, 0x0C
+ call LCD_writecmd
+
+ ; 3. Cursor shift during write
+ mov R0, 0x06
+ call LCD_writecmd
+
+ ; 4. Display clear
+ mov R0, 0x01
+ call LCD_writecmd
+
+ ret
+
+; -------------------------------------------------
+; LCD_waitbsy
+; -------------------------------------------------
+LCD_waitbsy: push R0
+bsy_loop: call LCD_readstat
+ and R0, 0x80
+ jz ex_bsy
+ call delay1us
+ jmp bsy_loop
+ex_bsy: pop R0
+ ret
+
+; -------------------------------------------------
+; LCD_writecmd
+; -------------------------------------------------
+; R0 = cmd
+LCD_writeaddr:
+LCD_writecmd: push R2
+ mov R2, lcd_cmd
+ call LCD_write
+ pop R2
+ ret
+
+; -------------------------------------------------
+; LCD_putsx
+; -------------------------------------------------
+; R1 = address of null-terminated string in XMEM
+LCD_putsx: push R0
+putsx_loop: movx R0, (R1)
+ inc R1
+ tst R0
+ jz putsx_ex
+ call LCD_writechar
+ jmp putsx_loop
+putsx_ex: pop R0
+ ret
+
+; -------------------------------------------------
+; LCD_putsc
+; -------------------------------------------------
+; R1 = address of null-terminated string in CMEM
+LCD_putsc: push R0
+putsc_loop: movc R0, (R1)
+ inc R1
+ tst R0
+ jz putsc_ex
+ call LCD_writechar
+ jmp putsc_loop
+putsc_ex: pop R0
+ ret
+
+; -------------------------------------------------
+; LCD_writechar
+; -------------------------------------------------
+; R0 = char
+LCD_writedata:
+LCD_writechar: push R2
+ mov R2, lcd_data
+ call LCD_write
+ pop R2
+ ret
+
+; -------------------------------------------------
+; LCD_write
+; -------------------------------------------------
+; R0 = input
+; R2 = register
+LCD_write: call LCD_waitbsy
+ push R0
+ swap R0
+ call _write_lcd
+ pop R0
+ call _write_lcd
+ ret
+
+; -------------------------------------------------
+; LCD_readstat
+; -------------------------------------------------
+; R0 = status
+LCD_readstat: push R2
+ mov R2, lcd_cmd
+ call LCD_read
+ pop R2
+ ret
+
+; -------------------------------------------------
+; LCD_read
+; -------------------------------------------------
+; R0 = output
+; R2 = register
+LCD_read: call _read_lcd
+ swap R0
+ push R0
+ call _read_lcd
+ pop R2
+ or R0, R2
+ ret
+
+; -------------------------------------------------
+; _write
+; -------------------------------------------------
+; R0 = input
+_write_lcd: push R1
+
+ and R0, 0x0F
+ mov R1, R0
+ or R1, R2
+ xout (lcd_port), R1
+ call delay1us
+
+ mov R1, R0
+ or R1, R2
+ or R1, lcd_enable
+ xout (lcd_port), R1
+ call delay1us
+
+ mov R1, R0
+ or R1, R2
+ xout (lcd_port), R1
+ call delay1us
+
+ or R1, lcd_rd
+ xout (lcd_port), R1
+
+ pop R1
+ ret
+
+; -------------------------------------------------
+; _read
+; -------------------------------------------------
+; R0 = output
+_read_lcd: push R1
+
+ mov R1, lcd_rd
+ or R1, R2
+ xout (lcd_port), R1
+ call delay1us
+
+ mov R1, lcd_rd
+ or R1, R2
+ or R1, lcd_enable
+ xout (lcd_port), R1
+ call delay1us
+ xin R0, (lcd_port)
+ and R0, 0x0F
+
+ mov R1, lcd_rd
+ or R1, R2
+ xout (lcd_port), R1
+ call delay1us
+
+ pop R1
+ ret
+
+
\ No newline at end of file
diff --git a/lib/jasm/mul8x8.inc.jsm b/lib/jasm/mul8x8.inc.jsm
new file mode 100644
index 0000000..2f66e2a
--- /dev/null
+++ b/lib/jasm/mul8x8.inc.jsm
@@ -0,0 +1,42 @@
+; -------------------------------------------------
+; mul8x8.inc.jsm
+; -------------------------------------------------
+
+; -------------------------------------------------
+; Parameter:
+; R0 : operand 1
+; R1 : operand 2
+; Return:
+; R0 : product low
+; R1 : product high
+mul8x8: push R2
+ push R3
+ push R4
+
+ mov R4, R1
+ mov R1, 0
+ mov R2, 0
+ mov R3, 0
+
+loop1: cmp R4, 0x01
+ jeq ende1
+
+ shr R4
+ jnc next1
+
+ add R2, R0
+ addc R3, R1
+
+next1: shl R0
+ rolc R1
+ jmp loop1
+
+ende1: add R0, R2
+ addc R1, R3
+
+ pop R4
+ pop R3
+ pop R2
+ ret
+
+; -------------------------------------------------
diff --git a/lib/jasm/uart.inc.jsm b/lib/jasm/uart.inc.jsm
new file mode 100644
index 0000000..df557b1
--- /dev/null
+++ b/lib/jasm/uart.inc.jsm
@@ -0,0 +1,32 @@
+; -------------------------------------------------
+; uart.inc.jsm
+; -------------------------------------------------
+; needs xmem-address definition for
+; - uart_status (Status register)
+; - uart_data (Data register)
+
+; -------------------------------------------------
+; sout
+; -------------------------------------------------
+; R0 = input
+sout: push R1
+sout1: xin R1, (uart_status)
+ and R1, 0x02
+ jnz sout1
+ xout (uart_data), R0
+ pop R1
+ ret
+
+; -------------------------------------------------
+; sin
+; -------------------------------------------------
+; R0 = output
+sin: push R1
+sin1: xin R1, (uart_status)
+ and R1, 0x10
+ jz sin1
+ xin R0, (uart_data)
+ pop R1
+ ret
+
+; -------------------------------------------------
diff --git a/lib/jasm/utils.inc.jsm b/lib/jasm/utils.inc.jsm
new file mode 100644
index 0000000..f354d7c
--- /dev/null
+++ b/lib/jasm/utils.inc.jsm
@@ -0,0 +1,32 @@
+; -------------------------------------------------
+; utils.inc.jsm
+; -------------------------------------------------
+
+
+; -------------------------------------------------
+; Parameter
+; R0 : Bin value in lower nibble
+; Return
+; R0 : Hex character representing lower nibble
+nibble2hex: and R0, 0x0F
+ cmp R0, 0x0A
+ jlt isNum1
+ add R0, 0x07
+isNum1: add R0, 0x30
+ ret
+
+; -------------------------------------------------
+; Parameter
+; R0 : Bin value
+; Return
+; R0 : Hex character high
+; R1 : Hex character low
+bin2hex: push R0
+ call nibble2hex
+ mov R1, R0
+ pop R0
+ swap R0
+ call nibble2hex
+ ret
+
+; -------------------------------------------------
diff --git a/lib/misc/debounce.vhd b/lib/misc/debounce.vhd
new file mode 100644
index 0000000..79317a5
--- /dev/null
+++ b/lib/misc/debounce.vhd
@@ -0,0 +1,91 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 19:34:24 10/23/05
+-- Design Name:
+-- Module Name: debounce - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/debounce.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+
+entity debounce is
+ Generic ( ncyc_latency : integer := 100);
+ Port ( rst : in std_logic;
+ clk : in std_logic;
+ input : in std_logic;
+ output : out std_logic);
+end debounce;
+
+architecture Behavioral of debounce is
+
+type debounce_state_t is (init_st, wait_st, rel_st);
+signal debounce_cs : debounce_state_t;
+signal debounce_ns : debounce_state_t;
+signal count : integer range 0 to ncyc_latency;
+signal input_last : std_logic;
+
+begin
+
+ debounce_clk: process(rst, clk, debounce_ns, debounce_cs, input)
+ begin
+ if (rst = '1') then
+ count <= 0;
+ output <= input;
+ input_last <= input;
+ else
+ if rising_edge(clk) then
+ debounce_cs <= debounce_ns;
+ if (debounce_cs = wait_st) then
+ if (count /= 0) then
+ count <= count - 1;
+ end if;
+ else
+ count <= ncyc_latency;
+ if (debounce_cs = rel_st) then
+ output <= input;
+ input_last <= input;
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ debounce_in: process(rst, clk, input, input_last, debounce_cs, count)
+ begin
+ debounce_ns <= debounce_cs;
+ case debounce_cs is
+ when init_st =>
+ if (input /= input_last) then
+ debounce_ns <= wait_st;
+ end if;
+ when wait_st =>
+ if (count = 0) then
+ debounce_ns <= rel_st;
+ end if;
+ when others =>
+ debounce_ns <= init_st;
+ end case;
+ end process;
+
+end Behavioral;
diff --git a/lib/misc/debounce2.vhd b/lib/misc/debounce2.vhd
new file mode 100644
index 0000000..206a61c
--- /dev/null
+++ b/lib/misc/debounce2.vhd
@@ -0,0 +1,142 @@
+-------------------------------------------------
+-- Signal Debouncer
+-- Jeff Bazinet
+-- February 14, 2002
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/debounce2.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+
+
+library ieee;
+use ieee.std_logic_1164.all;
+library lpm;
+use lpm.lpm_components.lpm_counter;
+
+
+entity debounce is
+ generic(BUFFER_WIDTH: positive:= 30;
+ CLOCK_DIV: positive:= 15
+ );
+ port( clock: in std_logic;
+ reset: in std_logic;
+ signal_in: in std_logic;
+ signal_out: out std_logic
+ );
+end entity debounce;
+
+
+architecture rtl of debounce is
+
+ ---------------------------------------------------------------
+ -- SIGNAL DECLARATION
+ ---------------------------------------------------------------
+
+ -- General
+ signal reset_n: std_logic;
+
+ -- SLOW CLOCK GENERATION
+ signal clock_reg: std_logic_vector(CLOCK_DIV-1 downto 0);
+ signal clock_reg_high: std_logic_vector(CLOCK_DIV-1 downto 1);
+ signal clock_slow: std_logic;
+ signal clock_slow_wire: std_logic;
+
+ -- DATA BUFFER FILL
+ signal counter_reg: std_logic_vector(BUFFER_WIDTH-1 downto 0);
+ signal data_buffer_reg: std_logic_vector(BUFFER_WIDTH-1 downto 0);
+
+ -- CHECK FOR DEBOUNCE STABILITY
+ signal stable: std_logic;
+ signal stable_old: std_logic;
+ signal stable_state_reg:std_logic_vector(BUFFER_WIDTH-1 downto 0);
+
+ -- PUSH BUTTON ENABLE
+ signal button_pushed: std_logic;
+
+ begin
+
+ ---------------------------------------------------------------
+ -- SLOW CLOCK GENERATION
+ ---------------------------------------------------------------
+
+ COUNTER_1: lpm_counter
+ generic map (lpm_width => CLOCK_DIV)
+ port map (
+ clock => clock,
+ sclr => reset_n,
+ cout => clock_slow_wire
+ );
+
+ process (clock) is
+ begin
+
+ clock_slow <= clock_slow_wire;
+
+ end process;
+
+ ---------------------------------------------------------------
+ -- DATA BUFFER FILL
+ ---------------------------------------------------------------
+
+ process (clock) is
+ begin
+
+ if (reset = '0') then
+ -- Initialization
+ data_buffer_reg <= (others => '1');
+ elsif rising_edge(clock_slow) then
+ data_buffer_reg <= data_buffer_reg(BUFFER_WIDTH-2 downto 0) & signal_in;
+ end if;
+
+ end process;
+
+ ---------------------------------------------------------------
+ -- CHECK FOR DEBOUNCE STABILITY
+ ---------------------------------------------------------------
+
+ process (clock) is
+ begin
+
+ if (reset = '0') then
+ -- Initialization
+ stable <= '0';
+ stable_old <= '0';
+ stable_state_reg <= (others => '0');
+ elsif rising_edge(clock) then
+ if (data_buffer_reg = stable_state_reg) then
+ stable <= '1';
+ stable_state_reg <= (others => '0');
+ else
+ stable <= '0';
+ end if;
+ stable_old <= stable;
+ end if;
+
+ end process;
+
+ ---------------------------------------------------------------
+ -- PUSH BUTTON ENABLE
+ ---------------------------------------------------------------
+
+ process (clock) is
+ begin
+
+ if (reset = '0') then
+ -- Initialization
+ button_pushed <= '0';
+ elsif rising_edge(clock) then
+ if (stable_old = '0' and stable = '1') then
+ button_pushed <= '1';
+ else
+ button_pushed <= '0';
+ end if;
+ end if;
+
+ end process;
+
+ ---------------------------------------------------------------
+ ---------------------------------------------------------------
+
+ signal_out <= button_pushed;
+ reset_n <= not reset;
+
+end rtl;
diff --git a/lib/misc/dpram_1w1r.vhd b/lib/misc/dpram_1w1r.vhd
new file mode 100644
index 0000000..dee0972
--- /dev/null
+++ b/lib/misc/dpram_1w1r.vhd
@@ -0,0 +1,79 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: Dual-ported register file with asynchrous read
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/dpram_1w1r.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+entity dpram_1w1r is
+ Generic (
+ addr_width : integer := 3;
+ data_width : integer := 8
+ );
+ Port (
+ clka : in STD_LOGIC;
+ clkb : in STD_LOGIC;
+ en_a : in STD_LOGIC;
+ en_b : in STD_LOGIC;
+ we_a : in STD_LOGIC;
+ addr_a : in unsigned (addr_width-1 downto 0);
+ addr_b : in unsigned (addr_width-1 downto 0);
+ din_a : in unsigned (data_width-1 downto 0);
+ dout_b : out unsigned (data_width-1 downto 0)
+ );
+end dpram_1w1r;
+
+architecture Behavioral of dpram_1w1r is
+
+ constant depth : integer := 2**addr_width;
+ type RAMtype is array (0 to depth-1) of unsigned (data_width-1 downto 0);
+ signal RAM : RAMtype;
+
+begin
+
+process (clka)
+begin
+if clka'event and clka = '1' then
+ if en_a = '1' then
+ if we_a = '1' then
+ RAM(to_integer(addr_a)) <= din_a;
+ end if;
+ end if;
+end if;
+end process;
+
+process (clkb)
+begin
+if clkb'event and clkb = '1' then
+ if en_b = '1' then
+ dout_b <= RAM(to_integer(addr_b));
+ end if;
+end if;
+end process;
+
+
+end Behavioral;
+
diff --git a/lib/misc/dpram_1w1r_dist.vhd b/lib/misc/dpram_1w1r_dist.vhd
new file mode 100644
index 0000000..e07555c
--- /dev/null
+++ b/lib/misc/dpram_1w1r_dist.vhd
@@ -0,0 +1,84 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: Dual-ported register file with asynchrous read
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/dpram_1w1r_dist.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+entity dpram_1w1r_dist is
+ Generic
+ (
+ addr_width : integer := 3;
+ data_width : integer := 8
+ );
+ Port
+ (
+ clka : in STD_LOGIC;
+ clkb : in STD_LOGIC;
+ en_a : in STD_LOGIC;
+ en_b : in STD_LOGIC;
+ we_a : in STD_LOGIC;
+ addr_a : in unsigned (addr_width-1 downto 0);
+ addr_b : in unsigned (addr_width-1 downto 0);
+ din_a : in unsigned (data_width-1 downto 0);
+ dout_b : out unsigned (data_width-1 downto 0)
+ );
+end dpram_1w1r_dist;
+
+architecture Behavioral of dpram_1w1r_dist is
+
+ constant depth : integer := 2**addr_width;
+ type RAMtype is array (0 to depth-1) of unsigned (data_width-1 downto 0);
+ signal RAM : RAMtype;
+
+ attribute ram_style : string;
+ attribute ram_style of RAM: signal is "distributed";
+
+begin
+
+process (clka)
+ begin
+ if clka'event and clka = '1' then
+ if en_a = '1' then
+ if we_a = '1' then
+ RAM(to_integer(addr_a)) <= din_a;
+ end if;
+ end if;
+ end if;
+end process;
+
+process (clkb)
+ begin
+ if clkb'event and clkb = '1' then
+ if en_b = '1' then
+ dout_b <= RAM(to_integer(addr_b));
+ end if;
+ end if;
+end process;
+
+
+end Behavioral;
+
diff --git a/lib/misc/dpram_2w2r.vhd b/lib/misc/dpram_2w2r.vhd
new file mode 100644
index 0000000..33152f3
--- /dev/null
+++ b/lib/misc/dpram_2w2r.vhd
@@ -0,0 +1,88 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: Dual-ported register file with asynchrous read
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/dpram_2w2r.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+entity dpram_2w2r is
+ Generic
+ (
+ addr_width : integer := 3;
+ data_width : integer := 8
+ );
+ Port
+ (
+ clk_a : in STD_LOGIC;
+ clk_b : in STD_LOGIC;
+ en_a : in STD_LOGIC;
+ en_b : in STD_LOGIC;
+ we_a : in STD_LOGIC;
+ we_b : in STD_LOGIC;
+ addr_a : in unsigned (addr_width-1 downto 0);
+ addr_b : in unsigned (addr_width-1 downto 0);
+ din_a : in unsigned (data_width-1 downto 0);
+ din_b : in unsigned (data_width-1 downto 0);
+ dout_a : out unsigned (data_width-1 downto 0);
+ dout_b : out unsigned (data_width-1 downto 0)
+ );
+end dpram_2w2r;
+
+architecture Behavioral of dpram_2w2r is
+
+ constant depth : integer := 2**addr_width;
+ type RAMtype is array (0 to depth-1) of unsigned (data_width-1 downto 0);
+ shared variable RAM : RAMtype;
+
+begin
+
+process (clk_a)
+begin
+if clk_a'event and clk_a = '1' then
+ if en_a = '1' then
+ dout_a <= RAM(to_integer(addr_a));
+ if we_a = '1' then
+ RAM(to_integer(addr_a)) := din_a;
+ end if;
+ end if;
+end if;
+end process;
+
+process (clk_b)
+begin
+if clk_b'event and clk_b = '1' then
+ if en_b = '1' then
+ dout_b <= RAM(to_integer(addr_b));
+ if we_b = '1' then
+ RAM(to_integer(addr_b)) := din_b;
+ end if;
+ end if;
+end if;
+end process;
+
+
+end Behavioral;
+
diff --git a/lib/misc/dpram_2w2r_virtex4.vhd b/lib/misc/dpram_2w2r_virtex4.vhd
new file mode 100644
index 0000000..6d8bc83
--- /dev/null
+++ b/lib/misc/dpram_2w2r_virtex4.vhd
@@ -0,0 +1,211 @@
+-------------------------------------------------------------------------
+-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL
+-- This file: Dual-ported register file with asynchrous read
+
+-- Copyright (C) 2007 J. Ahrensfeld
+
+-- This library is free software; you can redistribute it and/or
+-- modify it under the terms of the GNU Lesser General Public
+-- License as published by the Free Software Foundation; either
+-- version 2.1 of the License, or (at your option) any later version.
+
+-- This library is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+-- Lesser General Public License for more details.
+
+-- You should have received a copy of the GNU Lesser General Public
+-- License along with this library; if not, write to the Free Software
+-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+-- For questions and ideas, please contact the author at jens@jayfield.org
+
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/dpram_2w2r_virtex4.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.numeric_std.ALL;
+
+library UNISIM;
+use UNISIM.vcomponents.all;
+
+entity dpram_2w2r is
+ Generic
+ (
+ addr_width : integer := 3;
+ data_width : integer := 8
+ );
+ Port
+ (
+ clk_a : in STD_LOGIC;
+ clk_b : in STD_LOGIC;
+ en_a : in STD_LOGIC;
+ en_b : in STD_LOGIC;
+ we_a : in STD_LOGIC;
+ we_b : in STD_LOGIC;
+ addr_a : in unsigned (addr_width-1 downto 0);
+ addr_b : in unsigned (addr_width-1 downto 0);
+ din_a : in unsigned (data_width-1 downto 0);
+ din_b : in unsigned (data_width-1 downto 0);
+ dout_a : out unsigned (data_width-1 downto 0);
+ dout_b : out unsigned (data_width-1 downto 0)
+ );
+end dpram_2w2r;
+
+architecture Structure of dpram_2w2r is
+
+ signal do_a : std_logic_vector(31 downto 0);
+ signal do_b : std_logic_vector(31 downto 0);
+ signal di_a : std_logic_vector(31 downto 0);
+ signal di_b : std_logic_vector(31 downto 0);
+ signal ad_a : std_logic_vector(14 downto 0);
+ signal ad_b : std_logic_vector(14 downto 0);
+ signal wr_a : std_logic_vector(3 downto 0);
+ signal wr_b : std_logic_vector(3 downto 0);
+
+begin
+
+-- RAMB16: 16k+2k Parity Paramatizable block RAM
+-- Virtex-4
+-- Xilinx HDL Libraries Guide, version 9.1i
+RAMB16_inst : RAMB16
+generic map
+(
+ DOA_REG => 0, -- Optional output registers on the A port (0 or 1)
+ DOB_REG => 0, -- Optional output registers on the B port (0 or 1)
+ INIT_A => X"000000000", -- Initial values on A output port
+ INIT_B => X"000000000", -- Initial values on B output port
+ INVERT_CLK_DOA_REG => FALSE, -- Invert clock on A port output registers (TRUE or FALSE)
+ INVERT_CLK_DOB_REG => FALSE, -- Invert clock on B port output registers (TRUE or FALSE)
+ RAM_EXTENSION_A => "NONE", -- "UPPER", "LOWER" or "NONE" when cascaded
+ RAM_EXTENSION_B => "NONE", -- "UPPER", "LOWER" or "NONE" when cascaded
+ READ_WIDTH_A => 9, -- Valid values are 1,2,4,9,18 or 36
+ READ_WIDTH_B => 9, -- Valid values are 1,2,4,9,18 or 36
+ SIM_COLLISION_CHECK => "ALL", -- Collision check enable "ALL", "WARNING_ONLY",
+
+ -- "GENERATE_X_ONLY" or "NONE"
+ SRVAL_A => X"000000000", -- Port A output value upon SSR assertion
+ SRVAL_B => X"000000000", -- Port B output value upon SSR assertion
+ WRITE_MODE_A => "READ_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE
+ WRITE_MODE_B => "READ_FIRST", -- WRITE_FIRST, READ_FIRST or NO_CHANGE
+ WRITE_WIDTH_A => 9, -- Valid values are 1,2,4,9,18 or 36
+ WRITE_WIDTH_B => 9, -- Valid values are 1,2,4,9,18 or 36
+
+ -- The following INIT_xx declarations specify the initial contents of the RAM
+ INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_03 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_04 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_05 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_06 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_07 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_08 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_09 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_10 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_11 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_12 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_13 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_14 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_15 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_16 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_17 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_18 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_19 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_1A => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_1B => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_1C => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_1D => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_1E => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_1F => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_20 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_21 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_22 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_23 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_24 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_25 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_26 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_27 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_28 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_29 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_2A => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_2B => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_2C => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_2D => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_2E => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_2F => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_30 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_31 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_32 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_33 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_34 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_35 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_36 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_37 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_38 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_39 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_3A => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_3B => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_3C => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_3D => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_3E => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INIT_3F => X"0000000000000000000000000000000000000000000000000000000000000000",
+
+ -- The next set of INITP_xx are for the parity bits
+ INITP_00 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INITP_01 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INITP_02 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INITP_03 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INITP_04 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INITP_05 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INITP_06 => X"0000000000000000000000000000000000000000000000000000000000000000",
+ INITP_07 => X"0000000000000000000000000000000000000000000000000000000000000000"
+)
+port map
+(
+ CASCADEOUTA => open, -- 1-bit cascade output
+ CASCADEOUTB => open, -- 1-bit cascade output
+ DOA => do_a, -- 32-bit A port Data Output
+ DOB => do_b, -- 32-bit B port Data Output
+ DOPA => open, -- 4-bit A port Parity Output
+ DOPB => open, -- 4-bit B port Parity Output
+ ADDRA => ad_a, -- 15-bit A Port Address Input
+ ADDRB => ad_b, -- 15-bit B Port Address Input
+ CASCADEINA => '0', -- 1-bit cascade A input
+ CASCADEINB => '0', -- 1-bit cascade B input
+ CLKA => clk_a, -- Port A Clock
+ CLKB => clk_b, -- Port B Clock
+ DIA => di_a, -- 32-bit A port Data Input
+ DIB => di_b, -- 32-bit B port Data Input
+ DIPA => "0000", -- 4-bit A port parity Input
+ DIPB => "0000", -- 4-bit B port parity Input
+ ENA => en_a, -- 1-bit A port Enable Input
+ ENB => en_b, -- 1-bit B port Enable Input
+ REGCEA => '0', -- 1-bit A port register enable input
+ REGCEB => '0', -- 1-bit B port register enable input
+ SSRA => '0', -- 1-bit A port Synchronous Set/Reset Input
+ SSRB => '0', -- 1-bit B port Synchronous Set/Reset Input
+ WEA => wr_a, -- 4-bit A port Write Enable Input
+ WEB => wr_b -- 4-bit B port Write Enable Input
+);
+-- End of RAMB16_inst instantiation
+
+ dout_a <= unsigned(do_a(7 downto 0));
+ dout_b <= unsigned(do_b(7 downto 0));
+ di_a <= X"000000" & std_logic_vector(din_a);
+ di_b <= X"000000" & std_logic_vector(din_b);
+ ad_a <= '0' & std_logic_vector(addr_a) & "000";
+ ad_b <= '0' & std_logic_vector(addr_b) & "000";
+ wr_a <= (3 downto 0 => we_a);
+ wr_b <= (3 downto 0 => we_b);
+
+end Structure;
+
diff --git a/lib/misc/lcd_port.vhd b/lib/misc/lcd_port.vhd
new file mode 100644
index 0000000..11f97eb
--- /dev/null
+++ b/lib/misc/lcd_port.vhd
@@ -0,0 +1,69 @@
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/lcd_port.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+ ------------------------------------------------------------------
+entity lcd_port is
+ Port (
+ rst : in std_logic;
+ clk : in std_logic;
+ we : in std_logic;
+ din : in unsigned(7 downto 0);
+ dout : out unsigned(7 downto 0);
+ lcd_d : inout unsigned(3 downto 0);
+ lcd_e : out std_logic;
+ lcd_rs : out std_logic;
+ lcd_rw : out std_logic
+ );
+ end lcd_port;
+
+architecture Behavioral of lcd_port is
+
+ constant clcd_e : integer := 7;
+ constant clcd_rs : integer := 6;
+ constant clcd_rw : integer := 5;
+
+ type lcd_t is record
+ d : unsigned(3 downto 0);
+ e : std_logic;
+ rs : std_logic;
+ rw : std_logic;
+ end record;
+
+ ------------------------------------------------------------------
+ begin
+
+ proc_lcd_port:
+ process(rst, clk)
+ variable vlcd : lcd_t;
+ begin
+ if (rst = '1') then
+ dout <= (others => '0');
+ vlcd.d := (others => '0');
+ vlcd.e := '0';
+ vlcd.rw := '1';
+ vlcd.rs := '0';
+ elsif rising_edge(clk) then
+ dout <= unsigned("0000" & lcd_d);
+ if we = '1' then
+ vlcd.d := din(3 downto 0);
+ vlcd.e := din(clcd_e);
+ vlcd.rs := din(clcd_rs);
+ vlcd.rw := din(clcd_rw);
+ end if;
+ end if;
+ if vlcd.rw = '0' then
+ lcd_d <= unsigned(vlcd.d);
+ else
+ lcd_d <= (others => 'Z');
+ end if;
+ lcd_e <= vlcd.e;
+ lcd_rs <= vlcd.rs;
+ lcd_rw <= vlcd.rw;
+ end process;
+ ------------------------------------------------------------------
+
+end Behavioral;
diff --git a/lib/misc/oneshot.vhd b/lib/misc/oneshot.vhd
new file mode 100644
index 0000000..2f5d8bd
--- /dev/null
+++ b/lib/misc/oneshot.vhd
@@ -0,0 +1,223 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 21:52:19 10/22/05
+-- Design Name:
+-- Module Name: oneshot - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/oneshot.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+-- Component Template
+--
+-- COMPONENT oneshot
+-- GENERIC (mode : integer);
+-- PORT(
+-- rst : IN std_logic;
+-- clk : IN std_logic;
+-- input : IN std_logic;
+-- output : OUT std_logic
+-- );
+-- END COMPONENT;
+--
+-- Instantation Template
+--
+-- oneshot_int: oneshot
+-- GENERIC MAP (
+-- mode => 1)
+-- PORT MAP(
+-- rst => ,
+-- clk => ,
+-- input => ,
+-- output =>
+-- );
+--
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+
+entity oneshot is
+ Generic ( mode : integer range 0 to 2 := 1);
+ Port ( rst : in std_logic;
+ clk : in std_logic;
+ input : in std_logic;
+ output : out std_logic);
+end oneshot;
+
+architecture Behavioral of oneshot is
+
+type shot_state_t is (shot_pos_st, shot_neg_st, release_pos_st, release_neg_st);
+
+signal shot_cs : shot_state_t;
+signal shot_ns : shot_state_t;
+
+begin
+
+mode_0:
+if mode = 0 generate
+begin
+ shot_clk: process(rst, clk, shot_ns, input)
+ begin
+ if (rst = '1') then
+ if (input = '1') then
+ shot_cs <= release_pos_st;
+ else
+ shot_cs <= release_neg_st;
+ end if;
+ else
+ if rising_edge(clk) then
+ shot_cs <= shot_ns;
+ end if;
+ end if;
+ end process;
+
+ shot_in: process(rst, clk, input, shot_cs)
+ begin
+ shot_ns <= shot_cs;
+ case shot_cs is
+ when release_pos_st =>
+ if (input = '0') then
+ shot_ns <= shot_neg_st;
+ end if;
+ when shot_neg_st =>
+ shot_ns <= release_neg_st;
+ when release_neg_st =>
+ if (input = '1') then
+ shot_ns <= release_pos_st;
+ end if;
+ when others => null;
+ end case;
+ end process;
+
+ shot_out: process(shot_cs)
+ begin
+ output <= '0';
+ case shot_cs is
+ when shot_pos_st =>
+ output <= '1';
+ when shot_neg_st =>
+ output <= '1';
+ when others => null;
+ end case;
+ end process;
+end generate;
+
+mode_1:
+if mode = 1 generate
+begin
+ shot_clk: process(rst, clk, shot_ns, input)
+ begin
+ if (rst = '1') then
+ if (input = '1') then
+ shot_cs <= release_pos_st;
+ else
+ shot_cs <= release_neg_st;
+ end if;
+ else
+ if rising_edge(clk) then
+ shot_cs <= shot_ns;
+ end if;
+ end if;
+ end process;
+
+ shot_in: process(rst, clk, input, shot_cs)
+ begin
+ shot_ns <= shot_cs;
+ case shot_cs is
+ when shot_pos_st =>
+ shot_ns <= release_pos_st;
+ when release_pos_st =>
+ if (input = '0') then
+ shot_ns <= release_neg_st;
+ end if;
+ when release_neg_st =>
+ if (input = '1') then
+ shot_ns <= shot_pos_st;
+ end if;
+ when others => null;
+ end case;
+ end process;
+
+ shot_out: process(shot_cs)
+ begin
+ output <= '0';
+ case shot_cs is
+ when shot_pos_st =>
+ output <= '1';
+ when shot_neg_st =>
+ output <= '1';
+ when others => null;
+ end case;
+ end process;
+end generate;
+
+mode_2:
+if mode = 2 generate
+begin
+ shot_clk: process(rst, clk, shot_ns, input)
+ begin
+ if (rst = '1') then
+ if (input = '1') then
+ shot_cs <= release_pos_st;
+ else
+ shot_cs <= release_neg_st;
+ end if;
+ else
+ if rising_edge(clk) then
+ shot_cs <= shot_ns;
+ end if;
+ end if;
+ end process;
+
+ shot_in: process(rst, clk, input, shot_cs)
+ begin
+ shot_ns <= shot_cs;
+ case shot_cs is
+ when shot_pos_st =>
+ shot_ns <= release_pos_st;
+ when release_pos_st =>
+ if (input = '0') then
+ shot_ns <= shot_neg_st;
+ end if;
+ when shot_neg_st =>
+ shot_ns <= release_neg_st;
+ when release_neg_st =>
+ if (input = '1') then
+ shot_ns <= shot_pos_st;
+ end if;
+ end case;
+ end process;
+
+ shot_out: process(shot_cs)
+ begin
+ output <= '0';
+ case shot_cs is
+ when shot_pos_st =>
+ output <= '1';
+ when shot_neg_st =>
+ output <= '1';
+ when others => null;
+ end case;
+ end process;
+end generate;
+
+
+
+end Behavioral;
diff --git a/lib/misc/pkg_template.vhd b/lib/misc/pkg_template.vhd
new file mode 100644
index 0000000..fe866e8
--- /dev/null
+++ b/lib/misc/pkg_template.vhd
@@ -0,0 +1,18 @@
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/pkg_template.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+
+package template_pkg is
+ -- Constants
+ -- Types
+ -- Functions
+
+end template_pkg;
+
+package body template_pkg is
+
+end template_pkg;
+
diff --git a/lib/misc/singleshot.vhd b/lib/misc/singleshot.vhd
new file mode 100644
index 0000000..25f7013
--- /dev/null
+++ b/lib/misc/singleshot.vhd
@@ -0,0 +1,155 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 21:52:19 10/22/05
+-- Design Name:
+-- Module Name: singleshot - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/singleshot.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+-- Component Template
+--
+-- COMPONENT singleshot
+-- GENERIC (mode : integer);
+-- PORT(
+-- rst : IN std_logic;
+-- clk : IN std_logic;
+-- input : IN std_logic;
+-- output : OUT std_logic
+-- );
+-- END COMPONENT;
+--
+-- Instantation Template
+--
+-- singleshot_int: oneshot
+-- GENERIC MAP (
+-- mode => 1)
+-- PORT MAP(
+-- rst => ,
+-- clk => ,
+-- input => ,
+-- output =>
+-- );
+--
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+
+entity singleshot is
+ Generic ( mode : integer range 0 to 2 := 1);
+ Port ( rst : in std_logic;
+ clk : in std_logic;
+ input : in std_logic;
+ output : out std_logic);
+end singleshot;
+
+architecture Behavioral of singleshot is
+
+type s_t is (idle, shot_in, active, shot_out);
+signal s, sn : s_t;
+
+begin
+
+process (rst, clk, sn)
+begin
+ if rising_edge(clk) then
+ if rst = '1' then
+ s <= idle;
+ else
+ s <= sn;
+ end if;
+ end if;
+end process;
+
+mode_1:
+if mode = 1 generate
+begin
+ process (input, s)
+ begin
+ output <= '0';
+ sn <= s;
+ case s is
+ when idle =>
+ if input = '1' then
+ sn <= shot_in;
+ end if;
+ when shot_in =>
+ output <= '1';
+ sn <= active;
+ when active =>
+ if input = '0' then
+ sn <= shot_out;
+ end if;
+ when shot_out =>
+ sn <= idle;
+ when others => null;
+ end case;
+ end process;
+end generate;
+
+mode_0:
+if mode = 0 generate
+begin
+ process (input, s)
+ begin
+ output <= '0';
+ sn <= s;
+ case s is
+ when idle =>
+ if input = '1' then
+ sn <= shot_in;
+ end if;
+ when shot_in =>
+ sn <= active;
+ when active =>
+ if input = '0' then
+ sn <= shot_out;
+ end if;
+ when shot_out =>
+ output <= '1';
+ sn <= idle;
+ when others => null;
+ end case;
+ end process;
+end generate;
+
+mode_2:
+if mode = 2 generate
+begin
+ process (input, s)
+ begin
+ output <= '0';
+ sn <= s;
+ case s is
+ when idle =>
+ if input = '1' then
+ sn <= shot_in;
+ end if;
+ when shot_in =>
+ output <= '1';
+ sn <= active;
+ when active =>
+ if input = '0' then
+ sn <= shot_out;
+ end if;
+ when shot_out =>
+ output <= '1';
+ sn <= idle;
+ when others => null;
+ end case;
+ end process;
+end generate;
+
+end Behavioral;
diff --git a/lib/misc/tb_template.vhd b/lib/misc/tb_template.vhd
new file mode 100644
index 0000000..f96f294
--- /dev/null
+++ b/lib/misc/tb_template.vhd
@@ -0,0 +1,63 @@
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/tb_template.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+LIBRARY IEEE;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE IEEE.MATH_REAL.ALL;
+USE IEEE.NUMERIC_STD.ALL;
+USE STD.TEXTIO.ALL;
+
+-- LIBRARY WORK;
+-- USE.YOURLIB.WHATELSE
+
+ENTITY tb_template IS
+END tb_template;
+
+ARCHITECTURE behavior OF tb_template IS
+
+ -- Component Declaration for the Unit Under Test (UUT)
+ COMPONENT your_comp
+ GENERIC
+ (
+ );
+ PORT
+ (
+ );
+ END COMPONENT;
+
+ --Constants
+ constant PERIOD : time := 10 ns;
+
+ --Inputs
+ signal clk : STD_LOGIC := '0';
+
+ --Outputs
+
+BEGIN
+
+ -- Instantiate the Unit Under Test (UUT)
+ uut: your_comp
+ GENERIC MAP
+ (
+ )
+ PORT MAP
+ (
+ );
+
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 4*PERIOD;
+
+ assert false report "Test finished" severity error;
+ wait;
+
+ END PROCESS;
+
+END tb_template;
diff --git a/lib/misc/utils_pkg.vhd b/lib/misc/utils_pkg.vhd
new file mode 100644
index 0000000..2fcaec6
--- /dev/null
+++ b/lib/misc/utils_pkg.vhd
@@ -0,0 +1,63 @@
+-----------------------------------------------------------------------
+-- $Header: /tmp/cvsroot/VHDL/lib/misc/utils_pkg.vhd,v 1.1 2008-08-23 08:20:29 Jens Exp $
+-----------------------------------------------------------------------
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.NUMERIC_STD.ALL;
+use IEEE.MATH_REAL.ALL;
+
+package utils_pkg is
+
+ -- Constants
+
+ -- Functions
+ function NextPowerOfTwo(x : natural) return natural;
+ function NextExpBaseTwo(x : natural) return natural;
+ function GCD(a, b : natural) return natural;
+ function LCM(a, b : natural) return natural;
+
+end utils_pkg;
+
+
+package body utils_pkg is
+
+ function NextExpBaseTwo(x : natural) return natural is
+ begin
+ return natural(ceil(log2(real(x))));
+ end NextExpBaseTwo;
+
+ function NextPowerOfTwo(x : natural) return natural is
+ begin
+
+ return 2**NextExpBaseTwo(x);
+ end NextPowerOfTwo;
+
+ function GCD(a, b : natural) return natural is
+ variable aa : natural;
+ variable bb : natural;
+ begin
+ aa := a;
+ bb := b;
+ while bb /= 0 loop
+ if aa > bb then
+ aa := aa - bb;
+ else
+ bb := bb - aa;
+ end if;
+ end loop;
+
+ return aa;
+
+ end GCD;
+
+ function LCM(a, b : natural) return natural is
+ begin
+
+ return (a * b)/GCD(a, b);
+
+ end LCM;
+
+end utils_pkg;
+
+
diff --git a/lib/radio/mix/sim/tb_mix_cpx.fdo b/lib/radio/mix/sim/tb_mix_cpx.fdo
new file mode 100644
index 0000000..14d9422
--- /dev/null
+++ b/lib/radio/mix/sim/tb_mix_cpx.fdo
@@ -0,0 +1,13 @@
+vlib work
+vcom -explicit -93 "../../../../lib/fixed/fixed_pkg_c.vhd"
+vcom -explicit -93 "../../../../lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd"
+vcom -explicit -93 "../../../../lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd"
+vcom -explicit -93 "../src/mix_pkg.vhd"
+vcom -explicit -93 "../src/mix_cpx.vhd"
+vcom -explicit -93 "../src/tb_mix_cpx.vhd"
+vsim -t 1ps -lib work tb_mix_cpx
+do {tb_mix_cpx.wdo}
+view wave
+view structure
+view signals
+run 500ns
diff --git a/lib/radio/mix/sim/tb_mix_cpx.wdo b/lib/radio/mix/sim/tb_mix_cpx.wdo
new file mode 100644
index 0000000..c84c651
--- /dev/null
+++ b/lib/radio/mix/sim/tb_mix_cpx.wdo
@@ -0,0 +1,42 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_mix_cpx/clk
+add wave -noupdate -format Logic /tb_mix_cpx/srst
+add wave -noupdate -divider {Fixed In}
+add wave -noupdate -format Logic /tb_mix_cpx/in_valid
+add wave -noupdate -format Literal -radix decimal /tb_mix_cpx/x_re_in
+add wave -noupdate -format Literal -radix decimal /tb_mix_cpx/x_im_in
+add wave -noupdate -format Literal -radix decimal /tb_mix_cpx/y_re_in
+add wave -noupdate -format Literal -radix decimal /tb_mix_cpx/y_im_in
+add wave -noupdate -divider {Fixed OUT}
+add wave -noupdate -format Logic /tb_mix_cpx/out_valid
+add wave -noupdate -format Literal -radix decimal /tb_mix_cpx/z_re_out
+add wave -noupdate -format Literal -radix decimal /tb_mix_cpx/z_im_out
+add wave -noupdate -divider {Convenient real out}
+add wave -noupdate -format Literal /tb_mix_cpx/x_re
+add wave -noupdate -format Literal /tb_mix_cpx/x_im
+add wave -noupdate -format Literal /tb_mix_cpx/y_re
+add wave -noupdate -format Literal /tb_mix_cpx/y_im
+add wave -noupdate -format Literal /tb_mix_cpx/z_re
+add wave -noupdate -format Literal /tb_mix_cpx/z_im
+add wave -noupdate -format Logic /tb_mix_cpx/fileout_enable
+add wave -noupdate -format Literal /tb_mix_cpx/uut/p_re_left
+add wave -noupdate -format Literal /tb_mix_cpx/uut/p_re_right
+add wave -noupdate -format Literal /tb_mix_cpx/uut/p_im_left
+add wave -noupdate -format Literal /tb_mix_cpx/uut/p_im_right
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {90000 ps} 0}
+configure wave -namecolwidth 193
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+update
+WaveRestoreZoom {0 ps} {348406 ps}
diff --git a/lib/radio/mix/sim/tb_mix_real.fdo b/lib/radio/mix/sim/tb_mix_real.fdo
new file mode 100644
index 0000000..cbf7dd0
--- /dev/null
+++ b/lib/radio/mix/sim/tb_mix_real.fdo
@@ -0,0 +1,13 @@
+vlib work
+vcom -explicit -93 "../../../../lib/fixed/fixed_pkg_c.vhd"
+vcom -explicit -93 "../../../../lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd"
+vcom -explicit -93 "../../../../lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd"
+vcom -explicit -93 "../src/mix_pkg.vhd"
+vcom -explicit -93 "../src/mix_real.vhd"
+vcom -explicit -93 "../src/tb_mix_real.vhd"
+vsim -t 1ps -lib work tb_mix_real
+do {tb_mix_real.wdo}
+view wave
+view structure
+view signals
+run 500ns
diff --git a/lib/radio/mix/sim/tb_mix_real.wdo b/lib/radio/mix/sim/tb_mix_real.wdo
new file mode 100644
index 0000000..6643ce3
--- /dev/null
+++ b/lib/radio/mix/sim/tb_mix_real.wdo
@@ -0,0 +1,36 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_mix_real/clk
+add wave -noupdate -format Logic /tb_mix_real/srst
+add wave -noupdate -divider {Fixed In}
+add wave -noupdate -format Logic /tb_mix_real/in_valid
+add wave -noupdate -format Literal -radix decimal /tb_mix_real/x_re_din
+add wave -noupdate -format Literal -radix decimal /tb_mix_real/y_re_din
+add wave -noupdate -format Literal -radix decimal /tb_mix_real/y_im_din
+add wave -noupdate -divider {Fixed OUT}
+add wave -noupdate -format Logic /tb_mix_real/out_valid
+add wave -noupdate -format Literal -radix decimal /tb_mix_real/z_re_dout
+add wave -noupdate -format Literal -radix decimal /tb_mix_real/z_im_dout
+add wave -noupdate -divider {Convenient real out}
+add wave -noupdate -format Literal /tb_mix_real/x_re
+add wave -noupdate -format Literal /tb_mix_real/y_re
+add wave -noupdate -format Literal /tb_mix_real/y_im
+add wave -noupdate -format Literal /tb_mix_real/z_re
+add wave -noupdate -format Literal /tb_mix_real/z_im
+add wave -noupdate -format Logic /tb_mix_real/fileout_enable
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {120000 ps} 0}
+configure wave -namecolwidth 193
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+update
+WaveRestoreZoom {0 ps} {348406 ps}
diff --git a/lib/radio/mix/sim/tb_undc_real.fdo b/lib/radio/mix/sim/tb_undc_real.fdo
new file mode 100644
index 0000000..f7d989f
--- /dev/null
+++ b/lib/radio/mix/sim/tb_undc_real.fdo
@@ -0,0 +1,13 @@
+vlib work
+vcom -explicit -93 "../../../../lib/fixed/fixed_pkg_c.vhd"
+vcom -explicit -93 "../../../../lib/PCK_FIO-2002.7/PCK_FIO_1993.vhd"
+vcom -explicit -93 "../../../../lib/PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd"
+vcom -explicit -93 "../src/mix_pkg.vhd"
+vcom -explicit -93 "../src/undc_real.vhd"
+vcom -explicit -93 "../src/tb_undc_real.vhd"
+vsim -t 1ps -lib work tb_undc_real
+do {tb_undc_real.wdo}
+view wave
+view structure
+view signals
+run 500us
diff --git a/lib/radio/mix/sim/tb_undc_real.wdo b/lib/radio/mix/sim/tb_undc_real.wdo
new file mode 100644
index 0000000..f965905
--- /dev/null
+++ b/lib/radio/mix/sim/tb_undc_real.wdo
@@ -0,0 +1,38 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_undc_real/clk
+add wave -noupdate -format Logic /tb_undc_real/srst
+add wave -noupdate -format Logic /tb_undc_real/din_valid
+add wave -noupdate -format Logic /tb_undc_real/kin_valid
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/din
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/kin
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/dout
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/dc_out
+add wave -noupdate -format Logic /tb_undc_real/dout_valid
+add wave -noupdate -format Literal /tb_undc_real/k
+add wave -noupdate -format Literal /tb_undc_real/x
+add wave -noupdate -format Literal /tb_undc_real/y
+add wave -noupdate -format Literal /tb_undc_real/dc
+add wave -noupdate -divider UUT
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/uut/k
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/uut/x
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/uut/y
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/uut/y1
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/uut/y2
+add wave -noupdate -format Literal -radix hexadecimal /tb_undc_real/uut/dc
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {97905405 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 100
+configure wave -griddelta 40
+configure wave -timeline 1
+update
+WaveRestoreZoom {0 ps} {157500 ns}
diff --git a/lib/radio/mix/src/mix_cpx.vhd b/lib/radio/mix/src/mix_cpx.vhd
new file mode 100644
index 0000000..f77a312
--- /dev/null
+++ b/lib/radio/mix/src/mix_cpx.vhd
@@ -0,0 +1,166 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: mix_cpx - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.mix_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+entity mix_cpx is
+Generic
+(
+ nbits_in : integer := 12;
+ nbits_in_frac : integer := 12;
+ nbits_out : integer := 12;
+ nbits_out_frac : integer := 12;
+ nbits_scale_z : integer := 0;
+ has_in_reg : boolean := false;
+ has_pipe_reg : boolean := false;
+ has_out_reg : boolean := false;
+ rounding : boolean := true;
+ saturating : boolean := true
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ in_valid : in std_logic;
+ x_re_in : in sfixed;
+ x_im_in : in sfixed;
+ y_re_in : in sfixed;
+ y_im_in : in sfixed;
+ out_valid : out std_logic;
+ z_re_out : out sfixed;
+ z_im_out : out sfixed
+);
+end mix_cpx;
+
+architecture Behavioral of mix_cpx is
+constant nbits_prod : integer := nbits_out + nbits_scale_z;
+constant nbits_prod_frac : integer := nbits_out_frac + nbits_scale_z;
+
+signal x_re, x_im : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+signal y_re, y_im : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+signal p_re_left, p_re_right : sfixed(sproto(nbits_prod, nbits_prod_frac)'high downto sproto(nbits_prod, nbits_prod_frac)'low);
+signal p_im_left, p_im_right : sfixed(sproto(nbits_prod, nbits_prod_frac)'high downto sproto(nbits_prod, nbits_prod_frac)'low);
+signal valid, p_valid : std_logic;
+------------------------------------------------------------
+begin
+
+
+------------------------------------------------------------
+ proc_in_reg: process(srst, clk, in_valid, x_re_in, x_im_in, y_re_in, y_im_in)
+ begin
+ if has_in_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ x_re <= to_sfixed(0, x_re);
+ x_im <= to_sfixed(0, x_im);
+ y_re <= to_sfixed(0, y_re);
+ y_im <= to_sfixed(0, y_im);
+ valid <= '0';
+ else
+ valid <= in_valid;
+ if in_valid = '1' then
+ x_re <= x_re_in;
+ x_im <= x_im_in;
+ y_re <= y_re_in;
+ y_im <= y_im_in;
+ end if;
+ end if;
+ end if;
+ else
+ x_re <= x_re_in;
+ x_im <= x_im_in;
+ y_re <= y_re_in;
+ y_im <= y_im_in;
+ valid <= in_valid;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_pipe_reg: process(srst, clk, valid, x_re, x_im, y_re, y_im)
+ variable re_left, re_right : sfixed(sproto(nbits_prod, nbits_prod_frac)'high downto sproto(nbits_out, nbits_prod_frac)'low);
+ variable im_left, im_right : sfixed(sproto(nbits_prod, nbits_prod_frac)'high downto sproto(nbits_out, nbits_prod_frac)'low);
+
+ begin
+ re_left := resize(x_re * y_re, re_left);
+ re_right := resize(x_im * y_im, re_right);
+ im_left := resize(x_re * y_im, im_left);
+ im_right := resize(x_im * y_re, im_right);
+ if has_pipe_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ p_re_left <= to_sfixed(0, p_re_left);
+ p_re_right <= to_sfixed(0, p_re_right);
+ p_im_left <= to_sfixed(0, p_im_left);
+ p_im_right <= to_sfixed(0, p_im_right);
+ p_valid <= '0';
+ else
+ p_re_left <= re_left;
+ p_re_right <= re_right;
+ p_im_left <= im_left;
+ p_im_right <= im_right;
+ p_valid <= valid;
+ end if;
+ end if;
+ else
+ p_re_left <= re_left;
+ p_re_right <= re_right;
+ p_im_left <= im_left;
+ p_im_right <= im_right;
+ p_valid <= valid;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_out_reg: process(srst, clk, p_valid, p_re_left, p_re_right, p_im_left, p_im_right)
+ variable re, im : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ variable sum_re : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ variable sum_im : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ begin
+ sum_re := resize(scalb(p_re_left - p_re_right, nbits_scale_z), re, rounding, saturating);
+ sum_im := resize(scalb(p_im_left + p_im_right, nbits_scale_z), im, rounding, saturating);
+ if has_out_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ z_re_out <= to_sfixed(0, re);
+ z_im_out <= to_sfixed(0, im);
+ out_valid <= '0';
+ else
+ z_re_out <= sum_re;
+ z_im_out <= sum_im;
+ out_valid <= p_valid;
+ end if;
+ end if;
+ else
+ z_re_out <= re;
+ z_im_out <= im;
+ out_valid <= p_valid;
+ end if;
+ end process;
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/radio/mix/src/mix_pkg.vhd b/lib/radio/mix/src/mix_pkg.vhd
new file mode 100644
index 0000000..9e6dcbf
--- /dev/null
+++ b/lib/radio/mix/src/mix_pkg.vhd
@@ -0,0 +1,62 @@
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use ieee.numeric_std.all;
+use work.fixed_pkg.all;
+
+package mix_pkg is
+
+ -------------------------------------------------------------
+ -- Constructor helpers
+ -- Use: variable v8u6 : ufixed_t(ufixed(8,6)'range);
+ function uproto (nbits : integer; nbits_frac : integer) return ufixed;
+
+ -- Use: variable v8s6 : sfixed_t(sfixed(8,6)'range);
+ function sproto (nbits : integer; nbits_frac : integer) return sfixed;
+
+ function to_unsigned (src : ufixed) return UNSIGNED;
+ function to_signed (src : sfixed) return SIGNED;
+
+-------------------------------------------------------------------------------
+end; -- package mix_cpx_pkg;
+
+package body mix_pkg is
+
+ -------------------------------------------------------------
+ -- Constuctor helpers
+ function uproto (nbits : integer; nbits_frac : integer) return ufixed is
+ constant result : ufixed (nbits-nbits_frac-1 downto -nbits_frac) := (others => '0');
+ begin
+ return result(nbits-nbits_frac-1 downto -nbits_frac);
+ end uproto;
+
+ -------------------------------------------------------------
+ function sproto (nbits : integer; nbits_frac : integer) return sfixed is
+ constant result : sfixed (nbits-nbits_frac downto -nbits_frac+1) := (others => '0');
+ begin
+ return result(nbits-nbits_frac downto -nbits_frac+1);
+ end sproto;
+
+ -------------------------------------------------------------
+ function to_unsigned (src : ufixed) return UNSIGNED is
+ subtype t is UNSIGNED(src'high - src'low downto 0);
+ variable slv : t;
+ begin
+ slv := t(src);
+ return UNSIGNED(to_X01(std_logic_vector(slv)));
+
+ end function to_unsigned;
+
+ -------------------------------------------------------------
+ function to_signed (src : sfixed) return SIGNED is
+ subtype t is SIGNED(src'high - src'low downto 0);
+ variable slv : t;
+ begin
+ slv := t(src);
+ return SIGNED(to_X01(std_logic_vector(slv)));
+
+ end function to_signed;
+
+
+-------------------------------------------------------------------------------
+end; -- package mix_pkg;
diff --git a/lib/radio/mix/src/mix_real.vhd b/lib/radio/mix/src/mix_real.vhd
new file mode 100644
index 0000000..3dfe3cc
--- /dev/null
+++ b/lib/radio/mix/src/mix_real.vhd
@@ -0,0 +1,155 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: mix_cpx - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.mix_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+entity mix_real is
+Generic
+(
+ nbits_in : integer := 12;
+ nbits_in_frac : integer := 12;
+ nbits_out : integer := 12;
+ nbits_out_frac : integer := 12;
+ nbits_scale_z : integer := 0;
+ has_in_reg : boolean := false;
+ has_pipe_reg : boolean := false;
+ has_out_reg : boolean := false;
+ rounding : boolean := true;
+ saturating : boolean := true
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ in_valid : in std_logic;
+ x_re_din : in sfixed;
+ y_re_din : in sfixed;
+ y_im_din : in sfixed;
+ out_valid : out std_logic;
+ z_re_dout : out sfixed;
+ z_im_dout : out sfixed
+);
+end mix_real;
+
+architecture Behavioral of mix_real is
+
+constant nbits_prod : integer := nbits_out + nbits_scale_z;
+constant nbits_prod_frac : integer := nbits_out_frac + nbits_scale_z;
+
+signal x_re : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+signal y_re, y_im : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+signal p_re_left : sfixed(sproto(nbits_prod, nbits_prod_frac)'high downto sproto(nbits_prod, nbits_prod_frac)'low);
+signal p_im_left : sfixed(sproto(nbits_prod, nbits_prod_frac)'high downto sproto(nbits_prod, nbits_prod_frac)'low);
+signal valid, p_valid : std_logic;
+------------------------------------------------------------
+begin
+
+
+------------------------------------------------------------
+ proc_in_reg: process(srst, clk, in_valid, x_re_din, y_re_din, y_im_din)
+ begin
+ if has_in_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ x_re <= to_sfixed(0, x_re);
+ y_re <= to_sfixed(0, y_re);
+ y_im <= to_sfixed(0, y_im);
+ valid <= '0';
+ else
+ valid <= in_valid;
+ if in_valid = '1' then
+ x_re <= x_re_din;
+ y_re <= y_re_din;
+ y_im <= y_im_din;
+ end if;
+ end if;
+ end if;
+ else
+ x_re <= x_re_din;
+ y_re <= y_re_din;
+ y_im <= y_im_din;
+ valid <= in_valid;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_pipe_reg: process(srst, clk, valid, x_re, y_re, y_im)
+ variable re_left : sfixed(sproto(nbits_prod, nbits_prod_frac)'high downto sproto(nbits_prod, nbits_prod_frac)'low);
+ variable im_left : sfixed(sproto(nbits_prod, nbits_prod_frac)'high downto sproto(nbits_prod, nbits_prod_frac)'low);
+
+ begin
+ re_left := resize(x_re * y_re, re_left);
+ im_left := resize(x_re * y_im, im_left);
+ if has_pipe_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ p_re_left <= to_sfixed(0, p_re_left);
+ p_im_left <= to_sfixed(0, p_im_left);
+ p_valid <= '0';
+ else
+ p_re_left <= re_left;
+ p_im_left <= im_left;
+ p_valid <= valid;
+ end if;
+ end if;
+ else
+ p_re_left <= re_left;
+ p_im_left <= im_left;
+ p_valid <= valid;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_out_reg: process(srst, clk, p_valid, p_re_left, p_im_left)
+ variable re, im : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ variable sum_re : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ variable sum_im : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ begin
+ sum_re := resize(scalb(p_re_left, nbits_scale_z), re, rounding, saturating);
+ sum_im := resize(scalb(p_im_left, nbits_scale_z), im, rounding, saturating);
+ if has_out_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ z_re_dout <= to_sfixed(0, re);
+ z_im_dout <= to_sfixed(0, im);
+ out_valid <= '0';
+ else
+ z_re_dout <= sum_re;
+ z_im_dout <= sum_im;
+ out_valid <= p_valid;
+ end if;
+ end if;
+ else
+ z_re_dout <= re;
+ z_im_dout <= im;
+ out_valid <= p_valid;
+ end if;
+ end process;
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/radio/mix/src/tb_mix_cpx.vhd b/lib/radio/mix/src/tb_mix_cpx.vhd
new file mode 100644
index 0000000..7882185
--- /dev/null
+++ b/lib/radio/mix/src/tb_mix_cpx.vhd
@@ -0,0 +1,208 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_mix_cpx
+-- Module Name: tb_mix_cpx.vhd
+-- Project Name: mix_cpx
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+--------------------------------------------------------------------------------
+LIBRARY ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use std.textio.all; -- Imports the standard textio package.
+
+library work;
+use work.fixed_pkg.all;
+use work.mix_pkg.all;
+use work.PCK_FIO.all;
+
+ENTITY tb_mix_cpx IS
+ Generic (
+ nbits_in : integer := 24;
+ nbits_in_frac : integer := 24;
+ nbits_out : integer := 24;
+ nbits_out_frac : integer := 24;
+ nbits_scale_z : integer := 0;
+ has_in_reg : boolean := true;
+ has_pipe_reg : boolean := true;
+ has_out_reg : boolean := true;
+ rounding : boolean := true;
+ saturating : boolean := true
+ );
+END tb_mix_cpx;
+
+ARCHITECTURE behavior OF tb_mix_cpx IS
+
+ -- Component Declaration for the Unit Under Test (UUT)
+ COMPONENT mix_cpx
+ GENERIC
+ (
+ nbits_in : integer;
+ nbits_in_frac : integer;
+ nbits_out : integer;
+ nbits_out_frac : integer;
+ nbits_scale_z : integer;
+ has_in_reg : boolean;
+ has_pipe_reg : boolean;
+ has_out_reg : boolean;
+ rounding : boolean;
+ saturating : boolean
+ );
+ PORT
+ (
+ srst : in std_logic;
+ clk : in std_logic;
+ in_valid : in std_logic;
+ x_re_in : in sfixed;
+ x_im_in : in sfixed;
+ y_re_in : in sfixed;
+ y_im_in : in sfixed;
+ out_valid : out std_logic;
+ z_re_out : out sfixed;
+ z_im_out : out sfixed
+ );
+ END COMPONENT;
+
+ --Constants
+ constant PERIOD : time := 10 ns;
+
+
+ --Inputs
+ SIGNAL clk : std_logic := '0';
+ SIGNAL srst : std_logic := '1';
+ SIGNAL in_valid : std_logic := '0';
+ SIGNAL x_re_in : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+ SIGNAL x_im_in : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+ SIGNAL y_re_in : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+ SIGNAL y_im_in : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+
+ --Outputs
+ SIGNAL z_re_out : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ SIGNAL z_im_out : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ SIGNAL out_valid : std_logic;
+
+ SIGNAL fileout_enable : std_logic := '0';
+ SIGNAL x_re : real := 0.0;
+ SIGNAL x_im : real := 0.0;
+ SIGNAL y_re : real := 0.0;
+ SIGNAL y_im : real := 0.0;
+ SIGNAL z_re : real := 0.0;
+ SIGNAL z_im : real := 0.0;
+
+BEGIN
+
+ -- Instantiate the Unit Under Test (UUT)
+ uut: mix_cpx
+ GENERIC MAP
+ (
+ nbits_in => nbits_in,
+ nbits_in_frac => nbits_in_frac,
+ nbits_out => nbits_out,
+ nbits_out_frac => nbits_out_frac,
+ nbits_scale_z => nbits_scale_z,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ rounding => rounding,
+ saturating => saturating
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => in_valid,
+ x_re_in => x_re_in,
+ x_im_in => x_im_in,
+ y_re_in => y_re_in,
+ y_im_in => y_im_in,
+ out_valid => out_valid,
+ z_re_out => z_re_out,
+ z_im_out => z_im_out
+ );
+
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb : PROCESS
+
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 4*PERIOD;
+ srst <= '0';
+ ------------------------------------------
+ wait for 2*PERIOD;
+ wait until rising_edge(clk);
+ x_re_in <= to_sfixed(0.5, x_re_in);
+ x_im_in <= to_sfixed(0.5, x_im_in);
+ y_re_in <= to_sfixed(0.5, y_re_in);
+ y_im_in <= to_sfixed(0.5, y_im_in);
+ in_valid <= '1';
+ wait until rising_edge(clk);
+ in_valid <= '0';
+ wait for 5*PERIOD;
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_in <= to_sfixed(0.125, x_re_in);
+ x_im_in <= to_sfixed(0.25, x_im_in);
+ y_re_in <= to_sfixed(0.25, y_re_in);
+ y_im_in <= to_sfixed(0.125, y_im_in);
+ in_valid <= '1';
+ wait until rising_edge(clk);
+ in_valid <= '0';
+ wait for 5*PERIOD;
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_in <= to_sfixed(0.125, x_re_in);
+ x_im_in <= to_sfixed(-0.25, x_im_in);
+ y_re_in <= to_sfixed(0.25, y_re_in);
+ y_im_in <= to_sfixed(0.125, y_im_in);
+ in_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_in <= to_sfixed(0.125, x_re_in);
+ x_im_in <= to_sfixed(-0.25, x_im_in);
+ y_re_in <= to_sfixed(0.25, y_re_in);
+ y_im_in <= to_sfixed(0.125, y_im_in);
+ in_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_in <= to_sfixed(0.3, x_re_in);
+ x_im_in <= to_sfixed(0.0, x_im_in);
+ y_re_in <= to_sfixed(-0.5, y_re_in);
+ y_im_in <= to_sfixed(0.5, y_im_in);
+ in_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_in <= to_sfixed(0.0, x_re_in);
+ x_im_in <= to_sfixed(-0.7071, x_im_in);
+ y_re_in <= to_sfixed(0.0, y_re_in);
+ y_im_in <= to_sfixed(-0.7071, y_im_in);
+ in_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ in_valid <= '0';
+
+ wait for 20*PERIOD;
+
+ assert false report "Test finished" severity error;
+ wait;
+ END PROCESS;
+
+ x_re <= to_real(x_re_in);
+ x_im <= to_real(x_im_in);
+ y_re <= to_real(y_re_in);
+ y_im <= to_real(y_im_in);
+ z_re <= to_real(z_re_out);
+ z_im <= to_real(z_im_out);
+
+END;
diff --git a/lib/radio/mix/src/tb_mix_real.vhd b/lib/radio/mix/src/tb_mix_real.vhd
new file mode 100644
index 0000000..a9e458e
--- /dev/null
+++ b/lib/radio/mix/src/tb_mix_real.vhd
@@ -0,0 +1,197 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_mix_cpx
+-- Module Name: tb_mix_cpx.vhd
+-- Project Name: mix_cpx
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+--------------------------------------------------------------------------------
+LIBRARY ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use std.textio.all; -- Imports the standard textio package.
+
+library work;
+use work.fixed_pkg.all;
+use work.mix_pkg.all;
+use work.PCK_FIO.all;
+
+ENTITY tb_mix_real IS
+ Generic (
+ nbits_in : integer := 24;
+ nbits_in_frac : integer := 24;
+ nbits_out : integer := 24;
+ nbits_out_frac : integer := 24;
+ nbits_scale_z : integer := 0;
+ has_in_reg : boolean := true;
+ has_pipe_reg : boolean := true;
+ has_out_reg : boolean := true;
+ rounding : boolean := true;
+ saturating : boolean := true
+ );
+END tb_mix_real;
+
+ARCHITECTURE behavior OF tb_mix_real IS
+
+ -- Component Declaration for the Unit Under Test (UUT)
+ COMPONENT mix_real
+ GENERIC
+ (
+ nbits_in : integer;
+ nbits_in_frac : integer;
+ nbits_out : integer;
+ nbits_out_frac : integer;
+ nbits_scale_z : integer;
+ has_in_reg : boolean;
+ has_pipe_reg : boolean;
+ has_out_reg : boolean;
+ rounding : boolean;
+ saturating : boolean
+ );
+ PORT
+ (
+ srst : in std_logic;
+ clk : in std_logic;
+ in_valid : in std_logic;
+ x_re_din : in sfixed;
+ y_re_din : in sfixed;
+ y_im_din : in sfixed;
+ out_valid : out std_logic;
+ z_re_dout : out sfixed;
+ z_im_dout : out sfixed
+ );
+ END COMPONENT;
+
+ --Constants
+ constant PERIOD : time := 10 ns;
+
+
+ --Inputs
+ SIGNAL clk : std_logic := '0';
+ SIGNAL srst : std_logic := '1';
+ SIGNAL in_valid : std_logic := '0';
+ SIGNAL x_re_din : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+ SIGNAL y_re_din : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+ SIGNAL y_im_din : sfixed(sproto(nbits_in, nbits_in_frac)'high downto sproto(nbits_in, nbits_in_frac)'low);
+
+ --Outputs
+ SIGNAL z_re_dout : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ SIGNAL z_im_dout : sfixed(sproto(nbits_out, nbits_out_frac)'high downto sproto(nbits_out, nbits_out_frac)'low);
+ SIGNAL out_valid : std_logic;
+
+ SIGNAL fileout_enable : std_logic := '0';
+ SIGNAL x_re : real := 0.0;
+ SIGNAL y_re : real := 0.0;
+ SIGNAL y_im : real := 0.0;
+ SIGNAL z_re : real := 0.0;
+ SIGNAL z_im : real := 0.0;
+
+BEGIN
+
+ -- Instantiate the Unit Under Test (UUT)
+ uut: mix_real
+ GENERIC MAP
+ (
+ nbits_in => nbits_in,
+ nbits_in_frac => nbits_in_frac,
+ nbits_out => nbits_out,
+ nbits_out_frac => nbits_out_frac,
+ nbits_scale_z => nbits_scale_z,
+ has_in_reg => has_in_reg,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg,
+ rounding => rounding,
+ saturating => saturating
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ in_valid => in_valid,
+ x_re_din => x_re_din,
+ y_re_din => y_re_din,
+ y_im_din => y_im_din,
+ out_valid => out_valid,
+ z_re_dout => z_re_dout,
+ z_im_dout => z_im_dout
+ );
+
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb : PROCESS
+
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 4*PERIOD;
+ srst <= '0';
+ ------------------------------------------
+ wait for 2*PERIOD;
+ wait until rising_edge(clk);
+ x_re_din <= to_sfixed(0.5, x_re_din);
+ y_re_din <= to_sfixed(0.5, y_re_din);
+ y_im_din <= to_sfixed(0.5, y_im_din);
+ in_valid <= '1';
+ wait until rising_edge(clk);
+ in_valid <= '0';
+ wait for 5*PERIOD;
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_din <= to_sfixed(0.125, x_re_din);
+ y_re_din <= to_sfixed(0.25, y_re_din);
+ y_im_din <= to_sfixed(0.125, y_im_din);
+ in_valid <= '1';
+ wait until rising_edge(clk);
+ in_valid <= '0';
+ wait for 5*PERIOD;
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_din <= to_sfixed(0.125, x_re_din);
+ y_re_din <= to_sfixed(0.25, y_re_din);
+ y_im_din <= to_sfixed(0.125, y_im_din);
+ in_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_din <= to_sfixed(0.125, x_re_din);
+ y_re_din <= to_sfixed(0.25, y_re_din);
+ y_im_din <= to_sfixed(0.125, y_im_din);
+ in_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_din <= to_sfixed(0.3, x_re_din);
+ y_re_din <= to_sfixed(-0.5, y_re_din);
+ y_im_din <= to_sfixed(0.5, y_im_din);
+ in_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ x_re_din <= to_sfixed(0.0, x_re_din);
+ y_re_din <= to_sfixed(0.0, y_re_din);
+ y_im_din <= to_sfixed(-0.7071, y_im_din);
+ in_valid <= '1';
+ ------------------------------------------
+ wait until rising_edge(clk);
+ in_valid <= '0';
+
+ wait for 20*PERIOD;
+
+ assert false report "Test finished" severity error;
+ wait;
+ END PROCESS;
+
+ x_re <= to_real(x_re_din);
+ y_re <= to_real(y_re_din);
+ y_im <= to_real(y_im_din);
+ z_re <= to_real(z_re_dout);
+ z_im <= to_real(z_im_dout);
+
+END;
diff --git a/lib/radio/mix/src/tb_undc_real.vhd b/lib/radio/mix/src/tb_undc_real.vhd
new file mode 100644
index 0000000..3c7a52f
--- /dev/null
+++ b/lib/radio/mix/src/tb_undc_real.vhd
@@ -0,0 +1,158 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_mix_cpx
+-- Module Name: tb_mix_cpx.vhd
+-- Project Name: mix_cpx
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+--------------------------------------------------------------------------------
+LIBRARY ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use std.textio.all; -- Imports the standard textio package.
+
+library work;
+use work.fixed_pkg.all;
+use work.mix_pkg.all;
+use work.PCK_FIO.all;
+
+ENTITY tb_undc_real IS
+ Generic (
+ nbits_data : integer := 24;
+ nbits_data_frac : integer := 24;
+ nbits_k : integer := 24;
+ nbits_k_frac : integer := 24;
+ has_in_reg : boolean := true;
+ rounding : boolean := true;
+ saturating : boolean := true
+ );
+END tb_undc_real;
+
+ARCHITECTURE behavior OF tb_undc_real IS
+
+ -- Component Declaration for the Unit Under Test (UUT)
+ COMPONENT undc_real
+ Generic
+ (
+ nbits_data : integer;
+ nbits_data_frac : integer;
+ nbits_k : integer;
+ nbits_k_frac : integer;
+ has_in_reg : boolean;
+ rounding : boolean;
+ saturating : boolean
+ );
+ Port
+ (
+ srst : in std_logic;
+ clk : in std_logic;
+ din_valid : in std_logic;
+ din : in sfixed;
+ kin_valid : in std_logic;
+ kin : in sfixed;
+ dout_valid : out std_logic;
+ dout : out sfixed;
+ dc_out : out sfixed
+ );
+ END COMPONENT;
+
+ --Constants
+ constant PERIOD : time := 10 ns;
+
+
+ --Inputs
+ SIGNAL clk : std_logic := '0';
+ SIGNAL srst : std_logic := '1';
+ SIGNAL din_valid : std_logic := '0';
+ SIGNAL kin_valid : std_logic := '0';
+ SIGNAL din : sfixed(sproto(nbits_data, nbits_data_frac)'high downto sproto(nbits_data, nbits_data_frac)'low);
+ SIGNAL kin : sfixed(sproto(nbits_k, nbits_k_frac)'high downto sproto(nbits_k, nbits_k_frac)'low);
+
+ --Outputs
+ SIGNAL dout : sfixed(sproto(nbits_data, nbits_data_frac)'high downto sproto(nbits_data, nbits_data_frac)'low);
+ SIGNAL dc_out : sfixed(sproto(nbits_data, nbits_data_frac)'high downto sproto(nbits_data, nbits_data_frac)'low);
+ SIGNAL dout_valid : std_logic;
+
+ SIGNAL k : real := 0.0;
+ SIGNAL x : real := 0.0;
+ SIGNAL y : real := 0.0;
+ SIGNAL dc : real := 0.0;
+
+BEGIN
+
+ -- Instantiate the Unit Under Test (UUT)
+ uut: undc_real
+ GENERIC MAP
+ (
+ nbits_data => nbits_data,
+ nbits_data_frac => nbits_data_frac,
+ nbits_k => nbits_k,
+ nbits_k_frac => nbits_k_frac,
+ has_in_reg => has_in_reg,
+ rounding => rounding,
+ saturating => saturating
+ )
+ PORT MAP
+ (
+ srst => srst,
+ clk => clk,
+ din_valid => din_valid,
+ din => din,
+ kin_valid => kin_valid,
+ kin => kin,
+ dout_valid => dout_valid,
+ dout => dout,
+ dc_out => dc_out
+ );
+
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb : PROCESS
+
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 4*PERIOD;
+ srst <= '0';
+ ------------------------------------------
+ -- Load k
+ ------------------------------------------
+ wait for 2*PERIOD;
+ wait until rising_edge(clk);
+ kin <= to_sfixed(0.0005, kin);
+ kin_valid <= '1';
+ wait until rising_edge(clk);
+ kin_valid <= '1';
+ ------------------------------------------
+ -- Process
+ ------------------------------------------
+ wait for 2*PERIOD;
+ wait until rising_edge(clk);
+ din <= to_sfixed(0.5, din);
+ din_valid <= '1';
+ wait until rising_edge(clk);
+ din_valid <= '1';
+ wait for 5*PERIOD;
+
+ wait for 200*PERIOD;
+
+ assert false report "Test finished" severity error;
+ wait;
+ END PROCESS;
+
+ k <= to_real(kin);
+ x <= to_real(din);
+ y <= to_real(dout);
+ dc <= to_real(dc_out);
+
+END;
diff --git a/lib/radio/mix/src/undc_real.vhd b/lib/radio/mix/src/undc_real.vhd
new file mode 100644
index 0000000..be6df6e
--- /dev/null
+++ b/lib/radio/mix/src/undc_real.vhd
@@ -0,0 +1,139 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: mix_cpx - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.mix_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+entity undc_real is
+Generic
+(
+ nbits_data : integer := 12;
+ nbits_data_frac : integer := 12;
+ nbits_k : integer := 12;
+ nbits_k_frac : integer := 12;
+ has_in_reg : boolean := false;
+ rounding : boolean := true;
+ saturating : boolean := true
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ din_valid : in std_logic;
+ din : in sfixed;
+ kin_valid : in std_logic;
+ kin : in sfixed;
+ dout_valid : out std_logic;
+ dout : out sfixed;
+ dc_out : out sfixed
+);
+end undc_real;
+
+architecture Behavioral of undc_real is
+
+constant nbits_internal : integer := nbits_data + nbits_data;
+constant nbits_internal_frac : integer := nbits_data_frac + nbits_data_frac;
+
+signal x : sfixed(sproto(nbits_data, nbits_data_frac)'high downto sproto(nbits_data, nbits_data_frac)'low);
+signal k : sfixed(sproto(nbits_k, nbits_k_frac)'high downto sproto(nbits_k, nbits_k_frac)'low);
+signal dc : sfixed(sproto(nbits_internal, nbits_internal_frac)'high downto sproto(nbits_internal, nbits_internal_frac)'low);
+signal y : sfixed(sproto(nbits_internal, nbits_internal_frac)'high downto sproto(nbits_internal, nbits_internal_frac)'low);
+signal y1 : sfixed(sproto(nbits_internal, nbits_internal_frac)'high downto sproto(nbits_internal, nbits_internal_frac)'low);
+signal y2 : sfixed(sproto(nbits_internal, nbits_internal_frac)'high downto sproto(nbits_internal, nbits_internal_frac)'low);
+
+begin
+
+dout <= resize(y, sproto(nbits_data, nbits_data_frac), rounding, saturating);
+dc_out <= resize(dc, sproto(nbits_data, nbits_data_frac), false, false);
+
+------------------------------------------------------------
+ proc_din_reg: process(clk, din_valid, din)
+ begin
+ if has_in_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ x <= to_sfixed(0, x);
+ else
+ if din_valid = '1' then
+ x <= din;
+ end if;
+ end if;
+ end if;
+ else
+ x <= din;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_valid_reg: process(clk, din_valid)
+ begin
+ if has_in_reg = true then
+ if rising_edge(clk) then
+ if srst = '1' then
+ dout_valid <= '0';
+ else
+ dout_valid <= din_valid;
+ end if;
+ end if;
+ else
+ dout_valid <= din_valid;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_kin_reg: process(clk, kin_valid, kin)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ k <= to_sfixed(0, k);
+ else
+ if kin_valid = '1' then
+ k <= kin;
+ end if;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_pipe_y: process(clk, x, dc)
+ begin
+ y <= resize(x - dc, y, false, false);
+ if rising_edge(clk) then
+ if srst = '1' then
+ y1 <= to_sfixed(0, y1);
+ y2 <= to_sfixed(0, y2);
+ dc <= to_sfixed(0, dc);
+ else
+ y1 <= y;
+ y2 <= resize(y1 * k, y2, false, false);
+ dc <= resize(y2 + dc, dc, false, false);
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/radio/nco/sim/tb_nco.fdo b/lib/radio/nco/sim/tb_nco.fdo
new file mode 100644
index 0000000..ae31dbf
--- /dev/null
+++ b/lib/radio/nco/sim/tb_nco.fdo
@@ -0,0 +1,15 @@
+vlib work
+vcom -explicit -93 "../../../fixed/fixed_pkg_c.vhd"
+vcom -explicit -93 "../../../PCK_FIO-2002.7/PCK_FIO_1993.vhd"
+vcom -explicit -93 "../../../PCK_FIO-2002.7/PCK_FIO_1993_BODY.vhd"
+vcom -explicit -93 "../src/nco_pkg.vhd"
+vcom -explicit -93 "../src/waverom_dual.vhd"
+vcom -explicit -93 "../src/wavelut.vhd"
+vcom -explicit -93 "../src/nco_dbg.vhd"
+vcom -explicit -93 "../src/tb_nco.vhd"
+vsim -t 1ps -lib work tb_nco
+do {tb_nco.wdo}
+view wave
+view structure
+view signals
+run 250us
diff --git a/lib/radio/nco/sim/tb_nco.wdo b/lib/radio/nco/sim/tb_nco.wdo
new file mode 100644
index 0000000..0fd0917
--- /dev/null
+++ b/lib/radio/nco/sim/tb_nco.wdo
@@ -0,0 +1,46 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate -format Logic /tb_nco/uut/srst
+add wave -noupdate -format Logic /tb_nco/uut/clk
+add wave -noupdate -format Logic /tb_nco/uut/pacc_clr
+add wave -noupdate -format Logic /tb_nco/uut/pacc_inc
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/freq_in
+add wave -noupdate -format Logic /tb_nco/uut/freq_load
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/phase_in
+add wave -noupdate -format Logic /tb_nco/uut/phase_load
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/phase_out
+add wave -noupdate -format Analog-Step -radix decimal -scale 7.629423635191479e-005 /tb_nco/uut/wave_out_i
+add wave -noupdate -format Analog-Step -radix decimal -scale 7.629423635191479e-005 /tb_nco/uut/wave_out_q
+add wave -noupdate -format Logic /tb_nco/uut/out_valid
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/debug_out
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/phase
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/freq_in_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/phase_in_r
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/lut_addr_ud
+add wave -noupdate -format Literal -radix hexadecimal /tb_nco/uut/lut_addr_d
+add wave -noupdate -format Literal /tb_nco/uut/wave_i_d
+add wave -noupdate -format Literal /tb_nco/uut/wave_q_d
+add wave -noupdate -format Literal /tb_nco/uut/wave_i_ud
+add wave -noupdate -format Literal /tb_nco/uut/wave_q_ud
+add wave -noupdate -format Literal /tb_nco/uut/lfsr
+add wave -noupdate -format Literal /tb_nco/uut/lfsr_out
+add wave -noupdate -format Logic /tb_nco/uut/lut_addr_valid
+add wave -noupdate -format Logic /tb_nco/uut/lfsr_valid
+add wave -noupdate -format Logic /tb_nco/uut/wave_d_valid
+add wave -noupdate -format Logic /tb_nco/uut/wave_ud_valid
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {249141632 ps} 0}
+configure wave -namecolwidth 193
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+update
+WaveRestoreZoom {249024188 ps} {250051359 ps}
diff --git a/lib/radio/nco/sim/tb_nco_results.m b/lib/radio/nco/sim/tb_nco_results.m
new file mode 100644
index 0000000..4147cea
--- /dev/null
+++ b/lib/radio/nco/sim/tb_nco_results.m
@@ -0,0 +1,61 @@
+% Read data
+function tb_nco_results(nbins)
+fa = 100.0;
+f = TEXTREAD('freq.txt')*1E-6
+
+I_ud = TEXTREAD('q_ud.txt')';
+I_d = TEXTREAD('q_d.txt')';
+LFSR = TEXTREAD('lfsr.txt');
+
+N= length(I_ud);
+N_fft = min(16384, N);
+N_fft2 = N_fft/2;
+
+fft_y2 = 2/N_fft*abs(fft(I_ud(1:N_fft).*hann(N_fft)'));
+fft_y3 = 2/N_fft*abs(fft(I_d(1:N_fft).*hann(N_fft)'));
+
+[i, v] = get_maxpur(fft_y2, fa, f);
+max_spur_freq = (i*fa/N_fft);
+max_spur_value = 20*log10(v);
+
+[i, v] = get_maxpur(fft_y3, fa, f);
+max_ditherd_spur_freq = (i*fa/N_fft);
+max_ditherd_spur_value = 20*log10(v);
+
+% Output
+close all;
+
+subplot(2,1,1)
+plot(fa/N_fft*(0:N_fft2),20*log10(1E-6+fft_y2(1:N_fft2+1)), '-', fa/N_fft*(0:N_fft2), max_spur_value*ones(1,N_fft2+1), 'r-', [max_spur_freq], [max_spur_value], 'ro'); grid;
+spur_legend = sprintf('Max. spur %.1fdB at %.1fMHz', max_spur_value, max_spur_freq);
+legend('With dithering', spur_legend);
+legend('No dithering', spur_legend);
+title('Table');
+ylabel('dB');
+xlabel('f/MHz');
+axis([0 fa/2 -120 0]);
+subplot(2,1,2)
+plot(fa/N_fft*(0:N_fft2),20*log10(1E-6+fft_y3(1:N_fft2+1)), '-', fa/N_fft*(0:N_fft2), max_ditherd_spur_value*ones(1,N_fft2+1), 'r-', [max_ditherd_spur_freq], [max_ditherd_spur_value], 'ro'); grid;
+spur_legend = sprintf('Max. spur %.1fdB at %.1fMHz', max_ditherd_spur_value, max_ditherd_spur_freq);
+legend('With dithering', spur_legend);
+title('Table');
+ylabel('dB');
+xlabel('f/MHz');
+axis([0 fa/2 -120 0]);
+
+figure;
+hist(LFSR, nbins)
+
+function [max_i, max_v] = get_maxpur(spec, fa, f)
+max_v = 0;
+max_i = 0;
+for ii=1:fix(length(spec)/2+1),
+ fi = ii*fa/length(spec);
+ dfi = fi - f;
+ if abs(dfi) > 0.05*f
+ if spec(ii) > max_v
+ max_v = spec(ii);
+ max_i = ii;
+ end
+ end;
+end;
diff --git a/lib/radio/nco/src/nco.vhd b/lib/radio/nco/src/nco.vhd
new file mode 100644
index 0000000..25b7f1d
--- /dev/null
+++ b/lib/radio/nco/src/nco.vhd
@@ -0,0 +1,223 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: cordic_stage - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.nco_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+
+entity nco is
+Generic
+(
+ nbits_wave : integer := 18;
+ nbits_phase : integer := 16;
+ nbits_lut_depth : integer := 12;
+ nbits_dither : integer := 4;
+ nbits_lfsr : integer := 12;
+ q_phase : phase_relation_t := phase_90deg;
+ has_pipe_reg : boolean := false;
+ has_out_reg : boolean := false
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ pacc_clr : in std_logic;
+ pacc_inc : in std_logic;
+ freq_in : in unsigned(nbits_phase-1 downto 0);
+ freq_load : in std_logic;
+ phase_in : in unsigned(nbits_phase-1 downto 0);
+ phase_load : in std_logic;
+ phase_out : out unsigned(nbits_phase-1 downto 0);
+ wave_out_i : out sfixed;
+ wave_out_q : out sfixed;
+ out_valid : out std_logic
+);
+end nco;
+
+architecture Behavioral of nco is
+
+ COMPONENT wavelut
+ Generic
+ (
+ nbits_wave : integer;
+ nbits_wave_frac : integer;
+ nbits_lut_depth : integer;
+ q_phase : phase_relation_t;
+ has_out_reg : boolean
+ );
+ Port
+ (
+ clk : in std_logic;
+ rst : in std_logic;
+ addr_valid : in std_logic;
+ addr : in unsigned(nbits_lut_depth-1 downto 0);
+ wave_i_out : out sfixed;
+ wave_q_out : out sfixed;
+ valid_out : out std_logic
+ );
+ END COMPONENT;
+
+-------------------------------------------------------------------------------
+ constant nbits_wave_frac : integer := nbits_wave;
+
+-------------------------------------------------------------------------------
+ constant lfsr_gen_poly : unsigned(nbits_lfsr-1 downto 0) := to_unsigned(lfsr_poly(nbits_lfsr), nbits_lfsr); -- 24
+
+ signal phase : unsigned(nbits_phase-1 downto 0);
+ signal freq_in_r : unsigned(nbits_phase-1 downto 0);
+ signal phase_in_r : unsigned(nbits_phase-1 downto 0);
+ signal lut_addr_d : unsigned(nbits_lut_depth-1 downto 0);
+ signal wave_i_d, wave_q_d : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+
+ type lfsr_t is array (0 to 1) of unsigned(nbits_lfsr-1 downto 0);
+ signal lfsr : lfsr_t;
+ signal lfsr_out : unsigned(nbits_dither-1 downto 0);
+ signal lut_addr_valid, lfsr_valid, wave_d_valid : std_logic;
+
+-------------------------------------------------------------------------------
+begin
+
+ wave_out_i <= wave_i_d;
+ wave_out_q <= wave_q_d;
+ out_valid <= wave_d_valid;
+
+------------------------------------------------------------
+ proc_lfsr: process(srst, clk, lfsr, pacc_inc)
+ variable lo : unsigned(nbits_dither-1 downto 0);
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ lfsr_valid <= '0';
+ lfsr_out <= (others => '0');
+ for i in lfsr'range loop
+ lfsr(i) <= to_unsigned(2**i, nbits_lfsr);
+ end loop;
+ else
+ lfsr_valid <= '0';
+ if pacc_inc ='1' then
+ lfsr_valid <= '1';
+ lo := (others => '0');
+ for i in lfsr'range loop
+ if lfsr(i)(lfsr(i)'left) = '1' then
+ lfsr(i) <= (lfsr(i)(lfsr(i)'left-1 downto 0) & lfsr(i)(lfsr(i)'left)) xor lfsr_gen_poly;
+ else
+ lfsr(i) <= lfsr(i)(lfsr(i)'left-1 downto 0) & lfsr(i)(lfsr(i)'left);
+ end if;
+ end loop;
+ for i in lfsr'range loop
+ lo := lo + lfsr(i)(nbits_dither-1 downto 0);
+ end loop;
+ -- lo := lfsr(0)(nbits_dither downto 0);
+ lfsr_out <= lo(nbits_dither-1 downto 0);
+ end if;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_phase_accu: process(clk, phase)
+ variable phase_accu : unsigned(nbits_phase-1 downto 0);
+
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ phase_accu := (others => '0');
+ else
+ phase <= phase_accu + phase_in_r;
+ if pacc_clr = '1' then
+ phase_accu := (others => '0');
+ elsif pacc_inc = '1' then
+ phase_accu := phase_accu + freq_in_r;
+ end if;
+ end if;
+ end if;
+ phase_out <= phase;
+ end process;
+
+------------------------------------------------------------
+ freq_in_reg: process(srst, clk, freq_load, freq_in)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ freq_in_r <= (others => '0');
+ elsif freq_load = '1' then
+ freq_in_r <= freq_in;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ phase_in_reg: process(srst, clk, phase_load, phase_in)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ phase_in_r <= (others => '0');
+ elsif phase_load = '1' then
+ phase_in_r <= phase_in;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_pipe_reg: process(clk)
+ variable lfsr_sum : unsigned(nbits_phase-1 downto 0);
+ begin
+ if rising_edge(clk) then
+ lut_addr_valid <= '0';
+ if srst = '1' then
+ lfsr_sum := (others => '0');
+ elsif lfsr_valid = '1' then
+ lut_addr_valid <= '1';
+ lfsr_sum := lfsr_out + phase;
+ end if;
+ end if;
+ lut_addr_d <= lfsr_sum(nbits_phase-1 downto nbits_phase-nbits_lut_depth);
+ end process;
+
+------------------------------------------------------------
+ inst_wavelut_d: wavelut
+ GENERIC MAP
+ (
+ nbits_wave => nbits_wave,
+ nbits_wave_frac => nbits_wave_frac,
+ nbits_lut_depth => nbits_lut_depth,
+ q_phase => q_phase,
+ has_out_reg => has_out_reg
+ )
+ PORT MAP
+ (
+ rst => srst,
+ clk => clk,
+ addr_valid => lut_addr_valid,
+ addr => lut_addr_d,
+ wave_i_out => wave_i_d,
+ wave_q_out => wave_q_d,
+ valid_out => wave_d_valid
+ );
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/radio/nco/src/nco.vhd.bak b/lib/radio/nco/src/nco.vhd.bak
new file mode 100644
index 0000000..657b97a
--- /dev/null
+++ b/lib/radio/nco/src/nco.vhd.bak
@@ -0,0 +1,240 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: cordic_stage - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.nco_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+
+entity nco is
+Generic
+(
+ nbits_wave : integer := 12;
+ nbits_phase : integer := 16;
+ nbits_lut_depth : integer := 12;
+ nbits_dither : integer := 4;
+ nbits_lfsr : integer := 12;
+ has_pipe_reg : boolean := false;
+ has_out_reg : boolean := false
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ pacc_clr : in std_logic;
+ pacc_inc : in std_logic;
+ freq_in : in unsigned(nbits_phase-1 downto 0);
+ freq_load : in std_logic;
+ phase_in : in unsigned(nbits_phase-1 downto 0);
+ phase_load : in std_logic;
+ phase_out : out unsigned(nbits_phase-1 downto 0);
+ wave_out_i : out sfixed;
+ wave_out_q : out sfixed;
+ out_valid : out std_logic
+);
+end nco;
+
+architecture Behavioral of nco is
+
+ COMPONENT wavelut
+ Generic
+ (
+ nbits_wave : integer;
+ nbits_wave_frac : integer;
+ nbits_lut_depth : integer;
+ has_out_reg : boolean
+ );
+ Port
+ (
+ clk : in std_logic;
+ addr_valid : in std_logic;
+ addr : in unsigned(nbits_lut_depth-1 downto 0);
+ wave_i_out : out sfixed;
+ wave_q_out : out sfixed
+ );
+ END COMPONENT;
+
+-------------------------------------------------------------------------------
+ constant nbits_wave_frac : integer := nbits_wave;
+
+-------------------------------------------------------------------------------
+ constant lfsr_gen_poly : unsigned(nbits_lfsr-1 downto 0) := to_unsigned(lfsr_poly(nbits_lfsr), nbits_lfsr); -- 24
+
+ signal valid : std_logic_vector(3 downto 0);
+ signal phase : unsigned(nbits_phase-1 downto 0);
+ signal freq_in_r : unsigned(nbits_phase-1 downto 0);
+ signal phase_in_r : unsigned(nbits_phase-1 downto 0);
+ signal lsfr_sum : unsigned(nbits_phase-1 downto 0);
+ signal lut_addr : unsigned(nbits_lut_depth-1 downto 0);
+ signal wave_i, wave_q : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+ type lfsr_t is array (0 to 1) of unsigned(nbits_lfsr-1 downto 0);
+ signal lfsr : lfsr_t;
+ signal lfsr_out : unsigned(nbits_dither-1 downto 0);
+ signal lut_addr_valid _ std_logic;
+
+-------------------------------------------------------------------------------
+begin
+
+ wave_out_i <= wave_i;
+ wave_out_q <= wave_q;
+
+------------------------------------------------------------
+ proc_ctrl: process(srst, clk, pacc_inc, pacc_clr)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ valid <= (others => '0');
+ else
+ valid <= valid(valid'left-1 downto valid'right) & (pacc_inc or pacc_clr);
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_lfsr: process(srst, clk, lfsr, pacc_inc)
+ variable lo : unsigned(nbits_dither downto 0);
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ for i in lfsr'range loop
+ lfsr(i) <= to_unsigned(1234+2**i, nbits_lfsr);
+ end loop;
+ elsif pacc_inc ='1' then
+ lo := (others => '0');
+ for i in lfsr'range loop
+ if lfsr(i)(lfsr(i)'left) = '1' then
+ lfsr(i) <= (lfsr(i)(lfsr(i)'left-1 downto 0) & lfsr(i)(lfsr(i)'left)) xor lfsr_gen_poly;
+ else
+ lfsr(i) <= lfsr(i)(lfsr(i)'left-1 downto 0) & lfsr(i)(lfsr(i)'left);
+ end if;
+ end loop;
+ for i in lfsr'range loop
+ lo := lo + lfsr(i)(nbits_dither-1 downto 0);
+ end loop;
+-- lo := lfsr(0)(nbits_dither downto 0);
+ lfsr_out <= lo(nbits_dither-1 downto 0);
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_phase_accu: process(srst, clk, pacc_clr, pacc_inc, freq_in_r, phase_in_r)
+ variable phase_accu : unsigned(nbits_phase-1 downto 0);
+
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ phase_accu := (others => '0');
+ else
+ phase <= phase_accu + phase_in_r;
+ if pacc_clr = '1' then
+ phase_accu := (others => '0');
+ elsif pacc_inc = '1' then
+ phase_accu := phase_accu + freq_in_r;
+ end if;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ freq_in_reg: process(srst, clk, freq_load, freq_in)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ freq_in_r <= (others => '0');
+ elsif freq_load = '1' then
+ freq_in_r <= freq_in;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ phase_in_reg: process(srst, clk, phase_load, phase_in)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ phase_in_r <= (others => '0');
+ elsif phase_load = '1' then
+ phase_in_r <= phase_in;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_pipe_reg: process(clk)
+ begin
+ if rising_edge(clk) then
+ lsfr_sum <= lfsr_out + phase;
+ lut_addr <= lsfr_sum(nbits_phase-1 downto nbits_phase-nbits_lut_depth);
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_out_reg: process(clk, phase)
+ begin
+ if has_out_reg = true then
+ if rising_edge(clk) then
+ phase_out <= phase;
+ end if;
+ else
+ phase_out <= phase;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_valid_reg: process(clk, valid)
+ begin
+ out_valid <= valid(valid'right+1);
+ if has_out_reg = true then
+ out_valid <= valid(valid'right+2);
+ if has_pipe_reg = true then
+ out_valid <= valid(valid'right+3);
+ end if;
+ elsif has_pipe_reg = true then
+ out_valid <= valid(valid'right+2);
+ end if;
+ end process;
+
+------------------------------------------------------------
+ inst_wavelut_d: wavelut
+ GENERIC MAP
+ (
+ nbits_wave => nbits_wave,
+ nbits_wave_frac => nbits_wave_frac,
+ nbits_lut_depth => nbits_lut_depth,
+ has_out_reg => has_out_reg
+ )
+ PORT MAP
+ (
+ clk => clk,
+ addr => lut_addr,
+ addr_valid => lut_addr_valid,
+ wave_i_out => wave_i,
+ wave_q_out => wave_q
+ );
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/radio/nco/src/nco_dbg.vhd b/lib/radio/nco/src/nco_dbg.vhd
new file mode 100644
index 0000000..c0038a9
--- /dev/null
+++ b/lib/radio/nco/src/nco_dbg.vhd
@@ -0,0 +1,253 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: cordic_stage - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.nco_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+
+entity nco is
+Generic
+(
+ nbits_wave : integer := 18;
+ nbits_phase : integer := 16;
+ nbits_lut_depth : integer := 12;
+ nbits_dither : integer := 4;
+ nbits_lfsr : integer := 12;
+ q_phase : phase_relation_t := phase_90deg;
+ has_pipe_reg : boolean := false;
+ has_out_reg : boolean := false
+);
+Port
+(
+ srst : in std_logic;
+ clk : in std_logic;
+ pacc_clr : in std_logic;
+ pacc_inc : in std_logic;
+ freq_in : in unsigned(nbits_phase-1 downto 0);
+ freq_load : in std_logic;
+ phase_in : in unsigned(nbits_phase-1 downto 0);
+ phase_load : in std_logic;
+ phase_out : out unsigned(nbits_phase-1 downto 0);
+ wave_out_i : out sfixed;
+ wave_out_q : out sfixed;
+ out_valid : out std_logic;
+ debug_out : out debug_out_t
+);
+end nco;
+
+architecture Behavioral of nco is
+
+ COMPONENT wavelut
+ Generic
+ (
+ nbits_wave : integer;
+ nbits_wave_frac : integer;
+ nbits_lut_depth : integer;
+ q_phase : phase_relation_t;
+ has_out_reg : boolean
+ );
+ Port
+ (
+ clk : in std_logic;
+ rst : in std_logic;
+ addr_valid : in std_logic;
+ addr : in unsigned(nbits_lut_depth-1 downto 0);
+ wave_i_out : out sfixed;
+ wave_q_out : out sfixed;
+ valid_out : out std_logic
+ );
+ END COMPONENT;
+
+-------------------------------------------------------------------------------
+ constant nbits_wave_frac : integer := nbits_wave;
+
+-------------------------------------------------------------------------------
+ constant lfsr_gen_poly : unsigned(nbits_lfsr-1 downto 0) := to_unsigned(lfsr_poly(nbits_lfsr), nbits_lfsr); -- 24
+
+ signal phase : unsigned(nbits_phase-1 downto 0);
+ signal freq_in_r : unsigned(nbits_phase-1 downto 0);
+ signal phase_in_r : unsigned(nbits_phase-1 downto 0);
+ signal lut_addr_ud : unsigned(nbits_lut_depth-1 downto 0);
+ signal lut_addr_d : unsigned(nbits_lut_depth-1 downto 0);
+ signal wave_i_d, wave_q_d : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+ signal wave_i_ud, wave_q_ud : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+
+ type lfsr_t is array (0 to 1) of unsigned(nbits_lfsr-1 downto 0);
+ signal lfsr : lfsr_t;
+ signal lfsr_out : unsigned(nbits_dither-1 downto 0);
+ signal lut_addr_valid, lfsr_valid, wave_d_valid, wave_ud_valid : std_logic;
+
+-------------------------------------------------------------------------------
+begin
+
+ wave_out_i <= wave_i_d;
+ wave_out_q <= wave_q_d;
+ out_valid <= wave_d_valid;
+
+ debug_out.lfsr <= (debug_out.lfsr'left downto (debug_out.lfsr'right+lfsr_out'left+1) => '0') & lfsr_out;
+ debug_out.i_d <= to_real(wave_i_d);
+ debug_out.q_d <= to_real(wave_q_d);
+ debug_out.i_ud <= to_real(wave_i_ud);
+ debug_out.q_ud <= to_real(wave_q_ud);
+
+------------------------------------------------------------
+ proc_lfsr: process(srst, clk, lfsr, pacc_inc)
+ variable lo : unsigned(nbits_dither-1 downto 0);
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ lfsr_valid <= '0';
+ lfsr_out <= (others => '0');
+ for i in lfsr'range loop
+ lfsr(i) <= to_unsigned(2**i, nbits_lfsr);
+ end loop;
+ else
+ lfsr_valid <= '0';
+ if pacc_inc ='1' then
+ lfsr_valid <= '1';
+ lo := (others => '0');
+ for i in lfsr'range loop
+ if lfsr(i)(lfsr(i)'left) = '1' then
+ lfsr(i) <= (lfsr(i)(lfsr(i)'left-1 downto 0) & lfsr(i)(lfsr(i)'left)) xor lfsr_gen_poly;
+ else
+ lfsr(i) <= lfsr(i)(lfsr(i)'left-1 downto 0) & lfsr(i)(lfsr(i)'left);
+ end if;
+ end loop;
+ for i in lfsr'range loop
+ lo := lo + lfsr(i)(nbits_dither-1 downto 0);
+ end loop;
+ -- lo := lfsr(0)(nbits_dither downto 0);
+ lfsr_out <= lo(nbits_dither-1 downto 0);
+ end if;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_phase_accu: process(srst, clk, pacc_clr, pacc_inc, freq_in_r, phase_in_r)
+ variable phase_accu : unsigned(nbits_phase-1 downto 0);
+
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ phase_accu := (others => '0');
+ else
+ phase <= phase_accu + phase_in_r;
+ if pacc_clr = '1' then
+ phase_accu := (others => '0');
+ elsif pacc_inc = '1' then
+ phase_accu := phase_accu + freq_in_r;
+ end if;
+ end if;
+ end if;
+ phase_out <= phase;
+ end process;
+
+------------------------------------------------------------
+ freq_in_reg: process(srst, clk, freq_load, freq_in)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ freq_in_r <= (others => '0');
+ elsif freq_load = '1' then
+ freq_in_r <= freq_in;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ phase_in_reg: process(srst, clk, phase_load, phase_in)
+ begin
+ if rising_edge(clk) then
+ if srst = '1' then
+ phase_in_r <= (others => '0');
+ elsif phase_load = '1' then
+ phase_in_r <= phase_in;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+ proc_pipe_reg: process(clk)
+ variable lfsr_sum : unsigned(nbits_phase-1 downto 0);
+ begin
+ if rising_edge(clk) then
+ lut_addr_valid <= '0';
+ if srst = '1' then
+ lfsr_sum := (others => '0');
+ elsif lfsr_valid = '1' then
+ lut_addr_valid <= '1';
+ lfsr_sum := lfsr_out + phase;
+ end if;
+ end if;
+ lut_addr_d <= lfsr_sum(nbits_phase-1 downto nbits_phase-nbits_lut_depth);
+ lut_addr_ud <= phase(nbits_phase-1 downto nbits_phase-nbits_lut_depth);
+ end process;
+
+------------------------------------------------------------
+ inst_wavelut_ud: wavelut
+ GENERIC MAP
+ (
+ nbits_wave => nbits_wave,
+ nbits_wave_frac => nbits_wave_frac,
+ nbits_lut_depth => nbits_lut_depth,
+ q_phase => q_phase,
+ has_out_reg => has_out_reg
+ )
+ PORT MAP
+ (
+ rst => srst,
+ clk => clk,
+ addr_valid => lut_addr_valid,
+ addr => lut_addr_ud,
+ wave_i_out => wave_i_ud,
+ wave_q_out => wave_q_ud,
+ valid_out => wave_ud_valid
+ );
+
+ inst_wavelut_d: wavelut
+ GENERIC MAP
+ (
+ nbits_wave => nbits_wave,
+ nbits_wave_frac => nbits_wave_frac,
+ nbits_lut_depth => nbits_lut_depth,
+ q_phase => q_phase,
+ has_out_reg => has_out_reg
+ )
+ PORT MAP
+ (
+ rst => srst,
+ clk => clk,
+ addr_valid => lut_addr_valid,
+ addr => lut_addr_d,
+ wave_i_out => wave_i_d,
+ wave_q_out => wave_q_d,
+ valid_out => wave_d_valid
+ );
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/radio/nco/src/nco_pkg.vhd b/lib/radio/nco/src/nco_pkg.vhd
new file mode 100644
index 0000000..0bb9cef
--- /dev/null
+++ b/lib/radio/nco/src/nco_pkg.vhd
@@ -0,0 +1,117 @@
+
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use ieee.numeric_std.all;
+use IEEE.MATH_REAL.ALL;
+use work.fixed_pkg.all;
+
+-------------------------------------------------------------------------------
+package nco_pkg is
+
+ constant tpd : time := 0 ns;
+
+ -- Global set arithmetic rounding mode
+ constant pi : real := 3.141592653589793e+000;
+ constant sqrt2 : real := 1.414213562373095e+000;
+ constant sqrt2_inv : real := 7.071067811865475e-001;
+
+ type real_array_t is array (natural range <>) of real;
+ type natural_array_t is array (natural range <>) of natural;
+ type phase_relation_t is (phase_90deg, phase_270deg);
+
+ type debug_out_t is record
+ lfsr : unsigned(31 downto 0);
+ i_ud : real;
+ q_ud : real;
+ i_d : real;
+ q_d : real;
+ end record;
+
+ constant lfsr_poly : natural_array_t(3 to 24) :=
+ (
+ 12, -- 3
+ 24, -- 4
+ 58, -- 5
+ 114, -- 6
+ 210, -- 7
+ 500, -- 8
+ 1000, -- 9
+ 1824, -- 10
+ 3712, -- 11
+ 7184, -- 12
+ 14592, -- 13
+ 28674, -- 14
+ 59392, -- 15
+ 106512, -- 16
+ 245760, -- 17
+ 466944, -- 18
+ 933888, -- 19
+ 1654784, -- 20
+ 3735552, -- 21
+ 7342080, -- 22
+ 14745600, -- 23
+ 14811138 -- 24
+ );
+
+ function sin_tbl(nsamples : integer; omega, phi_in : real) return real_array_t;
+ function cos_tbl(nsamples : integer; omega, phi_in : real) return real_array_t;
+
+ -------------------------------------------------------------
+ -- Constructor helpers
+ -- Use: variable v8u6 : ufixed_t(ufixed(8,6)'range);
+ function uproto (nbits : integer; nbits_frac : integer) return ufixed;
+
+ -- Use: variable v8s6 : sfixed_t(sfixed(8,6)'range);
+ function sproto (nbits : integer; nbits_frac : integer) return sfixed;
+
+end; -- package nco_pkg;
+
+-------------------------------------------------------------------------------
+package body nco_pkg is
+
+ function sin_tbl(nsamples : integer; omega, phi_in : real) return real_array_t is
+ variable tbl : real_array_t (0 to nsamples-1);
+ variable phi : real := phi_in;
+ variable dphi : real := 2.0*pi*omega;
+
+ begin
+ for i in 0 to nsamples-1 loop
+ tbl(i) := sin(phi);
+ phi := phi + dphi;
+ end loop;
+
+ return tbl;
+ end sin_tbl;
+
+ -------------------------------------------------------------
+ function cos_tbl(nsamples : integer; omega, phi_in : real) return real_array_t is
+ variable tbl : real_array_t (0 to nsamples-1);
+ variable phi : real := phi_in;
+ variable dphi : real := 2.0*pi*omega;
+
+ begin
+ for i in 0 to nsamples-1 loop
+ tbl(i) := cos(phi);
+ phi := phi + dphi;
+ end loop;
+
+ return tbl;
+ end cos_tbl;
+
+ -------------------------------------------------------------
+ -- Constuctor helpers
+ function uproto (nbits : integer; nbits_frac : integer) return ufixed is
+ constant result : ufixed (nbits-nbits_frac-1 downto -nbits_frac) := (others => '0');
+ begin
+ return result(nbits-nbits_frac-1 downto -nbits_frac);
+ end uproto;
+
+ -------------------------------------------------------------
+ function sproto (nbits : integer; nbits_frac : integer) return sfixed is
+ constant result : sfixed (nbits-nbits_frac downto -nbits_frac+1) := (others => '0');
+ begin
+ return result(nbits-nbits_frac downto -nbits_frac+1);
+ end sproto;
+
+-------------------------------------------------------------------------------
+end; -- package nco_pkg;
diff --git a/lib/radio/nco/src/tb_nco.vhd b/lib/radio/nco/src/tb_nco.vhd
new file mode 100644
index 0000000..f2d930a
--- /dev/null
+++ b/lib/radio/nco/src/tb_nco.vhd
@@ -0,0 +1,299 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 17:16:42 13.05.2007
+-- Design Name: tb_nco
+-- Module Name: tb_nco.vhd
+-- Project Name: nco
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+--------------------------------------------------------------------------------
+LIBRARY ieee;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use std.textio.all; -- Imports the standard textio package.
+
+library work;
+use work.fixed_pkg.all;
+use work.nco_pkg.all;
+use work.PCK_FIO.all;
+
+ENTITY tb_nco IS
+ Generic (
+ nbits_wave : integer := 18;
+ nbits_phase : integer := 16;
+ nbits_lut_depth : integer := 12;
+ nbits_dither : integer := 4;
+ nbits_lfsr : integer := 12;
+ q_phase : phase_relation_t := phase_270deg;
+ has_pipe_reg : boolean := true;
+ has_out_reg : boolean := true
+ );
+END tb_nco;
+
+ARCHITECTURE behavior OF tb_nco IS
+
+ -- Component Declaration for the Unit Under Test (UUT)
+ COMPONENT nco
+ GENERIC (
+ nbits_wave : integer;
+ nbits_phase : integer;
+ nbits_lut_depth : integer;
+ nbits_dither : integer;
+ nbits_lfsr : integer;
+ q_phase : phase_relation_t;
+ has_pipe_reg : boolean;
+ has_out_reg : boolean
+ );
+ PORT(
+ srst : in std_logic;
+ clk : in std_logic;
+-- ce : in std_logic;
+ pacc_clr : in std_logic;
+ pacc_inc : in std_logic;
+ freq_in : in unsigned(nbits_phase-1 downto 0);
+ freq_load : in std_logic;
+ phase_in : in unsigned(nbits_phase-1 downto 0);
+ phase_load : in std_logic;
+ phase_out : out unsigned(nbits_phase-1 downto 0);
+ wave_out_i : out sfixed;
+ wave_out_q : out sfixed;
+ out_valid : out std_logic;
+ debug_out : out debug_out_t
+ );
+ END COMPONENT;
+
+ --Constants
+ constant f : REAL := 4.1667E6;
+ constant df : REAL := 10.0E3;
+ constant fa : REAL := 100.0E6;
+ constant PERIOD : time := 10 ns;
+ constant nbits_wave_frac : integer := nbits_wave;
+
+ SIGNAL freq_word : integer := integer(f/fa*2.0**nbits_phase);
+ SIGNAL dfreq_word : integer := integer(df/fa*2.0**nbits_phase);
+
+ --Inputs
+ SIGNAL clk : std_logic := '0';
+-- SIGNAL ce : std_logic := '0';
+ SIGNAL srst : std_logic := '1';
+ SIGNAL pacc_clr : std_logic := '0';
+ SIGNAL pacc_inc : std_logic := '0';
+ SIGNAL phase_load : std_logic := '0';
+ SIGNAL freq_load : std_logic := '0';
+ SIGNAL freq_in : unsigned(nbits_phase-1 downto 0);
+ SIGNAL phase_in : unsigned(nbits_phase-1 downto 0);
+
+ --Outputs
+ SIGNAL wave_out_i : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+ SIGNAL wave_out_q : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+ SIGNAL out_valid : std_logic;
+ SIGNAL phase_out : unsigned(nbits_phase-1 downto 0);
+ SIGNAL debug_out : debug_out_t;
+
+ SIGNAL fileout_enable : std_logic := '0';
+
+BEGIN
+
+ -- Instantiate the Unit Under Test (UUT)
+ uut: nco
+ GENERIC MAP (
+ nbits_wave => nbits_wave,
+ nbits_phase => nbits_phase,
+ nbits_lut_depth => nbits_lut_depth,
+ nbits_dither => nbits_dither,
+ nbits_lfsr => nbits_lfsr,
+ q_phase => q_phase,
+ has_pipe_reg => has_pipe_reg,
+ has_out_reg => has_out_reg
+ )
+ PORT MAP(
+ srst => srst,
+ clk => clk,
+-- ce => ce,
+ pacc_clr => pacc_clr,
+ pacc_inc => pacc_inc,
+ freq_in => freq_in,
+ freq_load => freq_load,
+ phase_in => phase_in,
+ phase_load => phase_load,
+ phase_out => phase_out,
+ wave_out_i => wave_out_i,
+ wave_out_q => wave_out_q,
+ out_valid => out_valid,
+ debug_out => debug_out
+ );
+
+ tb_clk : PROCESS
+ BEGIN
+ clk <= not clk;
+ wait for PERIOD/2;
+ END PROCESS;
+
+ tb : PROCESS
+ file RESULT_FREQ: text open write_mode is "freq.txt";
+ variable L: line;
+
+ BEGIN
+
+ -- Wait 100 ns for global reset to finish
+ wait for 4*PERIOD;
+ srst <= '0';
+
+ fprint(RESULT_FREQ, L,"%s\n", REAL'image(f));
+
+ wait for 2*PERIOD;
+-- ce <= '1';
+ -------------------------------------------
+ -- 1
+ phase_in <= to_unsigned(0,nbits_phase);
+ wait until rising_edge(clk);
+ phase_load <= '1';
+ wait until rising_edge(clk);
+ phase_load <= '0';
+
+ freq_in <= to_unsigned(1411,nbits_phase);
+ wait until rising_edge(clk);
+ freq_load <= '1';
+ wait until rising_edge(clk);
+ freq_load <= '0';
+
+ wait for 2*PERIOD;
+ pacc_inc <= '1';
+
+ wait for 2*PERIOD;
+ wait until rising_edge(clk);
+
+ wait for 40*PERIOD;
+ -------------------------------------------
+ freq_in <= to_unsigned(643,nbits_phase);
+ wait until rising_edge(clk);
+ freq_load <= '1';
+ wait until rising_edge(clk);
+ freq_load <= '0';
+
+ wait for 40*PERIOD;
+ -------------------------------------------
+ phase_in <= to_unsigned(800,nbits_phase);
+ wait until rising_edge(clk);
+ phase_load <= '1';
+ wait until rising_edge(clk);
+ phase_load <= '0';
+
+ wait for 20*PERIOD;
+ -------------------------------------------
+ phase_in <= to_unsigned(45072,nbits_phase);
+ wait until rising_edge(clk);
+ phase_load <= '1';
+ wait until rising_edge(clk);
+ phase_load <= '0';
+
+ wait for 20*PERIOD;
+ -------------------------------------------
+ phase_in <= to_unsigned(20593,nbits_phase);
+ wait until rising_edge(clk);
+ phase_load <= '1';
+ wait until rising_edge(clk);
+ phase_load <= '0';
+
+ -------------------------------------------
+ freq_in <= to_unsigned(freq_word,nbits_phase);
+ wait until rising_edge(clk);
+ freq_load <= '1';
+ wait until rising_edge(clk);
+ freq_load <= '0';
+
+ wait for 20*PERIOD;
+ fileout_enable <= '1';
+
+ wait for 20000*PERIOD;
+ fileout_enable <= '0';
+
+ -------------------------------------------
+ -- Sweep
+ freq_word <= 100;
+ for i in 1 to 200 loop
+ wait for 20*PERIOD;
+ freq_word <= freq_word + dfreq_word;
+
+ freq_in <= to_unsigned(freq_word,nbits_phase);
+ wait until rising_edge(clk);
+ freq_load <= '1';
+ wait until rising_edge(clk);
+ freq_load <= '0';
+
+ end loop;
+
+ pacc_inc <= '0';
+ wait for 20*PERIOD;
+ fileout_enable <= '0';
+ wait until rising_edge(clk);
+ pacc_clr <= '1';
+ wait until rising_edge(clk);
+ pacc_clr <= '0';
+ wait for 20*PERIOD;
+ pacc_inc <= '1';
+ wait for 20*PERIOD;
+ wait until rising_edge(clk);
+ pacc_clr <= '1';
+ wait until rising_edge(clk);
+ pacc_clr <= '0';
+ wait for 20*PERIOD;
+ pacc_inc <= '0';
+ wait for 20*PERIOD;
+ wait until rising_edge(clk);
+ pacc_inc <= '1';
+ wait until rising_edge(clk);
+ pacc_inc <= '0';
+ wait for 20*PERIOD;
+ wait until rising_edge(clk);
+ srst <= '1';
+ wait until rising_edge(clk);
+ srst <= '0';
+ freq_in <= to_unsigned(freq_word,nbits_phase);
+ wait until rising_edge(clk);
+ freq_load <= '1';
+ wait until rising_edge(clk);
+ freq_load <= '0';
+
+ wait for 20*PERIOD;
+ pacc_inc <= '1';
+ wait for 20*PERIOD;
+ wait until rising_edge(clk);
+ srst <= '1';
+ wait until rising_edge(clk);
+ srst <= '0';
+ wait for 20*PERIOD;
+ pacc_inc <= '0';
+
+ wait for 20*PERIOD;
+
+ assert false report "Test finished" severity error;
+ wait;
+ END PROCESS;
+
+ tb_fo : PROCESS(clk, fileout_enable, out_valid)
+ file RESULT_I: text open write_mode is "i_ud.txt";
+ file RESULT_Q: text open write_mode is "q_ud.txt";
+ file RESULT_ID: text open write_mode is "i_d.txt";
+ file RESULT_QD: text open write_mode is "q_d.txt";
+ file RESULT_LFSR: text open write_mode is "lfsr.txt";
+ variable L: line;
+
+ BEGIN
+ if rising_edge(clk) and fileout_enable = '1' and out_valid = '1' then
+ fprint(RESULT_I, L,"%s\n", REAL'image(debug_out.i_ud));
+ fprint(RESULT_Q, L,"%s\n", REAL'image(debug_out.q_ud));
+ fprint(RESULT_ID, L,"%s\n", REAL'image(debug_out.i_d));
+ fprint(RESULT_QD, L,"%s\n", REAL'image(debug_out.q_d));
+ fprint(RESULT_LFSR, L,"%s\n", INTEGER'image(to_integer(debug_out.lfsr)));
+ end if;
+
+ END PROCESS;
+
+
+END;
diff --git a/lib/radio/nco/src/wavelut.vhd b/lib/radio/nco/src/wavelut.vhd
new file mode 100644
index 0000000..4b0f02e
--- /dev/null
+++ b/lib/radio/nco/src/wavelut.vhd
@@ -0,0 +1,239 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: cordic_stage - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.nco_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+
+entity wavelut is
+Generic
+(
+ nbits_wave : integer := 12;
+ nbits_wave_frac : integer := 12;
+ nbits_lut_depth : integer := 12;
+ q_phase : phase_relation_t := phase_90deg;
+ has_out_reg : boolean := false
+);
+Port
+(
+ rst : in std_logic;
+ clk : in std_logic;
+ addr_valid : in std_logic;
+ addr : in unsigned(nbits_lut_depth-1 downto 0);
+ wave_i_out : out sfixed;
+ wave_q_out : out sfixed;
+ valid_out : out std_logic
+);
+end wavelut;
+
+architecture Behavioral of wavelut is
+
+ COMPONENT waverom_dual
+ Generic
+ (
+ nbits_wave : integer;
+ nbits_wave_frac : integer;
+ nbits_rom_depth : integer
+ );
+ Port
+ (
+ clk : in std_logic;
+ addr_i : in unsigned(nbits_rom_depth-1 downto 0);
+ addr_q : in unsigned(nbits_rom_depth-1 downto 0);
+ wave_i_out : out sfixed;
+ wave_q_out : out sfixed
+ );
+ END COMPONENT;
+
+-------------------------------------------------------------------------------
+constant nbits_rom_depth : integer := nbits_lut_depth-2;
+
+-------------------------------------------------------------------------------
+signal wave_i : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+signal wave_q : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+signal inv_i : std_logic;
+signal inv_q : std_logic;
+signal addr_i : unsigned(nbits_rom_depth-1 downto 0);
+signal addr_q : unsigned(nbits_rom_depth-1 downto 0);
+signal zero_i : std_logic;
+signal zero_q : std_logic;
+
+-------------------------------------------------------------------------------
+begin
+
+ inst_waverom_dual: waverom_dual
+ GENERIC MAP
+ (
+ nbits_wave => nbits_wave,
+ nbits_wave_frac => nbits_wave_frac,
+ nbits_rom_depth => nbits_rom_depth
+ )
+ PORT MAP
+ (
+ clk => clk,
+ addr_i => addr_i,
+ addr_q => addr_q,
+ wave_i_out => wave_i,
+ wave_q_out => wave_q
+ );
+
+------------------------------------------------------------
+proc_valid: process(clk)
+ variable v : unsigned(0 to 1);
+ begin
+ if rising_edge(clk) then
+ if rst = '1' then
+ v := (others => '0');
+ valid_out <= '0';
+ else
+ valid_out <= v(1);
+ v(1) := v(0);
+ v(0) := addr_valid;
+ end if;
+ end if;
+ end process;
+
+------------------------------------------------------------
+proc_tbl_addr_i: process(clk, addr)
+ variable index : unsigned(addr'left downto addr'right);
+ variable n2 : integer;
+ constant N_2 : integer := 2**(nbits_lut_depth-1);
+ constant N_4 : integer := 2**(nbits_lut_depth-2);
+ begin
+ n2 := to_integer(addr(addr'left-1 downto addr'right));
+ if n2 > N_4 then
+ index := to_unsigned(N_2 - n2, index'length);
+ else
+ index := to_unsigned(n2, index'length);
+ end if;
+
+ if rising_edge(clk) then
+ if rst = '1' then
+ addr_i <= (others => '0');
+ zero_i <= '0';
+ inv_i <= '0';
+ elsif addr_valid = '1' then
+ addr_i <= index(addr'left-2 downto addr'right);
+ zero_i <= index(addr'left-1);
+ inv_i <= addr(addr'left) xor addr(addr'left-1);
+ end if;
+ end if;
+
+ end process;
+
+-------------------------------------------------------------------------------
+proc_tbl_addr_q: process(clk, addr)
+ variable index : unsigned(addr'left downto addr'right);
+ variable n2 : integer;
+ constant N_4 : integer := 2**(nbits_lut_depth-2);
+
+ begin
+ n2 := to_integer(addr(addr'left-1 downto addr'right));
+ if n2 > N_4 then
+ index := to_unsigned(n2 - N_4, index'length);
+ else
+ index := to_unsigned(N_4 - n2, index'length);
+ end if;
+
+ if rising_edge(clk) then
+ if rst = '1' then
+ addr_q <= (others => '0');
+ zero_q <= '0';
+ inv_q <= '0';
+ elsif addr_valid = '1' then
+ addr_q <= index(addr'left-2 downto addr'right);
+ zero_q <= index(addr'left-1);
+ if q_phase = phase_90deg then
+ inv_q <= addr(addr'left);
+ elsif q_phase = phase_270deg then
+ inv_q <= not addr(addr'left);
+ end if;
+ end if;
+ end if;
+
+ end process;
+
+------------------------------------------------------------
+proc_out_i: process(clk, wave_i, inv_i, zero_i)
+ variable w : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+ variable z, inv : std_logic;
+ begin
+
+ w := to_sfixed(0.0, w);
+ if z = '0' then
+ w := wave_i;
+ if inv = '1' then
+ w := resize(-wave_i, w, fixed_truncate, fixed_wrap);
+ end if;
+ end if;
+
+ if has_out_reg = true then
+ if rising_edge(clk) then
+ wave_i_out <= w;
+ end if;
+ else
+ wave_i_out <= w;
+ end if;
+
+ if rising_edge(clk) then
+ z := zero_i;
+ inv := inv_i;
+ end if;
+
+ end process;
+
+------------------------------------------------------------
+proc_out_q: process(clk, wave_q, inv_q, zero_q)
+ variable w : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+ variable z, inv : std_logic;
+ begin
+
+ w := to_sfixed(0.0, w);
+ if z = '0' then
+ w := wave_q;
+ if inv = '1' then
+ w := resize(-wave_q, w, fixed_truncate, fixed_wrap);
+ end if;
+ end if;
+
+ if has_out_reg = true then
+ if rising_edge(clk) then
+ wave_q_out <= w;
+ end if;
+ else
+ wave_q_out <= w;
+ end if;
+
+ if rising_edge(clk) then
+ z := zero_q;
+ inv := inv_q;
+ end if;
+
+ end process;
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/radio/nco/src/waverom_dual.vhd b/lib/radio/nco/src/waverom_dual.vhd
new file mode 100644
index 0000000..4824eb0
--- /dev/null
+++ b/lib/radio/nco/src/waverom_dual.vhd
@@ -0,0 +1,86 @@
+--------------------------------------------------------------------------------
+-- Company:
+-- Engineer:
+--
+-- Create Date: 12:16:14 10/02/05
+-- Design Name:
+-- Module Name: cordic_stage - Behavioral
+-- Project Name:
+-- Target Device:
+-- Tool versions:
+-- Description:
+--
+-- Dependencies:
+--
+-- Revision:
+-- Revision 0.01 - File Created
+-- Additional Comments:
+--
+--------------------------------------------------------------------------------
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.MATH_REAL.ALL;
+USE ieee.numeric_std.ALL;
+use work.fixed_pkg.all;
+use work.nco_pkg.all;
+
+---- Uncomment the following library declaration if instantiating
+---- any Xilinx primitives in this code.
+--library UNISIM;
+--use UNISIM.VComponents.all;
+
+entity waverom_dual is
+Generic
+(
+ nbits_wave : integer := 12;
+ nbits_wave_frac : integer := 12;
+ nbits_rom_depth : integer := 12
+);
+Port
+(
+ clk : in std_logic;
+ addr_i : in unsigned(nbits_rom_depth-1 downto 0);
+ addr_q : in unsigned(nbits_rom_depth-1 downto 0);
+ wave_i_out : out sfixed;
+ wave_q_out : out sfixed
+);
+end waverom_dual;
+
+architecture Behavioral of waverom_dual is
+
+-------------------------------------------------------------------------------
+constant rom_depth : integer := 2**nbits_rom_depth;
+type wave_mem_t is array (0 to rom_depth-1) of sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low);
+
+constant sfixed_proto : sfixed(sproto(nbits_wave, nbits_wave_frac)'high downto sproto(nbits_wave, nbits_wave_frac)'low) := (others => '0');
+
+-------------------------------------------------------------------------------
+function to_wave_mem(wave_real : real_array_t; len : integer; proto : sfixed) return wave_mem_t is
+variable res : wave_mem_t;
+begin
+ for i in 0 to len-1 loop
+ res(i) := to_sfixed(wave_real(i), proto, fixed_round, fixed_saturate);
+ end loop;
+
+ return res;
+end to_wave_mem;
+
+-------------------------------------------------------------------------------
+-- Create ROM
+constant real_wave_tbl : real_array_t(0 to rom_depth-1) := cos_tbl(rom_depth, 0.25/real(rom_depth), 0.0);
+constant wave_tbl : wave_mem_t := to_wave_mem(real_wave_tbl, rom_depth, sfixed_proto);
+
+-------------------------------------------------------------------------------
+begin
+
+-------------------------------------------------------------------------------
+proc_wave: process(clk)
+ begin
+ if rising_edge(clk) then
+ wave_i_out <= wave_tbl(to_integer(addr_i));
+ wave_q_out <= wave_tbl(to_integer(addr_q));
+ end if;
+ end process;
+
+------------------------------------------------------------
+end Behavioral;
diff --git a/lib/uart/bbfifo_16x8.vhd b/lib/uart/bbfifo_16x8.vhd
new file mode 100644
index 0000000..d6604a6
--- /dev/null
+++ b/lib/uart/bbfifo_16x8.vhd
@@ -0,0 +1,281 @@
+-- 'Bucket Brigade' FIFO
+-- 16 deep
+-- 8-bit data
+--
+-- Version : 1.10
+-- Version Date : 3rd December 2003
+-- Reason : '--translate' directives changed to '--synthesis translate' directives
+--
+-- Version : 1.00
+-- Version Date : 14th October 2002
+--
+-- Start of design entry : 14th October 2002
+--
+-- Ken Chapman
+-- Xilinx Ltd
+-- Benchmark House
+-- 203 Brooklands Road
+-- Weybridge
+-- Surrey KT13 ORH
+-- United Kingdom
+--
+-- chapman@xilinx.com
+--
+------------------------------------------------------------------------------------
+--
+-- NOTICE:
+--
+-- Copyright Xilinx, Inc. 2002. This code may be contain portions patented by other
+-- third parties. By providing this core as one possible implementation of a standard,
+-- Xilinx is making no representation that the provided implementation of this standard
+-- is free from any claims of infringement by any third party. Xilinx expressly
+-- disclaims any warranty with respect to the adequacy of the implementation, including
+-- but not limited to any warranty or representation that the implementation is free
+-- from claims of any third party. Futhermore, Xilinx is providing this core as a
+-- courtesy to you and suggests that you contact all third parties to obtain the
+-- necessary rights to use this implementation.
+--
+------------------------------------------------------------------------------------
+--
+-- Library declarations
+--
+-- The Unisim Library is used to define Xilinx primitives. It is also used during
+-- simulation. The source can be viewed at %XILINX%\vhdl\src\unisims\unisim_VCOMP.vhd
+--
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+library unisim;
+use unisim.vcomponents.all;
+--
+------------------------------------------------------------------------------------
+--
+-- Main Entity for BBFIFO_16x8
+--
+entity bbfifo_16x8 is
+ Port ( data_in : in std_logic_vector(7 downto 0);
+ data_out : out std_logic_vector(7 downto 0);
+ reset : in std_logic;
+ write : in std_logic;
+ read : in std_logic;
+ full : out std_logic;
+ half_full : out std_logic;
+ data_present : out std_logic;
+ clk : in std_logic);
+ end bbfifo_16x8;
+--
+------------------------------------------------------------------------------------
+--
+-- Start of Main Architecture for BBFIFO_16x8
+--
+architecture low_level_definition of bbfifo_16x8 is
+--
+------------------------------------------------------------------------------------
+--
+------------------------------------------------------------------------------------
+--
+-- Signals used in BBFIFO_16x8
+--
+------------------------------------------------------------------------------------
+--
+signal pointer : std_logic_vector(3 downto 0);
+signal next_count : std_logic_vector(3 downto 0);
+signal half_count : std_logic_vector(3 downto 0);
+signal count_carry : std_logic_vector(2 downto 0);
+
+signal pointer_zero : std_logic;
+signal pointer_full : std_logic;
+signal decode_data_present : std_logic;
+signal data_present_int : std_logic;
+signal valid_write : std_logic;
+--
+--
+------------------------------------------------------------------------------------
+--
+-- Attributes to define LUT contents during implementation
+-- The information is repeated in the generic map for functional simulation--
+--
+------------------------------------------------------------------------------------
+--
+attribute INIT : string;
+attribute INIT of zero_lut : label is "0001";
+attribute INIT of full_lut : label is "8000";
+attribute INIT of dp_lut : label is "BFA0";
+attribute INIT of valid_lut : label is "C4";
+--
+------------------------------------------------------------------------------------
+--
+-- Start of BBFIFO_16x8 circuit description
+--
+------------------------------------------------------------------------------------
+--
+begin
+
+ -- SRL16E data storage
+
+ data_width_loop: for i in 0 to 7 generate
+ --
+ attribute INIT : string;
+ attribute INIT of data_srl : label is "0000";
+ --
+ begin
+
+ data_srl: SRL16E
+ --synthesis translate_off
+ generic map (INIT => X"0000")
+ --synthesis translate_on
+ port map( D => data_in(i),
+ CE => valid_write,
+ CLK => clk,
+ A0 => pointer(0),
+ A1 => pointer(1),
+ A2 => pointer(2),
+ A3 => pointer(3),
+ Q => data_out(i) );
+
+ end generate data_width_loop;
+
+ -- 4-bit counter to act as data pointer
+ -- Counter is clock enabled by 'data_present'
+ -- Counter will be reset when 'reset' is active
+ -- Counter will increment when 'valid_write' is active
+
+ count_width_loop: for i in 0 to 3 generate
+ --
+ attribute INIT : string;
+ attribute INIT of count_lut : label is "6606";
+ --
+ begin
+
+ register_bit: FDRE
+ port map ( D => next_count(i),
+ Q => pointer(i),
+ CE => data_present_int,
+ R => reset,
+ C => clk);
+
+ count_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"6606")
+ --synthesis translate_on
+ port map( I0 => pointer(i),
+ I1 => read,
+ I2 => pointer_zero,
+ I3 => write,
+ O => half_count(i));
+
+ lsb_count: if i=0 generate
+ begin
+
+ count_muxcy: MUXCY
+ port map( DI => pointer(i),
+ CI => valid_write,
+ S => half_count(i),
+ O => count_carry(i));
+
+ count_xor: XORCY
+ port map( LI => half_count(i),
+ CI => valid_write,
+ O => next_count(i));
+
+ end generate lsb_count;
+
+ mid_count: if i>0 and i<3 generate
+ begin
+
+ count_muxcy: MUXCY
+ port map( DI => pointer(i),
+ CI => count_carry(i-1),
+ S => half_count(i),
+ O => count_carry(i));
+
+ count_xor: XORCY
+ port map( LI => half_count(i),
+ CI => count_carry(i-1),
+ O => next_count(i));
+
+ end generate mid_count;
+
+ upper_count: if i=3 generate
+ begin
+
+ count_xor: XORCY
+ port map( LI => half_count(i),
+ CI => count_carry(i-1),
+ O => next_count(i));
+
+ end generate upper_count;
+
+ end generate count_width_loop;
+
+
+ -- Detect when pointer is zero and maximum
+
+ zero_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"0001")
+ --synthesis translate_on
+ port map( I0 => pointer(0),
+ I1 => pointer(1),
+ I2 => pointer(2),
+ I3 => pointer(3),
+ O => pointer_zero );
+
+
+ full_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"8000")
+ --synthesis translate_on
+ port map( I0 => pointer(0),
+ I1 => pointer(1),
+ I2 => pointer(2),
+ I3 => pointer(3),
+ O => pointer_full );
+
+
+ -- Data Present status
+
+ dp_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"BFA0")
+ --synthesis translate_on
+ port map( I0 => write,
+ I1 => read,
+ I2 => pointer_zero,
+ I3 => data_present_int,
+ O => decode_data_present );
+
+ dp_flop: FDR
+ port map ( D => decode_data_present,
+ Q => data_present_int,
+ R => reset,
+ C => clk);
+
+ -- Valid write signal
+
+ valid_lut: LUT3
+ --synthesis translate_off
+ generic map (INIT => X"C4")
+ --synthesis translate_on
+ port map( I0 => pointer_full,
+ I1 => write,
+ I2 => read,
+ O => valid_write );
+
+
+ -- assign internal signals to outputs
+
+ full <= pointer_full;
+ half_full <= pointer(3);
+ data_present <= data_present_int;
+
+end low_level_definition;
+
+------------------------------------------------------------------------------------
+--
+-- END OF FILE BBFIFO_16x8.VHD
+--
+------------------------------------------------------------------------------------
+
+
diff --git a/lib/uart/kcuart_rx.vhd b/lib/uart/kcuart_rx.vhd
new file mode 100644
index 0000000..a7ac1a2
--- /dev/null
+++ b/lib/uart/kcuart_rx.vhd
@@ -0,0 +1,352 @@
+-- Constant (K) Compact UART Receiver
+--
+-- Version : 1.10
+-- Version Date : 3rd December 2003
+-- Reason : '--translate' directives changed to '--synthesis translate' directives
+--
+-- Version : 1.00
+-- Version Date : 16th October 2002
+--
+-- Start of design entry : 16th October 2002
+--
+-- Ken Chapman
+-- Xilinx Ltd
+-- Benchmark House
+-- 203 Brooklands Road
+-- Weybridge
+-- Surrey KT13 ORH
+-- United Kingdom
+--
+-- chapman@xilinx.com
+--
+------------------------------------------------------------------------------------
+--
+-- NOTICE:
+--
+-- Copyright Xilinx, Inc. 2002. This code may be contain portions patented by other
+-- third parties. By providing this core as one possible implementation of a standard,
+-- Xilinx is making no representation that the provided implementation of this standard
+-- is free from any claims of infringement by any third party. Xilinx expressly
+-- disclaims any warranty with respect to the adequacy of the implementation, including
+-- but not limited to any warranty or representation that the implementation is free
+-- from claims of any third party. Futhermore, Xilinx is providing this core as a
+-- courtesy to you and suggests that you contact all third parties to obtain the
+-- necessary rights to use this implementation.
+--
+------------------------------------------------------------------------------------
+--
+-- Library declarations
+--
+-- The Unisim Library is used to define Xilinx primitives. It is also used during
+-- simulation. The source can be viewed at %XILINX%\vhdl\src\unisims\unisim_VCOMP.vhd
+--
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+library unisim;
+use unisim.vcomponents.all;
+--
+------------------------------------------------------------------------------------
+--
+-- Main Entity for KCUART_RX
+--
+entity kcuart_rx is
+ Port ( serial_in : in std_logic;
+ data_out : out std_logic_vector(7 downto 0);
+ data_strobe : out std_logic;
+ en_16_x_baud : in std_logic;
+ clk : in std_logic);
+ end kcuart_rx;
+--
+------------------------------------------------------------------------------------
+--
+-- Start of Main Architecture for KCUART_RX
+--
+architecture low_level_definition of kcuart_rx is
+--
+------------------------------------------------------------------------------------
+--
+------------------------------------------------------------------------------------
+--
+-- Signals used in KCUART_RX
+--
+------------------------------------------------------------------------------------
+--
+signal sync_serial : std_logic;
+signal stop_bit : std_logic;
+signal data_int : std_logic_vector(7 downto 0);
+signal data_delay : std_logic_vector(7 downto 0);
+signal start_delay : std_logic;
+signal start_bit : std_logic;
+signal edge_delay : std_logic;
+signal start_edge : std_logic;
+signal decode_valid_char : std_logic;
+signal valid_char : std_logic;
+signal decode_purge : std_logic;
+signal purge : std_logic;
+signal valid_srl_delay : std_logic_vector(8 downto 0);
+signal valid_reg_delay : std_logic_vector(8 downto 0);
+signal decode_data_strobe : std_logic;
+--
+--
+------------------------------------------------------------------------------------
+--
+-- Attributes to define LUT contents during implementation
+-- The information is repeated in the generic map for functional simulation--
+--
+------------------------------------------------------------------------------------
+--
+attribute INIT : string;
+attribute INIT of start_srl : label is "0000";
+attribute INIT of edge_srl : label is "0000";
+attribute INIT of valid_lut : label is "0040";
+attribute INIT of purge_lut : label is "54";
+attribute INIT of strobe_lut : label is "8";
+--
+------------------------------------------------------------------------------------
+--
+-- Start of KCUART_RX circuit description
+--
+------------------------------------------------------------------------------------
+--
+begin
+
+ -- Synchronise input serial data to system clock
+
+ sync_reg: FD
+ port map ( D => serial_in,
+ Q => sync_serial,
+ C => clk);
+
+ stop_reg: FD
+ port map ( D => sync_serial,
+ Q => stop_bit,
+ C => clk);
+
+
+ -- Data delays to capture data at 16 time baud rate
+ -- Each SRL16E is followed by a flip-flop for best timing
+
+ data_loop: for i in 0 to 7 generate
+ begin
+
+ lsbs: if i<7 generate
+ --
+ attribute INIT : string;
+ attribute INIT of delay15_srl : label is "0000";
+ --
+ begin
+
+ delay15_srl: SRL16E
+ --synthesis translate_off
+ generic map (INIT => X"0000")
+ --synthesis translate_on
+ port map( D => data_int(i+1),
+ CE => en_16_x_baud,
+ CLK => clk,
+ A0 => '0',
+ A1 => '1',
+ A2 => '1',
+ A3 => '1',
+ Q => data_delay(i) );
+
+ end generate lsbs;
+
+ msb: if i=7 generate
+ --
+ attribute INIT : string;
+ attribute INIT of delay15_srl : label is "0000";
+ --
+ begin
+
+ delay15_srl: SRL16E
+ --synthesis translate_off
+ generic map (INIT => X"0000")
+ --synthesis translate_on
+ port map( D => stop_bit,
+ CE => en_16_x_baud,
+ CLK => clk,
+ A0 => '0',
+ A1 => '1',
+ A2 => '1',
+ A3 => '1',
+ Q => data_delay(i) );
+
+ end generate msb;
+
+ data_reg: FDE
+ port map ( D => data_delay(i),
+ Q => data_int(i),
+ CE => en_16_x_baud,
+ C => clk);
+
+ end generate data_loop;
+
+ -- Assign internal signals to outputs
+
+ data_out <= data_int;
+
+ -- Data delays to capture start bit at 16 time baud rate
+
+ start_srl: SRL16E
+ --synthesis translate_off
+ generic map (INIT => X"0000")
+ --synthesis translate_on
+ port map( D => data_int(0),
+ CE => en_16_x_baud,
+ CLK => clk,
+ A0 => '0',
+ A1 => '1',
+ A2 => '1',
+ A3 => '1',
+ Q => start_delay );
+
+ start_reg: FDE
+ port map ( D => start_delay,
+ Q => start_bit,
+ CE => en_16_x_baud,
+ C => clk);
+
+
+ -- Data delays to capture start bit leading edge at 16 time baud rate
+ -- Delay ensures data is captured at mid-bit position
+
+ edge_srl: SRL16E
+ --synthesis translate_off
+ generic map (INIT => X"0000")
+ --synthesis translate_on
+ port map( D => start_bit,
+ CE => en_16_x_baud,
+ CLK => clk,
+ A0 => '1',
+ A1 => '0',
+ A2 => '1',
+ A3 => '0',
+ Q => edge_delay );
+
+ edge_reg: FDE
+ port map ( D => edge_delay,
+ Q => start_edge,
+ CE => en_16_x_baud,
+ C => clk);
+
+ -- Detect a valid character
+
+ valid_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"0040")
+ --synthesis translate_on
+ port map( I0 => purge,
+ I1 => stop_bit,
+ I2 => start_edge,
+ I3 => edge_delay,
+ O => decode_valid_char );
+
+ valid_reg: FDE
+ port map ( D => decode_valid_char,
+ Q => valid_char,
+ CE => en_16_x_baud,
+ C => clk);
+
+ -- Purge of data status
+
+ purge_lut: LUT3
+ --synthesis translate_off
+ generic map (INIT => X"54")
+ --synthesis translate_on
+ port map( I0 => valid_reg_delay(8),
+ I1 => valid_char,
+ I2 => purge,
+ O => decode_purge );
+
+ purge_reg: FDE
+ port map ( D => decode_purge,
+ Q => purge,
+ CE => en_16_x_baud,
+ C => clk);
+
+ -- Delay of valid_char pulse of length equivalent to the time taken
+ -- to purge data shift register of all data which has been used.
+ -- Requires 9x16 + 8 delays which is achieved by packing of SRL16E with
+ -- up to 16 delays and utilising the dedicated flip flop in each stage.
+
+ valid_loop: for i in 0 to 8 generate
+ begin
+
+ lsb: if i=0 generate
+ --
+ attribute INIT : string;
+ attribute INIT of delay15_srl : label is "0000";
+ --
+ begin
+
+ delay15_srl: SRL16E
+ --synthesis translate_off
+ generic map (INIT => X"0000")
+ --synthesis translate_on
+ port map( D => valid_char,
+ CE => en_16_x_baud,
+ CLK => clk,
+ A0 => '0',
+ A1 => '1',
+ A2 => '1',
+ A3 => '1',
+ Q => valid_srl_delay(i) );
+
+ end generate lsb;
+
+ msbs: if i>0 generate
+ --
+ attribute INIT : string;
+ attribute INIT of delay16_srl : label is "0000";
+ --
+ begin
+
+ delay16_srl: SRL16E
+ --synthesis translate_off
+ generic map (INIT => X"0000")
+ --synthesis translate_on
+ port map( D => valid_reg_delay(i-1),
+ CE => en_16_x_baud,
+ CLK => clk,
+ A0 => '1',
+ A1 => '1',
+ A2 => '1',
+ A3 => '1',
+ Q => valid_srl_delay(i) );
+
+ end generate msbs;
+
+ data_reg: FDE
+ port map ( D => valid_srl_delay(i),
+ Q => valid_reg_delay(i),
+ CE => en_16_x_baud,
+ C => clk);
+
+ end generate valid_loop;
+
+ -- Form data strobe
+
+ strobe_lut: LUT2
+ --synthesis translate_off
+ generic map (INIT => X"8")
+ --synthesis translate_on
+ port map( I0 => valid_char,
+ I1 => en_16_x_baud,
+ O => decode_data_strobe );
+
+ strobe_reg: FD
+ port map ( D => decode_data_strobe,
+ Q => data_strobe,
+ C => clk);
+
+end low_level_definition;
+
+------------------------------------------------------------------------------------
+--
+-- END OF FILE KCUART_RX.VHD
+--
+------------------------------------------------------------------------------------
+
+
diff --git a/lib/uart/kcuart_tx.vhd b/lib/uart/kcuart_tx.vhd
new file mode 100644
index 0000000..556ac58
--- /dev/null
+++ b/lib/uart/kcuart_tx.vhd
@@ -0,0 +1,394 @@
+-- Constant (K) Compact UART Transmitter
+--
+-- Version : 1.10
+-- Version Date : 3rd December 2003
+-- Reason : '--translate' directives changed to '--synthesis translate' directives
+--
+-- Version : 1.00
+-- Version Date : 14th October 2002
+--
+-- Start of design entry : 2nd October 2002
+--
+-- Ken Chapman
+-- Xilinx Ltd
+-- Benchmark House
+-- 203 Brooklands Road
+-- Weybridge
+-- Surrey KT13 ORH
+-- United Kingdom
+--
+-- chapman@xilinx.com
+--
+------------------------------------------------------------------------------------
+--
+-- NOTICE:
+--
+-- Copyright Xilinx, Inc. 2002. This code may be contain portions patented by other
+-- third parties. By providing this core as one possible implementation of a standard,
+-- Xilinx is making no representation that the provided implementation of this standard
+-- is free from any claims of infringement by any third party. Xilinx expressly
+-- disclaims any warranty with respect to the adequacy of the implementation, including
+-- but not limited to any warranty or representation that the implementation is free
+-- from claims of any third party. Futhermore, Xilinx is providing this core as a
+-- courtesy to you and suggests that you contact all third parties to obtain the
+-- necessary rights to use this implementation.
+--
+------------------------------------------------------------------------------------
+--
+-- Library declarations
+--
+-- The Unisim Library is used to define Xilinx primitives. It is also used during
+-- simulation. The source can be viewed at %XILINX%\vhdl\src\unisims\unisim_VCOMP.vhd
+--
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+library unisim;
+use unisim.vcomponents.all;
+--
+------------------------------------------------------------------------------------
+--
+-- Main Entity for KCUART_TX
+--
+entity kcuart_tx is
+ Port ( data_in : in std_logic_vector(7 downto 0);
+ send_character : in std_logic;
+ en_16_x_baud : in std_logic;
+ serial_out : out std_logic;
+ Tx_complete : out std_logic;
+ clk : in std_logic);
+ end kcuart_tx;
+--
+------------------------------------------------------------------------------------
+--
+-- Start of Main Architecture for KCUART_TX
+--
+architecture low_level_definition of kcuart_tx is
+--
+------------------------------------------------------------------------------------
+--
+------------------------------------------------------------------------------------
+--
+-- Signals used in KCUART_TX
+--
+------------------------------------------------------------------------------------
+--
+signal data_01 : std_logic;
+signal data_23 : std_logic;
+signal data_45 : std_logic;
+signal data_67 : std_logic;
+signal data_0123 : std_logic;
+signal data_4567 : std_logic;
+signal data_01234567 : std_logic;
+signal bit_select : std_logic_vector(2 downto 0);
+signal next_count : std_logic_vector(2 downto 0);
+signal mask_count : std_logic_vector(2 downto 0);
+signal mask_count_carry : std_logic_vector(2 downto 0);
+signal count_carry : std_logic_vector(2 downto 0);
+signal ready_to_start : std_logic;
+signal decode_Tx_start : std_logic;
+signal Tx_start : std_logic;
+signal decode_Tx_run : std_logic;
+signal Tx_run : std_logic;
+signal decode_hot_state : std_logic;
+signal hot_state : std_logic;
+signal hot_delay : std_logic;
+signal Tx_bit : std_logic;
+signal decode_Tx_stop : std_logic;
+signal Tx_stop : std_logic;
+signal decode_Tx_complete : std_logic;
+--
+--
+------------------------------------------------------------------------------------
+--
+-- Attributes to define LUT contents during implementation
+-- The information is repeated in the generic map for functional simulation--
+--
+------------------------------------------------------------------------------------
+--
+attribute INIT : string;
+attribute INIT of mux1_lut : label is "E4FF";
+attribute INIT of mux2_lut : label is "E4FF";
+attribute INIT of mux3_lut : label is "E4FF";
+attribute INIT of mux4_lut : label is "E4FF";
+attribute INIT of ready_lut : label is "10";
+attribute INIT of start_lut : label is "0190";
+attribute INIT of run_lut : label is "1540";
+attribute INIT of hot_state_lut : label is "94";
+attribute INIT of delay14_srl : label is "0000";
+attribute INIT of stop_lut : label is "0180";
+attribute INIT of complete_lut : label is "8";
+--
+------------------------------------------------------------------------------------
+--
+-- Start of KCUART_TX circuit description
+--
+------------------------------------------------------------------------------------
+--
+begin
+
+ -- 8 to 1 multiplexer to convert parallel data to serial
+
+ mux1_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"E4FF")
+ --synthesis translate_on
+ port map( I0 => bit_select(0),
+ I1 => data_in(0),
+ I2 => data_in(1),
+ I3 => Tx_run,
+ O => data_01 );
+
+ mux2_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"E4FF")
+ --synthesis translate_on
+ port map( I0 => bit_select(0),
+ I1 => data_in(2),
+ I2 => data_in(3),
+ I3 => Tx_run,
+ O => data_23 );
+
+ mux3_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"E4FF")
+ --synthesis translate_on
+ port map( I0 => bit_select(0),
+ I1 => data_in(4),
+ I2 => data_in(5),
+ I3 => Tx_run,
+ O => data_45 );
+
+ mux4_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"E4FF")
+ --synthesis translate_on
+ port map( I0 => bit_select(0),
+ I1 => data_in(6),
+ I2 => data_in(7),
+ I3 => Tx_run,
+ O => data_67 );
+
+ mux5_muxf5: MUXF5
+ port map( I1 => data_23,
+ I0 => data_01,
+ S => bit_select(1),
+ O => data_0123 );
+
+ mux6_muxf5: MUXF5
+ port map( I1 => data_67,
+ I0 => data_45,
+ S => bit_select(1),
+ O => data_4567 );
+
+ mux7_muxf6: MUXF6
+ port map( I1 => data_4567,
+ I0 => data_0123,
+ S => bit_select(2),
+ O => data_01234567 );
+
+ -- Register serial output and force start and stop bits
+
+ pipeline_serial: FDRS
+ port map ( D => data_01234567,
+ Q => serial_out,
+ R => Tx_start,
+ S => Tx_stop,
+ C => clk);
+
+ -- 3-bit counter
+ -- Counter is clock enabled by en_16_x_baud
+ -- Counter will be reset when 'Tx_start' is active
+ -- Counter will increment when Tx_bit is active
+ -- Tx_run must be active to count
+ -- count_carry(2) indicates when terminal count (7) is reached and Tx_bit=1 (ie overflow)
+
+ count_width_loop: for i in 0 to 2 generate
+ --
+ attribute INIT : string;
+ attribute INIT of count_lut : label is "8";
+ --
+ begin
+
+ register_bit: FDRE
+ port map ( D => next_count(i),
+ Q => bit_select(i),
+ CE => en_16_x_baud,
+ R => Tx_start,
+ C => clk);
+
+ count_lut: LUT2
+ --synthesis translate_off
+ generic map (INIT => X"8")
+ --synthesis translate_on
+ port map( I0 => bit_select(i),
+ I1 => Tx_run,
+ O => mask_count(i));
+
+ mask_and: MULT_AND
+ port map( I0 => bit_select(i),
+ I1 => Tx_run,
+ LO => mask_count_carry(i));
+
+ lsb_count: if i=0 generate
+ begin
+
+ count_muxcy: MUXCY
+ port map( DI => mask_count_carry(i),
+ CI => Tx_bit,
+ S => mask_count(i),
+ O => count_carry(i));
+
+ count_xor: XORCY
+ port map( LI => mask_count(i),
+ CI => Tx_bit,
+ O => next_count(i));
+
+ end generate lsb_count;
+
+ upper_count: if i>0 generate
+ begin
+
+ count_muxcy: MUXCY
+ port map( DI => mask_count_carry(i),
+ CI => count_carry(i-1),
+ S => mask_count(i),
+ O => count_carry(i));
+
+ count_xor: XORCY
+ port map( LI => mask_count(i),
+ CI => count_carry(i-1),
+ O => next_count(i));
+
+ end generate upper_count;
+
+ end generate count_width_loop;
+
+ -- Ready to start decode
+
+ ready_lut: LUT3
+ --synthesis translate_off
+ generic map (INIT => X"10")
+ --synthesis translate_on
+ port map( I0 => Tx_run,
+ I1 => Tx_start,
+ I2 => send_character,
+ O => ready_to_start );
+
+ -- Start bit enable
+
+ start_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"0190")
+ --synthesis translate_on
+ port map( I0 => Tx_bit,
+ I1 => Tx_stop,
+ I2 => ready_to_start,
+ I3 => Tx_start,
+ O => decode_Tx_start );
+
+ Tx_start_reg: FDE
+ port map ( D => decode_Tx_start,
+ Q => Tx_start,
+ CE => en_16_x_baud,
+ C => clk);
+
+
+ -- Run bit enable
+
+ run_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"1540")
+ --synthesis translate_on
+ port map( I0 => count_carry(2),
+ I1 => Tx_bit,
+ I2 => Tx_start,
+ I3 => Tx_run,
+ O => decode_Tx_run );
+
+ Tx_run_reg: FDE
+ port map ( D => decode_Tx_run,
+ Q => Tx_run,
+ CE => en_16_x_baud,
+ C => clk);
+
+ -- Bit rate enable
+
+ hot_state_lut: LUT3
+ --synthesis translate_off
+ generic map (INIT => X"94")
+ --synthesis translate_on
+ port map( I0 => Tx_stop,
+ I1 => ready_to_start,
+ I2 => Tx_bit,
+ O => decode_hot_state );
+
+ hot_state_reg: FDE
+ port map ( D => decode_hot_state,
+ Q => hot_state,
+ CE => en_16_x_baud,
+ C => clk);
+
+ delay14_srl: SRL16E
+ --synthesis translate_off
+ generic map (INIT => X"0000")
+ --synthesis translate_on
+ port map( D => hot_state,
+ CE => en_16_x_baud,
+ CLK => clk,
+ A0 => '1',
+ A1 => '0',
+ A2 => '1',
+ A3 => '1',
+ Q => hot_delay );
+
+ Tx_bit_reg: FDE
+ port map ( D => hot_delay,
+ Q => Tx_bit,
+ CE => en_16_x_baud,
+ C => clk);
+
+ -- Stop bit enable
+
+ stop_lut: LUT4
+ --synthesis translate_off
+ generic map (INIT => X"0180")
+ --synthesis translate_on
+ port map( I0 => Tx_bit,
+ I1 => Tx_run,
+ I2 => count_carry(2),
+ I3 => Tx_stop,
+ O => decode_Tx_stop );
+
+ Tx_stop_reg: FDE
+ port map ( D => decode_Tx_stop,
+ Q => Tx_stop,
+ CE => en_16_x_baud,
+ C => clk);
+
+ -- Tx_complete strobe
+
+ complete_lut: LUT2
+ --synthesis translate_off
+ generic map (INIT => X"8")
+ --synthesis translate_on
+ port map( I0 => count_carry(2),
+ I1 => en_16_x_baud,
+ O => decode_Tx_complete );
+
+ Tx_complete_reg: FD
+ port map ( D => decode_Tx_complete,
+ Q => Tx_complete,
+ C => clk);
+
+
+end low_level_definition;
+
+------------------------------------------------------------------------------------
+--
+-- END OF FILE KCUART_TX.VHD
+--
+------------------------------------------------------------------------------------
+
+
diff --git a/lib/uart/uart_rx.vhd b/lib/uart/uart_rx.vhd
new file mode 100644
index 0000000..69eb70e
--- /dev/null
+++ b/lib/uart/uart_rx.vhd
@@ -0,0 +1,146 @@
+-- UART Receiver with integral 16 byte FIFO buffer
+--
+-- 8 bit, no parity, 1 stop bit
+--
+-- Version : 1.00
+-- Version Date : 16th October 2002
+--
+-- Start of design entry : 16th October 2002
+--
+-- Ken Chapman
+-- Xilinx Ltd
+-- Benchmark House
+-- 203 Brooklands Road
+-- Weybridge
+-- Surrey KT13 ORH
+-- United Kingdom
+--
+-- chapman@xilinx.com
+--
+------------------------------------------------------------------------------------
+--
+-- NOTICE:
+--
+-- Copyright Xilinx, Inc. 2002. This code may be contain portions patented by other
+-- third parties. By providing this core as one possible implementation of a standard,
+-- Xilinx is making no representation that the provided implementation of this standard
+-- is free from any claims of infringement by any third party. Xilinx expressly
+-- disclaims any warranty with respect to the adequacy of the implementation, including
+-- but not limited to any warranty or representation that the implementation is free
+-- from claims of any third party. Futhermore, Xilinx is providing this core as a
+-- courtesy to you and suggests that you contact all third parties to obtain the
+-- necessary rights to use this implementation.
+--
+------------------------------------------------------------------------------------
+--
+-- Library declarations
+--
+-- The Unisim Library is used to define Xilinx primitives. It is also used during
+-- simulation. The source can be viewed at %XILINX%\vhdl\src\unisims\unisim_VCOMP.vhd
+--
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+library unisim;
+use unisim.vcomponents.all;
+--
+------------------------------------------------------------------------------------
+--
+-- Main Entity for UART_RX
+--
+entity uart_rx is
+ Port ( serial_in : in std_logic;
+ data_out : out std_logic_vector(7 downto 0);
+ read_buffer : in std_logic;
+ reset_buffer : in std_logic;
+ en_16_x_baud : in std_logic;
+ buffer_data_present : out std_logic;
+ buffer_full : out std_logic;
+ buffer_half_full : out std_logic;
+ clk : in std_logic);
+ end uart_rx;
+--
+------------------------------------------------------------------------------------
+--
+-- Start of Main Architecture for UART_RX
+--
+architecture macro_level_definition of uart_rx is
+--
+------------------------------------------------------------------------------------
+--
+-- Components used in UART_RX and defined in subsequent entities.
+--
+------------------------------------------------------------------------------------
+--
+-- Constant (K) Compact UART Receiver
+--
+component kcuart_rx
+ Port ( serial_in : in std_logic;
+ data_out : out std_logic_vector(7 downto 0);
+ data_strobe : out std_logic;
+ en_16_x_baud : in std_logic;
+ clk : in std_logic);
+ end component;
+--
+-- 'Bucket Brigade' FIFO
+--
+component bbfifo_16x8
+ Port ( data_in : in std_logic_vector(7 downto 0);
+ data_out : out std_logic_vector(7 downto 0);
+ reset : in std_logic;
+ write : in std_logic;
+ read : in std_logic;
+ full : out std_logic;
+ half_full : out std_logic;
+ data_present : out std_logic;
+ clk : in std_logic);
+ end component;
+--
+------------------------------------------------------------------------------------
+--
+-- Signals used in UART_RX
+--
+------------------------------------------------------------------------------------
+--
+signal uart_data_out : std_logic_vector(7 downto 0);
+signal fifo_write : std_logic;
+--
+------------------------------------------------------------------------------------
+--
+-- Start of UART_RX circuit description
+--
+------------------------------------------------------------------------------------
+--
+begin
+
+ -- 8 to 1 multiplexer to convert parallel data to serial
+
+ kcuart: kcuart_rx
+ port map ( serial_in => serial_in,
+ data_out => uart_data_out,
+ data_strobe => fifo_write,
+ en_16_x_baud => en_16_x_baud,
+ clk => clk );
+
+
+ buf: bbfifo_16x8
+ port map ( data_in => uart_data_out,
+ data_out => data_out,
+ reset => reset_buffer,
+ write => fifo_write,
+ read => read_buffer,
+ full => buffer_full,
+ half_full => buffer_half_full,
+ data_present => buffer_data_present,
+ clk => clk);
+
+end macro_level_definition;
+
+------------------------------------------------------------------------------------
+--
+-- END OF FILE UART_RX.VHD
+--
+------------------------------------------------------------------------------------
+
+
diff --git a/lib/uart/uart_tx.vhd b/lib/uart/uart_tx.vhd
new file mode 100644
index 0000000..8c4e63d
--- /dev/null
+++ b/lib/uart/uart_tx.vhd
@@ -0,0 +1,148 @@
+-- UART Transmitter with integral 16 byte FIFO buffer
+--
+-- 8 bit, no parity, 1 stop bit
+--
+-- Version : 1.00
+-- Version Date : 14th October 2002
+--
+-- Start of design entry : 14th October 2002
+--
+-- Ken Chapman
+-- Xilinx Ltd
+-- Benchmark House
+-- 203 Brooklands Road
+-- Weybridge
+-- Surrey KT13 ORH
+-- United Kingdom
+--
+-- chapman@xilinx.com
+--
+------------------------------------------------------------------------------------
+--
+-- NOTICE:
+--
+-- Copyright Xilinx, Inc. 2002. This code may be contain portions patented by other
+-- third parties. By providing this core as one possible implementation of a standard,
+-- Xilinx is making no representation that the provided implementation of this standard
+-- is free from any claims of infringement by any third party. Xilinx expressly
+-- disclaims any warranty with respect to the adequacy of the implementation, including
+-- but not limited to any warranty or representation that the implementation is free
+-- from claims of any third party. Futhermore, Xilinx is providing this core as a
+-- courtesy to you and suggests that you contact all third parties to obtain the
+-- necessary rights to use this implementation.
+--
+------------------------------------------------------------------------------------
+--
+-- Library declarations
+--
+-- The Unisim Library is used to define Xilinx primitives. It is also used during
+-- simulation. The source can be viewed at %XILINX%\vhdl\src\unisims\unisim_VCOMP.vhd
+--
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+library unisim;
+use unisim.vcomponents.all;
+--
+------------------------------------------------------------------------------------
+--
+-- Main Entity for UART_TX
+--
+entity uart_tx is
+ Port ( data_in : in std_logic_vector(7 downto 0);
+ write_buffer : in std_logic;
+ reset_buffer : in std_logic;
+ en_16_x_baud : in std_logic;
+ serial_out : out std_logic;
+ buffer_full : out std_logic;
+ buffer_half_full : out std_logic;
+ clk : in std_logic);
+ end uart_tx;
+--
+------------------------------------------------------------------------------------
+--
+-- Start of Main Architecture for UART_TX
+--
+architecture macro_level_definition of uart_tx is
+--
+------------------------------------------------------------------------------------
+--
+-- Components used in UART_TX and defined in subsequent entities.
+--
+------------------------------------------------------------------------------------
+--
+-- Constant (K) Compact UART Transmitter
+--
+component kcuart_tx
+ Port ( data_in : in std_logic_vector(7 downto 0);
+ send_character : in std_logic;
+ en_16_x_baud : in std_logic;
+ serial_out : out std_logic;
+ Tx_complete : out std_logic;
+ clk : in std_logic);
+ end component;
+--
+-- 'Bucket Brigade' FIFO
+--
+component bbfifo_16x8
+ Port ( data_in : in std_logic_vector(7 downto 0);
+ data_out : out std_logic_vector(7 downto 0);
+ reset : in std_logic;
+ write : in std_logic;
+ read : in std_logic;
+ full : out std_logic;
+ half_full : out std_logic;
+ data_present : out std_logic;
+ clk : in std_logic);
+ end component;
+--
+------------------------------------------------------------------------------------
+--
+-- Signals used in UART_TX
+--
+------------------------------------------------------------------------------------
+--
+signal fifo_data_out : std_logic_vector(7 downto 0);
+signal fifo_data_present : std_logic;
+signal fifo_read : std_logic;
+--
+------------------------------------------------------------------------------------
+--
+-- Start of UART_TX circuit description
+--
+------------------------------------------------------------------------------------
+--
+begin
+
+ -- 8 to 1 multiplexer to convert parallel data to serial
+
+ kcuart: kcuart_tx
+ port map ( data_in => fifo_data_out,
+ send_character => fifo_data_present,
+ en_16_x_baud => en_16_x_baud,
+ serial_out => serial_out,
+ Tx_complete => fifo_read,
+ clk => clk);
+
+
+ buf: bbfifo_16x8
+ port map ( data_in => data_in,
+ data_out => fifo_data_out,
+ reset => reset_buffer,
+ write => write_buffer,
+ read => fifo_read,
+ full => buffer_full,
+ half_full => buffer_half_full,
+ data_present => fifo_data_present,
+ clk => clk);
+
+end macro_level_definition;
+
+------------------------------------------------------------------------------------
+--
+-- END OF FILE UART_TX.VHD
+--
+------------------------------------------------------------------------------------
+
+