📄 stdio.vhd
字号:
-------------------------------------------------------------------------------- This file is a part of the GRLIB VHDL IP LIBRARY-- Copyright (C) 2003, Gaisler Research---- 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 2 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, write to the Free Software-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------------------- Package: StdIO-- File: stdio.vhd-- Author: Gaisler Research-- Description: Package for common I/O functions---------------------------------------------------------------------------------- pragma translate_offlibrary Std;use Std.Standard.all;use Std.TextIO.all;library IEEE;use IEEE.Std_Logic_1164.all;-- pragma translate_onpackage StdIO is-- pragma translate_off procedure HRead( variable L: inout Line; variable VALUE: out Std_ULogic_Vector; variable GOOD: out Boolean); procedure HRead( variable L: inout Line; variable VALUE: out Std_ULogic_Vector); procedure HRead( variable L: inout Line; variable VALUE: out Std_Logic_Vector; variable GOOD: out Boolean); procedure HRead( variable L: inout Line; variable VALUE: out Std_Logic_Vector); procedure HWrite( variable L: inout Line; constant VALUE: in Std_ULogic_Vector; constant JUSTIFIED: in SIDE := RIGHT; constant FIELD: in WIDTH := 0); procedure HWrite( variable L: inout Line; constant VALUE: in Std_Logic_Vector; constant JUSTIFIED: in SIDE := RIGHT; constant FIELD: in WIDTH := 0); procedure Write( variable L: inout Line; constant VALUE: in Std_ULogic; constant JUSTIFIED: in SIDE := RIGHT; constant FIELD: in WIDTH := 0);-- pragma translate_onend package StdIO;package body StdIO is-- pragma translate_off function ToChar(N: Std_ULogic_Vector(0 to 3)) return Character is begin case N is when "0000" => return('0'); when "0001" => return('1'); when "0010" => return('2'); when "0011" => return('3'); when "0100" => return('4'); when "0101" => return('5'); when "0110" => return('6'); when "0111" => return('7'); when "1000" => return('8'); when "1001" => return('9'); when "1010" => return('A'); when "1011" => return('B'); when "1100" => return('C'); when "1101" => return('D'); when "1110" => return('E'); when "1111" => return('F'); when others => return('X'); end case; end ToChar; function FromChar(C: Character) return Std_ULogic_Vector is variable R: Std_ULogic_Vector(0 to 3); begin case C is when '0' => R := "0000"; when '1' => R := "0001"; when '2' => R := "0010"; when '3' => R := "0011"; when '4' => R := "0100"; when '5' => R := "0101"; when '6' => R := "0110"; when '7' => R := "0111"; when '8' => R := "1000"; when '9' => R := "1001"; when 'A' => R := "1010"; when 'B' => R := "1011"; when 'C' => R := "1100"; when 'D' => R := "1101"; when 'E' => R := "1110"; when 'F' => R := "1111"; when 'a' => R := "1010"; when 'b' => R := "1011"; when 'c' => R := "1100"; when 'd' => R := "1101"; when 'e' => R := "1110"; when 'f' => R := "1111"; when others => R := "XXXX"; end case; return R; end FromChar; procedure HRead( variable L: inout Line; variable VALUE: out Std_ULogic_Vector; variable GOOD: out Boolean) is variable B: Boolean; variable C: Character; constant SL: Integer := VALUE'Length; variable SV: Std_ULogic_Vector(0 to SL-1); variable S: String(1 to SL/4-1); begin if VALUE'Length mod 4 /= 0 then GOOD := False; SV := (others => 'X'); VALUE := SV; return; end if; loop Read(L, C, B); exit when ((C /= ' ') and (C /= CR) and (C /= HT)) or (not B); end loop; SV(0 to 3) := FromChar(C); if Is_X(SV(0 to 3)) or (not B) then GOOD := False; SV := (others => 'X'); VALUE := SV; return; end if; Read(L, S, B); if not B then GOOD := False; SV := (others => 'X'); VALUE := SV; return; end if; for i in 1 to SL/4-1 loop SV(4*i to 4*i+3) := FromChar(S(i)); if Is_X(SV(4*i to 4*i+3)) then GOOD := False; SV := (others => 'X'); VALUE := SV; return; end if; end loop; GOOD := True; VALUE := SV; end HRead; procedure HRead( variable L: inout Line; variable VALUE: out Std_ULogic_Vector) is variable GOOD: Boolean; begin HRead(L, VALUE, GOOD); assert GOOD report "HREAD: access incorrect"; end HRead; procedure HRead( variable L: inout Line; variable VALUE: out Std_Logic_Vector; variable GOOD: out Boolean) is variable V: Std_ULogic_Vector(0 to Value'Length-1); begin HRead(L, V, GOOD); VALUE := Std_Logic_Vector(V); end HRead; procedure HRead( variable L: inout Line; variable VALUE: out Std_Logic_Vector) is variable GOOD: Boolean; variable V: Std_ULogic_Vector(0 to Value'Length-1); begin HRead(L, V, GOOD); VALUE := Std_Logic_Vector(V); assert GOOD report "HREAD: access incorrect"; end HRead; procedure HWrite( variable L: inout Line; constant VALUE: in Std_ULogic_Vector; constant JUSTIFIED: in SIDE := RIGHT; constant FIELD: in WIDTH := 0) is constant PL: Integer := 4-(VALUE'Length mod 4); constant PV: Std_ULogic_Vector(1 to PL) := (others => '0'); constant TL: Integer := PL + VALUE'Length; constant TV: Std_ULogic_Vector(0 to TL-1) := PV & Value; variable S: String(1 to TL/4); begin if PL /= 4 then for i in 0 to TL/4 -1 loop S(i+1) := ToChar(TV(4*i to 4*i+3)); end loop; Write(L, S(1 to TL/4), JUSTIFIED, FIELD); else for i in 1 to TL/4 -1 loop S(i+1) := ToChar(TV(4*i to 4*i+3)); end loop; Write(L, S(2 to TL/4), JUSTIFIED, FIELD); end if; end HWrite; procedure HWrite( variable L: inout Line; constant VALUE: in Std_Logic_Vector; constant JUSTIFIED: in SIDE := RIGHT; constant FIELD: in WIDTH := 0) is begin HWrite(L, Std_ULogic_Vector(VALUE), JUSTIFIED, FIELD); end HWrite; procedure Write( variable L: inout Line; constant VALUE: in Std_ULogic; constant JUSTIFIED: in SIDE := RIGHT; constant FIELD: in WIDTH := 0) is type Char_Array is array (Std_ULogic) of Character; constant ToChar: Char_Array := "UX01ZWLH-"; begin Write(L, ToChar(VALUE), JUSTIFIED, FIELD); end Write;-- pragma translate_onend package body StdIO;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -