1 ----------------------------------------------------------------- 2 -- Copyright (c) 1997 Ben Cohen. All rights reserved. 3 -- This model can be used in conjunction with the Kluwer Academic books 4 -- "VHDL Coding Styles and Methodologies", ISBN: 0-7923-9598-0 5 -- "VHDL Amswers to Frequently Asked Questions", Kluwer Academic 6 -- by Ben Cohen. email: vhdlcohen@aol.com 7 -- 8 -- This source file for the Image Package 9 -- may be used and distributed without restriction provided 10 -- that this copyright statement is not removed from the file 11 -- and that any derivative work contains this copyright notice. 12 --------------------------------------------------------------- 13 library IEEE; 14 use IEEE.Std_Logic_1164.all; 15 use IEEE.Std_Logic_TextIO.all; 16 use IEEE.Std_Logic_Arith.all; 17 18 library Std; 19 use STD.TextIO.all; 20 21 package image_pkg is 22 function Image(In_Image : Time) return String; 23 function Image(In_Image : Bit) return String; 24 function Image(In_Image : Bit_Vector) return String; 25 function Image(In_Image : Integer) return String; 26 function Image(In_Image : Real) return String; 27 function Image(In_Image : Std_uLogic) return String; 28 function Image(In_Image : Std_uLogic_Vector) return String; 29 function Image(In_Image : Std_Logic_Vector) return String; 30 function Image(In_Image : Signed) return String; 31 function Image(In_Image : UnSigned) return String; 32 33 function HexImage(InStrg : String) return String; 34 function HexImage(In_Image : Bit_Vector) return String; 35 function HexImage(In_Image : Std_uLogic_Vector) return String; 36 function HexImage(In_Image : Std_Logic_Vector) return String; 37 function HexImage(In_Image : Signed) return String; 38 function HexImage(In_Image : UnSigned) return String; 39 40 function DecImage(In_Image : Bit_Vector) return String; 41 function DecImage(In_Image : Std_uLogic_Vector) return String; 42 function DecImage(In_Image : Std_Logic_Vector) return String; 43 function DecImage(In_Image : Signed) return String; 44 function DecImage(In_Image : UnSigned) return String; 45 end image_pkg; 46 47 package body image_pkg is 48 function Image(In_Image : Time) return String is 49 variable L : Line; -- access type 50 variable W : String(1 to 25) := (others => ' '); 51 -- Long enough to hold a time string 52 begin 53 -- the WRITE procedure creates an object with "NEW". 54 -- L is passed as an output of the procedure. 55 Std.TextIO.WRITE(L, in_image); 56 -- Copy L.all onto W 57 W(L.all'range) := L.all; 58 Deallocate(L); 59 return W; 60 end Image; 61 62 function Image(In_Image : Bit) return String is 63 variable L : Line; -- access type 64 variable W : String(1 to 3) := (others => ' '); 65 begin 66 Std.TextIO.WRITE(L, in_image); 67 W(L.all'range) := L.all; 68 Deallocate(L); 69 return W; 70 end Image; 71 72 function Image(In_Image : Bit_Vector) return String is 73 variable L : Line; -- access type 74 variable W : String(1 to In_Image'length) := (others => ' '); 75 begin 76 Std.TextIO.WRITE(L, in_image); 77 W(L.all'range) := L.all; 78 Deallocate(L); 79 return W; 80 end Image; 81 82 function Image(In_Image : Integer) return String is 83 variable L : Line; -- access type 84 variable W : String(1 to 32) := (others => ' '); 85 -- Long enough to hold a time string 86 begin 87 Std.TextIO.WRITE(L, in_image); 88 W(L.all'range) := L.all; 89 Deallocate(L); 90 return W; 91 end Image; 92 93 function Image(In_Image : Real) return String is 94 variable L : Line; -- access type 95 variable W : String(1 to 32) := (others => ' '); 96 -- Long enough to hold a time string 97 begin 98 Std.TextIO.WRITE(L, in_image); 99 W(L.all'range) := L.all; 100 Deallocate(L); 101 return W; 102 end Image; 103 104 function Image(In_Image : Std_uLogic) return String is 105 variable L : Line; -- access type 106 variable W : String(1 to 3) := (others => ' '); 107 begin 108 IEEE.Std_Logic_Textio.WRITE(L, in_image); 109 W(L.all'range) := L.all; 110 Deallocate(L); 111 return W; 112 end Image; 113 114 function Image(In_Image : Std_uLogic_Vector) return String is 115 variable L : Line; -- access type 116 variable W : String(1 to In_Image'length) := (others => ' '); 117 begin 118 IEEE.Std_Logic_Textio.WRITE(L, in_image); 119 W(L.all'range) := L.all; 120 Deallocate(L); 121 return W; 122 end Image; 123 124 function Image(In_Image : Std_Logic_Vector) return String is 125 variable L : Line; -- access type 126 variable W : String(1 to In_Image'length) := (others => ' '); 127 begin 128 IEEE.Std_Logic_TextIO.WRITE(L, In_Image); 129 W(L.all'range) := L.all; 130 Deallocate(L); 131 return W; 132 end Image; 133 134 function Image(In_Image : Signed) return String is 135 begin 136 return Image(Std_Logic_Vector(In_Image)); 137 end Image; 138 139 function Image(In_Image : UnSigned) return String is 140 begin 141 return Image(Std_Logic_Vector(In_Image)); 142 end Image; 143 144 function HexImage(InStrg : String) return String is 145 subtype Int03_Typ is Integer range 0 to 3; 146 variable Result : string(1 to ((InStrg'length - 1)/4)+1) := 147 (others => '0'); 148 variable StrTo4 : string(1 to Result'length * 4) := 149 (others => '0'); 150 variable MTspace : Int03_Typ; -- Empty space to fill in 151 variable Str4 : String(1 to 4); 152 variable Group_v : Natural := 0; 153 begin 154 MTspace := Result'length * 4 - InStrg'length; 155 StrTo4(MTspace + 1 to StrTo4'length) := InStrg; -- padded with '0' 156 Cnvrt_Lbl : for I in Result'range loop 157 Group_v := Group_v + 4; -- identifies end of bit # in a group of 4 158 Str4 := StrTo4(Group_v - 3 to Group_v); -- get next 4 characters 159 case Str4 is 160 when "0000" => Result(I) := '0'; 161 when "0001" => Result(I) := '1'; 162 when "0010" => Result(I) := '2'; 163 when "0011" => Result(I) := '3'; 164 when "0100" => Result(I) := '4'; 165 when "0101" => Result(I) := '5'; 166 when "0110" => Result(I) := '6'; 167 when "0111" => Result(I) := '7'; 168 when "1000" => Result(I) := '8'; 169 when "1001" => Result(I) := '9'; 170 when "1010" => Result(I) := 'A'; 171 when "1011" => Result(I) := 'B'; 172 when "1100" => Result(I) := 'C'; 173 when "1101" => Result(I) := 'D'; 174 when "1110" => Result(I) := 'E'; 175 when "1111" => Result(I) := 'F'; 176 when others => Result(I) := 'X'; 177 end case; -- Str4 178 end loop Cnvrt_Lbl; 179 180 return Result; 181 end HexImage; 182 183 184 function HexImage(In_Image : Bit_Vector) return String is 185 begin 186 return HexImage(Image(In_Image)); 187 end HexImage; 188 189 function HexImage(In_Image : Std_uLogic_Vector) return String is 190 begin 191 return HexImage(Image(In_Image)); 192 end HexImage; 193 194 function HexImage(In_Image : Std_Logic_Vector) return String is 195 begin 196 return HexImage(Image(In_Image)); 197 end HexImage; 198 199 function HexImage(In_Image : Signed) return String is 200 begin 201 return HexImage(Image(In_Image)); 202 end HexImage; 203 204 function HexImage(In_Image : UnSigned) return String is 205 begin 206 return HexImage(Image(In_Image)); 207 end HexImage; 208 209 function DecImage(In_Image : Bit_Vector) return String is 210 variable In_Image_v : Bit_Vector(In_Image'length downto 1) := In_Image; 211 begin 212 if In_Image'length > 31 then 213 assert False 214 report "Number too large for Integer, clipping to 31 bits" 215 severity Warning; 216 return Image(Conv_Integer 217 (Unsigned(To_StdLogicVector 218 (In_Image_v(31 downto 1))))); 219 else 220 return Image(Conv_Integer(Unsigned(To_StdLogicVector(In_Image)))); 221 end if; 222 end DecImage; 223 224 function DecImage(In_Image : Std_uLogic_Vector) return String is 225 variable In_Image_v : Std_uLogic_Vector(In_Image'length downto 1) 226 := In_Image; 227 begin 228 if In_Image'length > 31 then 229 assert False 230 report "Number too large for Integer, clipping to 31 bits" 231 severity Warning; 232 return Image(Conv_Integer(Unsigned(In_Image_v(31 downto 1)))); 233 else 234 return Image(Conv_Integer(Unsigned(In_Image))); 235 end if; 236 end DecImage; 237 238 function DecImage(In_Image : Std_Logic_Vector) return String is 239 variable In_Image_v : Std_Logic_Vector(In_Image'length downto 1) 240 := In_Image; 241 begin 242 if In_Image'length > 31 then 243 assert False 244 report "Number too large for Integer, clipping to 31 bits" 245 severity Warning; 246 return Image(Conv_Integer(Unsigned(In_Image_v(31 downto 1)))); 247 else 248 return Image(Conv_Integer(Unsigned(In_Image))); 249 end if; 250 end DecImage; 251 252 function DecImage(In_Image : Signed) return String is 253 variable In_Image_v : Signed(In_Image'length downto 1) := In_Image; 254 begin 255 if In_Image'length > 31 then 256 assert False 257 report "Number too large for Integer, clipping to 31 bits" 258 severity Warning; 259 return Image(Conv_Integer(In_Image_v(31 downto 1))); 260 else 261 return Image(Conv_Integer(In_Image)); 262 end if; 263 end DecImage; 264 265 function DecImage(In_Image : UnSigned) return String is 266 variable In_Image_v : UnSigned(In_Image'length downto 1) := In_Image; 267 begin 268 if In_Image'length > 31 then 269 assert False 270 report "Number too large for Integer, clipping to 31 bits" 271 severity Warning; 272 return Image(Conv_Integer(In_Image_v(31 downto 1))); 273 else 274 return Image(Conv_Integer(In_Image)); 275 end if; 276 end DecImage; 277 278 end image_pkg;