use work.common.all;
package crhelpers is
- function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer;
- function num_to_fxm(num: integer) return std_ulogic_vector;
- --function from_crfile(cr: crfile) return std_ulogic_vector;
- --function extract_one_crfield(cr: crfile; fxm: std_ulogic_vector(7 downto 0)) return std_ulogic_vector;
- --function insert_multiple_crfields(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile;
- --function insert_one_crfield(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile;
+ function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer;
+ function num_to_fxm(num: integer) return std_ulogic_vector;
end package crhelpers;
package body crhelpers is
- function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer is
- begin
- -- If multiple fields are set (undefined), match existing
- -- hardware by returning the first one.
- for i in 0 to 7 loop
- -- Big endian bit numbering
- if fxm(7-i) = '1' then
- return i;
- end if;
- end loop;
+ function fxm_to_num(fxm: std_ulogic_vector(7 downto 0)) return integer is
+ begin
+ -- If multiple fields are set (undefined), match existing
+ -- hardware by returning the first one.
+ for i in 0 to 7 loop
+ -- Big endian bit numbering
+ if fxm(7-i) = '1' then
+ return i;
+ end if;
+ end loop;
- -- If no fields are set (undefined), also match existing
- -- hardware by returning cr7.
- return 7;
- end;
+ -- If no fields are set (undefined), also match existing
+ -- hardware by returning cr7.
+ return 7;
+ end;
- function num_to_fxm(num: integer) return std_ulogic_vector is
- begin
- case num is
- when 0 =>
- return "10000000";
- when 1 =>
- return "01000000";
- when 2 =>
- return "00100000";
- when 3 =>
- return "00010000";
- when 4 =>
- return "00001000";
- when 5 =>
- return "00000100";
- when 6 =>
- return "00000010";
- when 7 =>
- return "00000001";
- when others =>
- return "00000000";
- end case;
- end;
+ function num_to_fxm(num: integer) return std_ulogic_vector is
+ begin
+ case num is
+ when 0 =>
+ return "10000000";
+ when 1 =>
+ return "01000000";
+ when 2 =>
+ return "00100000";
+ when 3 =>
+ return "00010000";
+ when 4 =>
+ return "00001000";
+ when 5 =>
+ return "00000100";
+ when 6 =>
+ return "00000010";
+ when 7 =>
+ return "00000001";
+ when others =>
+ return "00000000";
+ end case;
+ end;
--- function from_crfile(cr: crfile) return std_ulogic_vector is
--- variable combined_cr : std_ulogic_vector(31 downto 0) := (others => '0');
--- variable high, low: integer range 0 to 31 := 0;
--- begin
--- for i in 0 to cr'length-1 loop
--- low := 4*(7-i);
--- high := low+3;
--- combined_cr(high downto low) := cr(i);
--- end loop;
---
--- return combined_cr;
--- end function;
---
--- function extract_one_crfield(cr: crfile; fxm: std_ulogic_vector(7 downto 0)) return std_ulogic_vector is
--- variable combined_cr : std_ulogic_vector(63 downto 0) := (others => '0');
--- variable crnum: integer range 0 to 7 := 0;
--- begin
--- crnum := fxm_to_num(fxm);
---
--- -- Vivado doesn't support non constant vector slice
--- -- low := 4*(7-crnum);
--- -- high := low+3;
--- -- combined_cr(high downto low) := cr(crnum);
--- case_0: case crnum is
--- when 0 =>
--- combined_cr(31 downto 28) := cr(0);
--- when 1 =>
--- combined_cr(27 downto 24) := cr(1);
--- when 2 =>
--- combined_cr(23 downto 20) := cr(2);
--- when 3 =>
--- combined_cr(19 downto 16) := cr(3);
--- when 4 =>
--- combined_cr(15 downto 12) := cr(4);
--- when 5 =>
--- combined_cr(11 downto 8) := cr(5);
--- when 6 =>
--- combined_cr(7 downto 4) := cr(6);
--- when 7 =>
--- combined_cr(3 downto 0) := cr(7);
--- end case;
---
--- return combined_cr;
--- end;
---
--- function insert_multiple_crfields(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile is
--- variable cr : crfile;
--- variable combined_cr : std_ulogic_vector(63 downto 0) := (others => '0');
--- variable high, low: integer range 0 to 31 := 0;
--- begin
--- cr := cr_in;
---
--- for i in 0 to 7 loop
--- -- BE bit numbering
--- if fxm(7-i) = '1' then
--- low := 4*(7-i);
--- high := low+3;
--- cr(i) := rs(high downto low);
--- end if;
--- end loop;
---
--- return cr;
--- end;
---
--- function insert_one_crfield(cr_in: crfile; rs: std_ulogic_vector(63 downto 0); fxm: std_ulogic_vector(7 downto 0)) return crfile is
--- variable cr : crfile;
--- variable crnum: integer range 0 to 7 := 0;
--- variable high, low: integer range 0 to 31 := 0;
--- begin
--- cr := cr_in;
--- crnum := fxm_to_num(fxm);
--- low := 4*(7-crnum);
--- high := low+3;
--- cr(crnum) := rs(high downto low);
--- return cr;
--- end;
end package body crhelpers;