-------------------------------------------------------------------------------
-- Title :
-- Project : Arithmetic blocks
-------------------------------------------------------------------------------
-- File : smac.VHD
-- Author : Jamil Khatib
-- Organization: OpenIPCore Project
-- Created : 2000/04/12
-- Last update : 2000/04/17
-- Platform :
-- Simulators : Modelsim 5.3XE / Windows98
-- Synthesizers: Leonardo / WindowsNT
-- Target :
-- Dependency :
-------------------------------------------------------------------------------
-- Description: Arithmetic blocks
-------------------------------------------------------------------------------
-- Copyright (c) 2000 Jamil Khatib
--
-- This VHDL design file is an open design; you can redistribute it and/or
-- modify it and/or implement it under the terms of the Openip General Public
-- License as it is going to be published by the OpenIPCore Organization and
-- any coming versions of this license.
-- You can check the draft license at
-- http://www.openip.org/oc/license.html
-------------------------------------------------------------------------------
-- Revisions :
-- Revision Number : 1
-- Version : 0.1
-- Date : 12th Apr 2000
-- Modifier : Jamil Khatib (khatib@ieee.org)
-- Desccription : Created
--
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Revision Number : 2
-- Version : 0.2
-- Date : 17th Apr 2000
-- Modifier : Jamil Khatib (khatib@ieee.org)
-- Desccription : More generic
--
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Revision Number : 3
-- Version : 0.3
-- Date : 18th Apr 2000
-- Modifier : "Gerli, Luca" (luca_gerli@mentorg.com>)
-- Desccription : Speed and size improvement
--
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity ScaleMAC is
generic (
OPSIZE : integer := 8); -- Operand size
port (
Op1 : in std_logic_vector(OPSIZE - 1 downto 0); -- Operand 1
Op2 : in std_logic_vector(OPSIZE - 1 downto 0); -- Operand 2
Res : out std_logic_vector(OPSIZE -1 downto 0); -- Result
Overflow : out std_logic; -- Overflow
ValidOut : out std_logic; -- valid output active high
clk : in std_logic; -- system clock positive edge
rst_n : in std_logic); -- system reset active low
end ScaleMAC;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
architecture behavior of ScaleMAC is
begin -- behavior
-- purpose: calculates MAC using serial approach
-- type : sequential
-- inputs : clk positive edge
-- rst_n active low
-- outputs:
mac : process (clk, rst_n)
variable op2tmp : std_logic_vector(OPSIZE - 1 downto 0); -- Temporary store of operand 2
variable op1tmp : std_logic_vector(OPSIZE - 1 downto 0); -- Temporary store of operand 1
variable tmpres : std_logic_vector(OPSIZE - 1 downto 0); -- Temporary result
variable andres : std_logic_vector(OPSIZE -1 downto 0); -- Anding result
variable count : integer range 0 to (OPSIZE-1); -- counter
variable validvar : std_logic; -- ValidOut variable
variable overflowvar : std_logic; -- ValidOut variable
variable resvar : std_logic_vector(OPSIZE -1 downto 0);
begin -- process mac
if rst_n = '0' then -- asynchronous reset (active low)
resvar := (others => '0');
validvar := '1';
op2tmp := (others => '0');
op1tmp := (others => '0');
tmpres := (others => '0');
count := 0;
overflowvar := '0';
elsif clk'event and clk = '1' then -- rising clock edge
if validvar = '1' then
validvar := '0';
tmpres := (others => '0');
op1tmp := op1;
op2tmp := op2;
overflowvar := '0';
end if; -- if validvar = '1' then
overflowvar := overflowvar or tmpres(OPSIZE-1);
tmpres := tmpres(OPSIZE - 2 downto 0 ) & '0';
if op2tmp(OPSIZE-1) = '1' then
tmpres := tmpres + op1tmp;
end if;
op2tmp := op2tmp(OPSIZE-2 downto 0) & '0';
if count = (OPSIZE-1) then
validvar := '1';
resvar := tmpres;
count := 0;
else
count := count + 1;
end if; -- if count = (OPSIZE-1) then
end if; -- elsif clk'event and clk = '1' then
ValidOut <= validvar;
Overflow <= overflowvar;
Res <= resvar;
end process mac;
end behavior;