From cc11535bc07bc2b09fb2f895bf71c5187cd6a9e2 Mon Sep 17 00:00:00 2001 From: Mathias Kreider <mkreider@gsi.de> Date: Tue, 17 Nov 2015 11:19:42 +0100 Subject: [PATCH] Added package for bit matrix manipulation --- modules/common/Manifest.py | 3 +- modules/common/matrix_pkg.vhd | 144 ++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 modules/common/matrix_pkg.vhd diff --git a/modules/common/Manifest.py b/modules/common/Manifest.py index 4aee1c64..f5eb8d39 100644 --- a/modules/common/Manifest.py +++ b/modules/common/Manifest.py @@ -1,4 +1,5 @@ -files = [ "gencores_pkg.vhd", +files = [ "matrix_pkg.vhd", + "gencores_pkg.vhd", "gc_crc_gen.vhd", "gc_moving_average.vhd", "gc_extend_pulse.vhd", diff --git a/modules/common/matrix_pkg.vhd b/modules/common/matrix_pkg.vhd new file mode 100644 index 00000000..f5686cec --- /dev/null +++ b/modules/common/matrix_pkg.vhd @@ -0,0 +1,144 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +package matrix_pkg is + + type matrix is array(natural range <>, natural range <>) of std_logic; + + -- assign row + + function mrst(slm : matrix) return matrix; + + -- assign row + + ---function mset(slm : matrix; slv : std_logic_vector; rowindex : natural) return matrix; + + procedure mset(signal slm : out matrix; slv : std_logic_vector; rowindex : natural); + + procedure mset_no_rng(signal slm : out matrix; slv : std_logic_vector; rowindex : natural); + + -- get std logic vector from matrix row + + function mget(slm : matrix; rowindex : natural) return std_logic_vector; + + -- flatten matrix to std logic vector + + function mflat(slm : matrix) return std_logic_vector; + + -- inflate std logic vector to matrix + function minfl(slm : matrix; slv : std_logic_vector ) return matrix; + + -- inflate std logic vector to m x n matrix + + function minflmn(slv : std_logic_vector; col_len : natural; row_len : natural) return matrix; + + end matrix_pkg; + + package body matrix_pkg is + + + + function mrst(slm : matrix) return matrix is + variable res : matrix(slm'length(1)-1 downto 0, slm'length(2)-1 downto 0); + variable row, col : natural := 0; + constant row_len : natural := slm'length(2); + constant col_len : natural := slm'length(1); + begin + for row in 0 to col_len-1 loop + for col in 0 to row_len-1 loop + res(row, col) := '0'; + end loop; + end loop; + return res; + end function; + + + procedure mset(signal slm : out matrix; slv : std_logic_vector; rowindex : natural) is + variable i : natural := 0; + begin + for i in slv'range loop + slm(rowindex, i) <= slv(i); + end loop; + end procedure; + + procedure mset_no_rng(signal slm : out matrix; slv : std_logic_vector; rowindex : natural) is + variable i : natural := 0; + variable j : natural := 0; + begin + j := 0; + for i in slv'range loop + slm(rowindex, j) <= slv(i); + j := j+1; + end loop; + end procedure; + + + -- set matrix row +-- function mset(slm : matrix; slv : std_logic_vector; rowindex : natural) return matrix is + -- variable i : natural := 0; + -- variable res : matrix(slm'length(1)-1 downto 0, slm'length(2)-1 downto 0); +-- begin + -- res := slm; + -- for i in slv'range loop + -- res(rowindex, i) := slv(i); + -- end loop; + -- return res; +-- end function; + + + -- get matrix row + function mget(slm : matrix; rowindex : natural) return std_logic_vector is + variable i : natural := 0; + variable slv : std_logic_vector(slm'high(2) downto 0); + begin + for i in slv'range loop + slv(i) := slm(rowindex, i); + end loop; + return slv; + end function; + + + -- flatten matrix to std logic vector + function mflat(slm : matrix) return std_logic_vector is + constant row_len : natural := slm'length(2); + constant col_len : natural := slm'length(1); + variable res : std_logic_vector(col_len*row_len-1 downto 0); + begin + for row in 0 to col_len-1 loop + for col in 0 to row_len-1 loop + res(row*row_len+col) := slm(row, col); + end loop; + end loop; + return res; + end function; + + + -- inflate std logic vector to matrix + function minfl(slm : matrix; slv : std_logic_vector) return matrix is + constant row_len : natural := slm'length(2); + constant col_len : natural := slm'length(1); + variable res : matrix(slm'length(1)-1 downto 0, slm'length(2)-1 downto 0); + begin + for row in 0 to col_len-1 loop + for col in 0 to row_len-1 loop + res(row, col) := slv(row*row_len+col); + end loop; + end loop; + return res; + end function; + + + -- -- inflate std logic vector to m*n matrix + function minflmn(slv : std_logic_vector; col_len : natural; row_len : natural) return matrix is + variable res : matrix(col_len-1 downto 0, row_len-1 downto 0); + begin + for row in 0 to col_len-1 loop + for col in 0 to row_len-1 loop + res(row, col) := slv(slv'length-1 - (row*row_len+col)); + end loop; + end loop; + return res; + end function; + + end matrix_pkg; -- GitLab