[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[oc] MAC FIR problem



Hello,

I tried to do MAC (Multiplication and Accumulation) function using VHDL 
code to be implemented in FPGA. But I encountered some errors during 
its synthesis using Xilinx. Here is I attached the codes

--*********************
--* MULTIPLIER MODULE *
--*********************
--
--FILENAME: mul.vhd
--
--This is the VHDL source code for multiplier module
--pragma synthesis_on 
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_MISC.ALL;

--library virtex;
--use virtex.components.all;
--library SYNOPSYS;
--use SYNOPSYS.ATTRIBUTES.all;
--library DWARE;
--use DWARE.BEHAVIORAL.all;

entity mul is

port(data: in integer range -32678 to 32767;
	CLK: in std_logic;
	reset: in std_logic;
	const: in integer range -256 to 255;
	start: in std_logic;
	output: out integer range -32768 to 32767);

end mul;

architecture M1 of mul is
	--attribute dont_unroll:boolean;

begin

process (CLK, reset)

	variable in16 : INTEGER range -32678 to 32767;
	variable inconst : INTEGER range -256 to 255;
	variable out25b: SIGNED (24 downto 0);
	variable out16b: SIGNED (15 downto 0);
	variable out25 : INTEGER range -16777216 to 16777215;
	variable out25_add : INTEGER range -16777216 to 16777215;
	--attribute dont_unroll of mul_loop:label is TRUE;

begin

--init variables and output ports

	reset_loop: loop

	out25b := "0000000000000000000000000";
	out16b := "0000000000000000";
	out25 := 0;
	out25_add := 0;
	in16 := 0;
	inconst := 0;
	output <= 0;

--RIsing edge of clock

	 if (CLK'event and CLK='1') then 
	if (reset='1') then exit reset_loop; end if;
	end if; --

	algorithm_loop:loop

--input handshaking protocol

	check_ready:loop
		if (start='1') then
			in16 := data;
			inconst := const;
			exit check_ready;
		end if;	

	
	if (CLK'event and CLK='1') then 
	if (reset='1') then exit reset_loop; end if;
	end if; 

	end loop check_ready;

	if (CLK'event and CLK='1') then 
	if (reset='1') then exit reset_loop; end if;
	end if; --

--multiplication and accumulation out in 25 bits

	mul_loop: for count in 0 to 20 loop
		out25_add :=  in16*inconst;
		out25:=out25 + out25_add;
		in16 := data;
inconst := const;
		
	--wait until clk'event and clk = '1';
	if (CLK'event and CLK='1') then 
	if (reset='1') then exit reset_loop; end if;
	end if; --

		end loop;


--rounding the final result by adding a LSB to the upper 16 bits if bit 8 is 
a '1'

	out25b := conv_signed(out25,25);
	if (out25b(8)='1') then out25b := out25b + 512; end if;

--converting the final results to 16 bits by discarding the lower 9 bits 
and output the fila result to the output port

	out16b:= out25b(24 downto 9);
	output <= conv_integer(out16b);

--initialize the variable that is used to hold the final sum of FIR filter 
operation 

	out25:=0;

	--wait until clk'event and clk = '1';
	if (CLK'event and CLK='1') then 
	if (reset='1') then exit reset_loop; end if;
	end if; --

   end loop algorithm_loop;

  end loop reset_loop;

 end process ;

end M1;
--
To unsubscribe from cores mailing list please visit http://www.opencores.org/mailinglists.shtml