📄 pci_lib.vhd
字号:
when x"0" => C := '0'; Good1 := true;
when x"1" => C := '1'; Good1 := true;
when x"2" => C := '2'; Good1 := true;
when x"3" => C := '3'; Good1 := true;
when x"4" => C := '4'; Good1 := true;
when x"5" => C := '5'; Good1 := true;
when x"6" => C := '6'; Good1 := true;
when x"7" => C := '7'; Good1 := true;
when x"8" => C := '8'; Good1 := true;
when x"9" => C := '9'; Good1 := true;
when x"A" => C := 'A'; Good1 := true;
when x"B" => C := 'B'; Good1 := true;
when x"C" => C := 'C'; Good1 := true;
when x"D" => C := 'D'; Good1 := true;
when x"E" => C := 'E'; Good1 := true;
when x"F" => C := 'F'; Good1 := true;
when "ZZZZ" => C := 'Z'; Good1 := true;
when others => Good1 := false;
end case;
if not Good1 then
C := '0';
report HeaderMsg&"Expected a Hex character (0-F)"
severity MsgSeverity;
end if;
Good := Good1;
end Bit2Hex;
--------------------------------------------------------------------
--------------------------------------------------------------------
procedure Vec2Hex (
Value : in Std_Logic_Vector(31 downto 0);
Result : out String(1 to 8);
GOOD : out BOOLEAN) is
variable OK : Boolean;
variable C : Character;
constant NE : Integer := value'length/4; -- number of Hex chars
variable BV : Std_Logic_Vector(value'length-1 downto 0) := Value;
variable Res : String(1 to 8);
constant HeaderMsg : String := "Vec2Hex: ";
constant MsgSeverity : Severity_Level := Error;
begin
if Value'length mod 4 /= 0 then -- Testing if Vector is mod 4
Good := false;
report HeaderMsg&"The length of input vector is not modulo 4!"
severity MsgSeverity;
return;
end if;
Bit2Hex(BV(3 downto 0), C, OK); -- Conversion of the 4 LSB bits
if not OK then
Good := false;
return;
end if;
Res := C & Res(2 to NE); -- Places first Char in Result
for i in 1 to NE-1 loop
Bit2Hex(BV(4*i+3 downto 4*i), C, OK); -- Converts next Char
if not OK then
Good := false;
return;
end if;
Res := Res(1 to i) & C & Res(i+2 to NE);
end loop;
for i in 0 to NE-1 loop
Result (1+i) := Res (NE-i);
end loop;
Good := true;
end Vec2Hex;
--------------------------------------------------------------------
--------------------------------------------------------------------
procedure Read (
L : inout line;
Value : out integer;
Radix : in positive) is
constant not_digit : integer := -999;
variable Digit : integer;
variable Result : integer := 0;
variable Pos : integer;
begin
-- calculate the value
if (L'length <=0 ) then
for i in Pos to L'right loop
digit := digit_value(L(i));
exit when (Digit = not_digit) or (digit >= radix);
Result := Result * Radix + digit;
Pos := Pos + 1;
end loop;
Value := Result;
end if;
end Read;
--------------------------------------------------------------------
--------------------------------------------------------------------
procedure ReadHex (
L : inout Line;
Value : out Std_Logic_Vector;
Good : out Boolean;
Enable : out Std_Logic_Vector) is
variable OK : Boolean;
variable C : Character;
constant NE : Integer := value'length/4;
variable BV : Std_Logic_Vector(value'length-1 downto 0);
variable TEMP : Std_Logic_Vector(value'length-1 downto 0);
variable S : String(1 to NE-1);
constant HeaderMsg : String := "Vec2Hex";
constant MsgSeverity : Severity_Level := Warning;
begin
Enable(3 downto 0) :="0000";
if Value'length mod 4 /= 0 then -- Testing if Vector is mod 4
Good := false;
report HeaderMsg&"The length of input vector is not modulo 4!"
severity MsgSeverity;
return;
end if;
loop
read(L, C, OK); -- Finds the first Hex Char
exit when (((C /= ' ') and (C /= CR) and (C /= HT)) or
(L'length = 0));
end loop;
Hex2Bit(C, BV( 3 downto 0), OK); -- Converts first Hex Char to 4 Bits
if C ='X' or C ='x' then
Enable(3) :='1';
end if;
if not OK then
Good := false;
return;
end if;
read(L, S, OK); -- Reads the next three Hex Chars
if not OK then
Good := false;
return;
end if;
for i in 1 to NE-1 loop
if s(i) ='X' or s(i) ='x' then
if i=1 then
Enable(3):='1';
end if;
if i=2 or i=3 then
Enable(2):='1';
end if;
if i=4 or i=5 then
Enable(1):='1';
end if;
if i=6 or i=7 then
Enable(0):='1';
end if;
end if;
Hex2Bit(s(i), BV(4*i+3 downto 4*i), OK); -- Converts to BitVector
if not OK then
Good := false;
return;
end if;
end loop;
Good := true;
-- for byte
if (value'length = 8 ) then
for i in 0 to 3 loop
TEMP(i) := BV(value'length-4+i);
end loop;
for i in 0 to 3 loop
TEMP(i+4) := BV(value'length-8+i);
end loop;
end if;
-- for word
if (value'length = 16 ) then
for i in 0 to 3 loop
TEMP(i) := BV(value'length-4+i);
end loop;
for i in 0 to 3 loop
TEMP(i+4) := BV(value'length-8+i);
end loop;
for i in 0 to 3 loop
TEMP(i+8) := BV(value'length-12+i);
end loop;
for i in 0 to 3 loop
TEMP(i+12) := BV(value'length-16+i);
end loop;
end if;
-- for DWORD
if (value'length =32 ) then
for i in 0 to 3 loop
TEMP(i) := BV(value'length-4+i);
end loop;
for i in 0 to 3 loop
TEMP(i+4) := BV(value'length-8+i);
end loop;
for i in 0 to 3 loop
TEMP(i+8) := BV(value'length-12+i);
end loop;
for i in 0 to 3 loop
TEMP(i+12) := BV(value'length-16+i);
end loop;
for i in 0 to 3 loop
TEMP(i+16) := BV(value'length-20+i);
end loop;
for i in 0 to 3 loop
TEMP(i+20) := BV(value'length-24+i);
end loop;
for i in 0 to 3 loop
TEMP(i+24) := BV(value'length-28+i);
end loop;
for i in 0 to 3 loop
TEMP(i+28) := BV(value'length-32+i);
end loop;
end if;
Value := TEMP;
end ReadHex;
--------------------------------------------------------------------
--------------------------------------------------------------------
procedure FileParser (
constant file_name : in String ;
variable Commands : inout CommandArray;
variable NumCommands : out Natural;
variable ErrFlag : inout Boolean) is
File CmdFile : text;
constant HeaderMsg : String := "FileParser:";
constant MsgSeverity : Severity_Level := Error;
variable L : Line := NULL;
variable Linenum : Natural := 0;
variable LblNum : Natural := 0;
variable CmdNum : Natural := 0;
variable EndOfFile : Boolean := false;
variable Good : Boolean := false;
variable Int : Integer;
variable Tm : Time;
variable C : Character;
variable Addr : Std_Logic_Vector(31 downto 0);
variable Data : Std_Logic_Vector(31 downto 0);
variable Enable : Std_Logic_Vector(3 downto 0);
variable Vect_count : Std_Logic_Vector(7 downto 0);
variable Data_word : Std_Logic_Vector(15 downto 0);
variable Data_byte : Std_Logic_Vector(7 downto 0);
variable str4 : string(1 to 4);
variable count_nr : Integer;
variable count : Integer;
begin
ErrFlag := false;
FILE_OPEN(CmdFile,file_name,READ_MODE);
loop
readline(CmdFile,L);
EndOfFile := endfile(CmdFile);
CmdNum := CmdNum + 1;
LineNum := LineNum + 1;
read(L, str4, Good);
if not Good then
CmdNum := CmdNum-1;
else
case str4 is
when "WRSW" => -- write single word command
readhex(L,Addr,Good,Enable);
if not Good then
report HeaderMsg&"Invalid WRSW command in :"&file_name&", line #"& integer'image(LineNum) &", "&"Address parameter should be 8 hex characters"
severity MsgSeverity;
ErrFlag := true;
else
Good := true;
readhex(L,Data_byte,Good,Enable);
count_nr := Byte2Int(Data_Byte);
count := 0;
for I in 0 to count_nr-1 loop
readhex(L,Data,Good,Enable);
if (Good =true) then
count := count + 1;
commands(CmdNum).command := "WRSW";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -