📄 da.vhd
字号:
--------------------------------------------------------------------------------- Title : Distributed Arithmetic top level-- Project : Arithmetic blocks--------------------------------------------------------------------------------- File : da.VHD-- Author : Jamil Khatib -- Organization: OpenIPCore Project-- Created : 2001/04/17-- Last update : 2001/04/17-- Platform : -- Simulators : Modelsim 5.3XE / Windows98-- Synthesizers: Leonardo / WindowsNT-- Target : -- Dependency : dapkg--------------------------------------------------------------------------------- Description: Distributed Arithmetic based digital filter top level--------------------------------------------------------------------------------- Copyright (c) 2001 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 : 17th Apr 2001-- Modifier : Jamil Khatib (khatib@ieee.org)-- Desccription : Created------------------------------------------------------------------------------------------------------------------------------------------------------------------ Revisions :-- Revision Number : 2-- Version : 0.2-- Date : 30th Apr 2001-- Modifier : Jamil Khatib (khatib@ieee.org)-- Desccription : Bug fixes and combining it with scaladder.vhd file---------------------------------------------------------------------------------library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.dapkg.all; entity DA is generic ( NOINPUTS : integer := BUFFER_SIZE; -- number of inputs, no. of filter tabs WORD_SIZE : integer := DATA_SIZE; -- word size CONTENTS : TABLE := CONSTANTS); port ( data : in std_logic_vector(WORD_SIZE -1 downto 0); -- input data Clk : in std_logic; -- system clock Rst_n : in std_logic; -- System reset Result : out std_logic_vector(WORD_SIZE -1 downto 0); -- Result ValidOut : out std_logic; -- Output valid Overflow : out std_logic); -- Overflow signalend DA; use work.dapkg.all; architecture behavior of DA is signal address : std_logic_vector(NOINPUTS -1 downto 0); -- dalut address signal lutres : std_logic_vector(WORD_SIZE -1 downto 0); -- dalut results, partial products signal valid_l : std_logic; -- Local Valid Signal begin -- behavior------------------------------------------------------------------------------- LUT : DALUT generic map ( ADDR_SIZE => NOINPUTS, OUTPUT_SIZE => WORD_SIZE, CONTENTS => CONSTANTS) port map ( Address => address, Result => lutres); ------------------------------------------------------------------------------- --------------------------------------------------------------------------------- purpose: Input shift registers-- type : sequential-- inputs : clk, rst_n-- outputs: shiftinputs : process (clk, rst_n) type SHIFTREGS is array (0 to (NOINPUTS) -1) of std_logic_vector((WORD_SIZE-1 ) downto 0); variable buffer_reg_typ : SHIFTREGS; -- Internal storage buffer variable count : integer range 0 to (WORD_SIZE-1); -- counter begin -- process shiftinputs if rst_n = '0' then -- asynchronous reset (active low) Valid_l <= '0'; address <= (others => '0'); -- reset the internal buffer for i in 0 to (NOINPUTS -1) loop buffer_reg_typ(i) := (others => '0'); end loop; -- i count := 0; ------------------------------------------------------ elsif clk'event and clk = '1' then -- rising clock edge -- Do the shift for all register buffer and send it to the DALUT address for i in (NOINPUTS-1) downto 1 loop buffer_reg_typ(i) := buffer_reg_typ(i)(WORD_SIZE-2 downto 0) & buffer_reg_typ(i-1)(WORD_SIZE -1); -- -- cyclic shift register end loop; -- i buffer_reg_typ(0) := buffer_reg_typ(0)(WORD_SIZE-2 downto 0) & '0'; if count = (WORD_SIZE -1) then valid_l <= '1'; count := 0; buffer_reg_typ(0) := data; else valid_l <= '0'; count := count + 1; end if; for i in 0 to (NOINPUTS-1) loop address(i) <= buffer_reg_typ(i)(WORD_SIZE-1); end loop; -- i end if; end process shiftinputs; ------------------------------------------------------------------------------- ValidOut <= valid_l; ------------------------------------------------------------------------------- -- purpose: calculates MAC using serial approach -- type : sequential -- inputs : clk positive edge -- rst_n active low -- outputs: mac : process (clk, rst_n) variable tmpres : std_logic_vector(WORD_SIZE - 1 downto 0); -- Temporary result variable overflow_var : std_logic; -- Over Flow variable begin -- process mac if rst_n = '0' then -- asynchronous reset (active low) Result <= (others => '0'); tmpres := (others => '0'); overflow_var := '0'; elsif clk'event and clk = '1' then -- rising clock edge if valid_l = '1' then tmpres := (others => '0'); Overflow_var := '0'; end if; overflow_var := overflow_var or tmpres(WORD_SIZE-1); tmpres := tmpres(WORD_SIZE -2 downto 0 ) & '0'; tmpres := tmpres + lutres; Result <= tmpres; end if; Overflow <= overflow_var; end process mac; end behavior;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -