?? altera_mf_87.vhd
字號:
-- This function converts an integer to a string
function INT_TO_STR_RAM (value : in integer) return string is
variable ivalue : integer := 0;
variable index : integer := 0;
variable digit : integer := 0;
variable line_no: string(8 downto 1) := " ";
begin
ivalue := value;
index := 1;
while (ivalue > 0) loop
digit := ivalue MOD 10;
ivalue := ivalue/10;
case digit is
when 0 => line_no(index) := '0';
when 1 => line_no(index) := '1';
when 2 => line_no(index) := '2';
when 3 => line_no(index) := '3';
when 4 => line_no(index) := '4';
when 5 => line_no(index) := '5';
when 6 => line_no(index) := '6';
when 7 => line_no(index) := '7';
when 8 => line_no(index) := '8';
when 9 => line_no(index) := '9';
when others =>
ASSERT FALSE
REPORT "Illegal number!"
SEVERITY ERROR;
end case;
index := index + 1;
end loop;
return line_no;
end INT_TO_STR_RAM;
function INT_TO_STR_ARITH (value : in integer) return string is
variable ivalue : integer := 0;
variable index : integer := 0;
variable digit : integer := 0;
variable temp: string(10 downto 1) := "0000000000";
begin
ivalue := value;
index := 1;
while (ivalue > 0) loop
digit := ivalue mod 10;
ivalue := ivalue/10;
case digit is
when 0 => temp(index) := '0';
when 1 => temp(index) := '1';
when 2 => temp(index) := '2';
when 3 => temp(index) := '3';
when 4 => temp(index) := '4';
when 5 => temp(index) := '5';
when 6 => temp(index) := '6';
when 7 => temp(index) := '7';
when 8 => temp(index) := '8';
when 9 => temp(index) := '9';
when others =>
ASSERT FALSE
REPORT "Illegal number!"
SEVERITY ERROR;
end case;
index := index + 1;
end loop;
if value < 0 then
return '-'& temp(index downto 1);
else
return temp(index downto 1);
end if;
end INT_TO_STR_ARITH;
-- This function converts a hexadecimal number to an integer
function HEX_STR_TO_INT (str : in string) return integer is
variable len : integer := str'length;
variable ivalue : integer := 0;
variable digit : integer := 0;
begin
for i in len downto 1 loop
case str(i) is
when '0' => digit := 0;
when '1' => digit := 1;
when '2' => digit := 2;
when '3' => digit := 3;
when '4' => digit := 4;
when '5' => digit := 5;
when '6' => digit := 6;
when '7' => digit := 7;
when '8' => digit := 8;
when '9' => digit := 9;
when 'A' => digit := 10;
when 'a' => digit := 10;
when 'B' => digit := 11;
when 'b' => digit := 11;
when 'C' => digit := 12;
when 'c' => digit := 12;
when 'D' => digit := 13;
when 'd' => digit := 13;
when 'E' => digit := 14;
when 'e' => digit := 14;
when 'F' => digit := 15;
when 'f' => digit := 15;
when others =>
ASSERT FALSE
REPORT "Illegal character "& str(i) & "in Intel Hex File! "
SEVERITY ERROR;
end case;
ivalue := ivalue * 16 + digit;
end loop;
return ivalue;
end HEX_STR_TO_INT;
-- This procedure "cuts" the str_line into desired length
procedure SHRINK_LINE (str_line : inout line; pos : in integer) is
subtype nstring is string(1 to pos);
variable str : nstring;
begin
if (pos >= 1) then
read(str_line, str);
end if;
end;
end ALTERA_COMMON_CONVERSION;
-- END OF PACKAGE
---START_ENTITY_HEADER---------------------------------------------------------
--
-- Entity Name : altaccumulate
--
-- Description : Parameterized accumulator megafunction. The accumulator
-- performs an add function or a subtract function based on the add_sub
-- parameter. The input data can be signed or unsigned.
--
-- Limitation : n/a
--
-- Results expected: result - The results of add or subtract operation. Output
-- port [width_out-1 .. 0] wide.
-- cout - The cout port has a physical interpretation as
-- the carry-out (borrow-in) of the MSB. The cout
-- port is most meaningful for detecting overflow
-- in unsigned operations. The cout port operates
-- in the same manner for signed and unsigned
-- operations.
-- overflow - Indicates the accumulator is overflow.
--
---END_ENTITY_HEADER-----------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
-- BEGINNING OF ENTITY
entity altaccumulate is
-- GENERIC DECLARATION
generic (
width_in : integer := 4; -- Required
width_out : integer := 8; -- Required
lpm_representation : string := "UNSIGNED";
extra_latency : integer := 0;
use_wys : string := "ON";
lpm_hint : string := "UNUSED";
lpm_type : string := "altaccumulate"
);
-- PORT DECLARATION
port (
-- INPUT PORT DECLARATION
cin : in std_logic := 'Z';
data : in std_logic_vector(width_in -1 downto 0); -- Required port
add_sub : in std_logic := '1';
clock : in std_logic; -- Required port
sload : in std_logic := '0';
clken : in std_logic := '1';
sign_data : in std_logic := '0';
aclr : in std_logic := '0';
-- OUTPUT PORT DECLARATION
result : out std_logic_vector(width_out -1 downto 0) := (others => '0'); -- Required port
cout : out std_logic := '0';
overflow : out std_logic := '0'
);
end altaccumulate;
-- END OF ENTITY
-- BEGINNING OF ARCHITECTURE
architecture behaviour of altaccumulate is
-- TYPE DECLARATION
type pipeline is array (extra_latency-1 downto 0) of std_logic_vector (width_out+1 downto 0);
-- SIGNAL DECLARATION
signal temp_sum : std_logic_vector (width_out downto 0) := (others => '0');
signal cout_int : std_logic := '0';
signal overflow_int : std_logic := '0';
signal result_int : std_logic_vector (width_out+1 downto 0) := (others => '0');
signal result_pipe : pipeline := (others => (others => '0'));
signal head : integer := 0;
begin
MSG: process
begin
if( width_in <= 0 ) then
ASSERT FALSE
REPORT "Error! Value of width_in parameter must be greater than 0."
SEVERITY ERROR;
end if;
if( width_out <= 0 ) then
ASSERT FALSE
REPORT "Error! Value of width_out parameter must be greater than 0."
SEVERITY ERROR;
end if;
if( extra_latency > width_out ) then
ASSERT FALSE
REPORT "Info: Value of extra_latency parameter should be lower than width_out parameter for better performance/utilization."
SEVERITY NOTE;
end if;
if( width_in > width_out ) then
ASSERT FALSE
REPORT "Error! Value of width_in parameter should be lower than or equal to width_out."
SEVERITY ERROR;
end if;
wait;
end process MSG;
-- PROCESS DECLARATION
ADDSUB : process (data, add_sub, sload, cin, sign_data,
result_int (width_out-1 downto 0))
-- VARIABLE DECLARATIOM
variable fb_int : std_logic_vector (width_out downto 0) := (others => '0');
variable data_int : std_logic_vector (width_out-1 downto 0) := (others => '0');
variable zeropad : std_logic_vector ((width_out - width_in)-1 downto 0) := (others => '0');
variable temp_sum_int : std_logic_vector (width_out downto 0) := (others => '0');
variable cout_temp, borrow : std_logic;
variable result_full : std_logic_vector (width_out downto 0);
variable temp_sum_zero : std_logic_vector (width_out downto 0) := (others => '0');
variable cin_int : std_logic;
begin
if ((LPM_REPRESENTATION = "SIGNED") or (sign_data = '1')) then
zeropad := (others => data (width_in-1));
else
zeropad := (others => '0');
end if;
if (sload = '1') then
fb_int := (others => '0');
else
fb_int := ('0' & result_int (width_out-1 downto 0));
end if;
if ((data (0) = '1') or (data (0) = '0')) then
data_int := (zeropad & data);
end if;
-- If cin is omitted (i.e. cin = 'z'), cin default is 0 for add operation
-- and 1 for subtract operation.
if ((cin /= '0') and (cin /= '1')) then
cin_int := not add_sub;
else
cin_int := cin;
end if;
if (sload = '1') then
temp_sum_int := unsigned(temp_sum_zero) + unsigned(data_int);
else
if (add_sub = '1') then
temp_sum_int := unsigned(temp_sum_zero) + unsigned(fb_int) +
unsigned(data_int) + cin_int;
cout_temp := temp_sum_int(width_out);
else
borrow := not cin_int;
if ((borrow /= '1') and (borrow /= '0')) then
borrow := '0';
end if;
temp_sum_int := unsigned(temp_sum_zero) + unsigned (fb_int) -
unsigned (data_int) - borrow;
result_full := unsigned(temp_sum_zero) + unsigned(data_int) +
borrow;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -