Advertisement
Guest User

audio

a guest
Nov 27th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 3.48 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_signed.all;
  4. use ieee.std_logic_arith.all;
  5.  
  6.  
  7. entity filter    is
  8.     port(   CLOCK_50,reset                      :in std_logic;
  9.             read_ready, write_ready             :in std_logic;
  10.             read_s,write_s                      :out std_logic;
  11.             readdata_left, readdata_right       :in std_logic_vector(23 downto 0);
  12.             writedata_left, writedata_right     :out std_logic_vector(23 downto 0));
  13. end filter;
  14.  
  15. architecture struktur of filter is
  16.  
  17. -- Specify the signals you want to use.
  18. -- Draw a schematic first! 
  19.     type tilstander is (s0,s1,s2,s3);
  20.     signal tilstand, neste                  : tilstander;
  21.     signal s_filter_ready                   : std_logic;
  22.     signal s_write, s_read, s_filter        : std_logic;
  23.     signal s_read_left, s_read_right    : std_logic_vector(23 downto 0);
  24.     signal s_write_left, s_write_right  : std_logic_vector(23 downto 0);
  25.     signal s_akkl, s_akkr                   : std_logic_vector(23 downto 0);
  26.    
  27.     constant divider : integer := 3;
  28.     constant fifo_length : integer := 2** divider;
  29.     type fifo_type is array (fifo_length -1 downto 0) of std_logic_vector(23 downto 0);
  30.     signal fifol, fifor : fifo_type;
  31.    
  32.  
  33. begin -- net-list
  34.  
  35.     -- Make your net-list here..
  36.     -- The IO-signals and the synchronization are defined in the Altera document..
  37.     read_s <= s_read;
  38.     write_s <= s_write;
  39.    
  40.    
  41.     -- Tilstandsregister
  42.     reg:process(CLOCK_50, reset)
  43.     begin
  44.         if(reset = '1') then
  45.             tilstand <= s0;
  46.         elsif (rising_edge(CLOCK_50)) then
  47.             tilstand <= neste;
  48.         end if;
  49.     end process;
  50.    
  51.     -- Kombinatorikk for registerets nestetilstand og read/write status
  52.     komb:process(tilstand, read_ready, write_ready)
  53.     begin
  54.         s_read <= '0';
  55.         s_write <= '0';
  56.         s_filter <= '0';
  57.        
  58.         case tilstand is
  59.             when s0 =>                   -- wait
  60.                 if (read_ready = '1') then
  61.                     neste <= s1;
  62.                 else
  63.                     neste <= s0;
  64.                 end if;
  65.             when s1 =>                   -- read
  66.                 neste <= s2;
  67.                 s_read <= '1';
  68.             when s2 =>                   -- filter
  69.                 s_filter <= '1';
  70.                 if (write_ready = '1') and (s_filter_ready = '1') then
  71.                     neste <= s3;           
  72.                 else
  73.                     neste <= s2;
  74.                 end if;
  75.             when s3 =>                   -- write
  76.                 s_write <= '1';
  77.                 neste <= s0;
  78.             when others => neste <= s0;
  79.         end case;    
  80.        
  81.     end process;
  82.    
  83.     --
  84.     read:process(CLOCK_50)
  85.     begin
  86.         if (rising_edge(CLOCK_50)) then
  87.             if (s_read = '1') then
  88.                 --101011110000111100001111
  89.                 --111101011110000111100001
  90.                 for i in divider - 1 to 23 loop
  91.                     s_read_left(i) <= readdata_left(23);
  92.                     s_read_right(i) <= readdata_right(23);
  93.                 end loop;
  94.                 s_read_left(23 - divider downto 0) <= readdata_left (23 downto divider);
  95.                 s_read_right(23 - divider downto 0) <= readdata_right (23 downto divider);
  96.             end if;
  97.         end if;
  98.        
  99.     end process;
  100.    
  101.     filter_pros:process(CLOCK_50)
  102.     begin
  103.        
  104.         -- endre for beregning
  105.         if (rising_edge(CLOCK_50)) then
  106.             if (s_filter = '1') then
  107.                 s_write_left <= s_read_left - fifol(fifo_length - 1) + s_akkl;
  108.                 s_write_right <= s_read_right - fifor(fifo_length - 1) + s_akkr;
  109.                
  110.                 for i in 1 to fifo_length - 1 loop
  111.                     fifol(i) <= fifol(i-1);
  112.                     fifor(i) <= fifor(i-1);
  113.                 end loop;
  114.                
  115.                 fifol(0) <= s_read_left;
  116.                 s_akkl <= s_write_left;
  117.                 fifor(0) <= s_read_right;
  118.                 s_akkr <= s_write_right;
  119.                 s_filter_ready <= '1';
  120.             else
  121.                 s_filter_ready <= '0';
  122.             end if;
  123.         end if;
  124.     end process;
  125.        
  126.     write:process(CLOCK_50)
  127.     begin
  128.         if (rising_edge(CLOCK_50)) then
  129.             if (s_write = '1') then
  130.                 writedata_left <= s_write_left;
  131.                 writedata_right <= s_write_right;
  132.             end if;
  133.         end if;
  134.     end process;
  135.    
  136. end architecture;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement