Advertisement
Guest User

Untitled

a guest
May 4th, 2015
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 10.03 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. entity compare is
  6.     -- Wartośd pomocnica równa 41 ( długośd wiersza pomniejszona o 1 )
  7.     generic (N : integer := 41);                   
  8.     port(
  9.     -- reset + zegar do sterowania automatem
  10.     rst, clk : in std_logic;                       
  11.     -- Szukane słowo (10-bitowy wyróżnik+bajt)
  12.     word: in std_logic_vector (17 downto 0);       
  13.     --Adres słowa (dokłady opis w dokumentacji)
  14.     out_cell : out std_logic_vector (12 downto 0)  
  15. );
  16. end entity compare;
  17.  
  18. architecture porownaj of compare is
  19.     --32 wiersze o dlugosci N
  20.     type memory is array (31 downto 0) of std_logic_vector (N downto 0);   
  21.     --idle - stan jałowy, search_wyr - wyszukiwanie wyróżnika, search_byte - wyszukiwanie bajtu, found - znaleziony
  22.     type stan is (idle, search_byte, search_wyr, found);                   
  23.    --stany automatu, nastepny stan
  24.    signal state, next_state : stan;                                        
  25.     --Pamięd podręczna: 32 wiersze po 4 bajty każdy.
  26.     signal mem: memory;                                                    
  27.     --Przeszukiwany wiersz pamięci. Zmienia się, jeśli wyróżnik nie pasuje
  28.     signal x : std_logic_vector (N downto 0);                              
  29.     --x8- Porównywany bajt z pamięci, y8-Szukany bajt, compare8- Pokazuje na których miejscach porównywane bajty są zgodne
  30.     signal x8, y8, compare8: std_logic_vector (7 downto 0);                
  31.     --x10-Porównywany wyróżnik z pamięci, y10-Szukany wyróżnik, compare10-Pokazuje na których miejscach porównywane wyróżniki są zgodne
  32.     signal x10,y10, compare10: std_logic_vector (9 downto 0);              
  33.     --out8, out10-pokazują czy porównywane bajty/wyróżniki są takie same czy różne, ew. komparator nie pracuje
  34.     signal out8, out10, in8, in10, wup, bup: std_logic;                    
  35.     --wnum-pokazyje który wiersz jest obecnie przeszukiwany, wn-sygnał pomocniczy
  36.     signal wnum, wn : std_logic_vector (4 downto 0);                       
  37.     --bnum-pokazuje który bajt jest obecnie przeszukiwany, bn-sygnał pomocniczy, found i fn-sterowanie out_cel sygnalizują znalezienie słowa
  38.     signal bnum, bn, fn, fund : std_logic_vector (1 downto 0);             
  39.  
  40. begin
  41.     y8 <= word (7 downto 0);
  42.     y10 <= word (17 downto 8);
  43.     --mem-nasza pamięć w której bedziemy wyszukiwali
  44.     mem <= ("101010001001100101000110101010100011100001","100100010000101010101011000010100100100101","010001000110010101010010011000010101010101","010000100101001011001001101000101110101101","100111100010011001010101101001010101011001","000011011101010010010000011000100110000110","100111001000101101101100110101001001010101","011010011001010001111110110101110100101010","100000010110101101010111010101011001000100","010010111010000001101010100110110110001111","100010010100101100010010100011000100001000","100111001100110101100010101001000100010100","010010101000000111100110100010111011100001","001000101001100111001001010010010101111011","001000000100101000101010010110010110110101","000110101101001100000100100110010110110001","101010100010110101010010011001000110110011","001001110110001010001111010110101011010101","110101001000010000100010001100000000001010","010010001000101001010010101000000010100000","001001000100100010010010001001010010000101","000000011101000100000100001011110100101100","101001100101011000000000000100110011010100","000010100100100110010011101101010101100100","110010101000010110010001000011100000010011","000100100001001100010010000010100011000000","000000010000100110101010011010101110101010","010000001001000000000011100000000001000101","000101000101000011010001010111000001110110","010001010000010000010010001000000010011001","001000010100100000001010000010011001000100","000100101010100010010000101100100100010100");
  45.     sterownik: process(out8, out10, state, mem, y10, word, x, bnum, wnum, fn)
  46.    
  47.     constant I : integer := 41;
  48.    
  49.     begin
  50.     --sterowanie stanem automatu
  51.         case state is                                  
  52.         --szukanie wyróżnika, kiedy znajdzie wyróżnik zmienia się stan automatu, natomiast wartości liczników się nie zmieniają
  53.         --komparator 8-bit jest wyłączony, a 10-bit włączony
  54.         when search_wyr =>                             
  55.             x10 <= x (I downto I-9);
  56.             x8 <= x(I-10 downto I-17);
  57.             in8 <= '0';
  58.             in10 <= '1';
  59.             --bajty takie same
  60.             if ( out10 = '1') then                     
  61.                 next_state <= search_byte;
  62.                 fund <= "01";
  63.                 wup <= '0';
  64.                 bup <= '0';
  65.                 --wyróżniki różne, koniec przejście w stan jałowy
  66.             elsif (out10 ='0' and wnum = "11111")then  
  67.                 next_state <= idle;
  68.                 wup <= '0';
  69.                 bup <= '0';
  70.                 fund <= "00";
  71.             else
  72.             --przeszukaj następny wyróżnik
  73.                 next_state <= search_wyr;              
  74.                 wup <= '1';
  75.                 bup <= '0';
  76.                 fund <= "01";
  77.             end if;
  78.             --przeszukiwanie bajtu
  79.        
  80.         --szukanie bajtu, kiedy znajdzie bajt zmienia się stan automatu, natomiast wartości liczników się nie zmieniają
  81.         --komparator 8-bit jest wyłączony, a 10-bit włączony
  82.         when search_byte =>                            
  83.         --ozanaczenie przeszukiwanego bajtu
  84.                 case bnum is                           
  85.                 when "00" =>
  86.                 x8 <= x(31 downto 24);
  87.                 when "01" =>
  88.                 x8 <= x(23 downto 16);
  89.                 when "10" =>
  90.                 x8 <= x(15 downto 8);
  91.                 when others =>
  92.                 x8 <= x(7 downto 0);
  93.                 end case;
  94.              x10 <= x(I downto I-9);
  95.              in8 <= '1';
  96.              in10 <= '0';
  97.              fund <= "01";
  98.              --ostateczne znalezienie bajtu
  99.             if (out8 = '1') then                       
  100.                 next_state <= found;
  101.                 wup <= '0';
  102.                 bup <= '1';
  103.                 --bajty różne, koniec przejście w stan jałowy
  104.             elsif (out8 = '0' and bnum = "11") then    
  105.                 next_state <= idle;
  106.                 fund <= "01";
  107.                 wup <= '0';
  108.                 bup <= '0';
  109.             else
  110.             --przeszukaj następny bajt
  111.                 next_state <= search_byte;             
  112.                 wup <= '0';
  113.                 bup <= '1';
  114.             end if;
  115.             --znalezienie
  116.         when found =>                                  
  117.             x8 <= x (I-10 downto I-17);
  118.             x10 <= x (I downto I-9);
  119.             in8 <= '0';
  120.             in10 <= '0';
  121.             next_state <= idle;
  122.             fund <= "11";
  123.             wup <= '0';
  124.             bup <= '0';
  125.             --nie znalezienie
  126.         when others =>                                 
  127.             next_state <= idle;
  128.             fund <= fn;
  129.             in8 <= '0';
  130.             in10 <= '0';
  131.             wup <= '0';
  132.             bup <= '0';
  133.             x8 <= "00000000";
  134.             x10 <= "0000000000";
  135.         end case;
  136.     end process;
  137.    
  138.     outcell: process (fund, state, y10, bnum)
  139.     begin
  140.         case state is
  141.         when idle =>
  142.         if (fund = "11") then
  143.         out_cell <= '0' & y10 & bnum;
  144.         elsif (fund = "00") then
  145.         --nie znaleziono wyróżnika
  146.         out_cell <= "1111111111111";                   
  147.         else
  148.         --nie znaleziono bajtu lub zresetowano układ
  149.         out_cell <= "1000000000000";                   
  150.         end if;
  151.         when found =>              
  152.         out_cell <= '0' & y10 & bnum;
  153.         when others =>
  154.         --układ pracuje
  155.         out_cell <= "0000000000000";                   
  156.         end case;
  157.     end process;
  158.    
  159.    
  160.     -- multiplekser wybierający wiesz pamięci
  161.     mul_w : process (wnum, mem)        
  162.     begin
  163.         case wnum is
  164.             when "00000" =>
  165.             x <= mem(31);
  166.             when "00001" =>
  167.             x <= mem(30);
  168.             when "00010" =>
  169.             x <= mem(29);
  170.             when "00011" =>
  171.             x <= mem(28);
  172.             when "00100" =>
  173.             x <= mem(27);
  174.             when "00101" =>
  175.             x <= mem(26);
  176.             when "00110" =>
  177.             x <= mem(25);
  178.             when "00111" =>
  179.             x <= mem(24);
  180.             when "01000" =>
  181.             x <= mem(23);
  182.             when "01001" =>
  183.             x <= mem(22);
  184.             when "01010" =>
  185.             x <= mem(21);
  186.             when "01011" =>
  187.             x <= mem(20);
  188.             when "01100" =>
  189.             x <= mem(19);
  190.             when "01101" =>
  191.             x <= mem(18);
  192.             when "01110" =>
  193.             x <= mem(17);
  194.             when "01111" =>
  195.             x <= mem(16);
  196.             when "10000" =>
  197.             x <= mem(15);
  198.             when "10001" =>
  199.             x <= mem(14);
  200.             when "10010" =>
  201.             x <= mem(13);
  202.             when "10011" =>
  203.             x <= mem(12);
  204.             when "10100" =>
  205.             x <= mem(11);
  206.             when "10101" =>
  207.             x <= mem(10);
  208.             when "10110" =>
  209.             x <= mem(9);
  210.             when "10111" =>
  211.             x <= mem(8);
  212.             when "11000" =>
  213.             x <= mem(7);
  214.             when "11001" =>
  215.             x <= mem(6);
  216.             when "11010" =>
  217.             x <= mem(5);
  218.             when "11011" =>
  219.             x <= mem(4);
  220.             when "11100" =>
  221.             x <= mem(3);
  222.             when "11101" =>
  223.             x <= mem(2);
  224.             when "11110" =>
  225.             x <= mem(1);
  226.             when others =>
  227.             x <= mem(0);           
  228.             end case;
  229.     end process;   
  230.    
  231.     wplus : process (wup, wnum)
  232.     variable wtemp : std_logic_vector (4 downto 0);
  233.     begin
  234.     if (wup = '1') then
  235.     wtemp := wnum;
  236.     wn <= std_logic_vector(unsigned(wtemp) + to_unsigned(1,2));
  237.     else
  238.     wtemp := wnum;
  239.     wn <= wtemp;
  240.     end if;
  241.     end process;
  242.    
  243.     bplus : process (bup, bnum)
  244.     variable btemp : std_logic_vector (1 downto 0);
  245.     begin
  246.     if (bup = '1') then
  247.     btemp := bnum;
  248.     bn <= std_logic_vector(unsigned(btemp) + to_unsigned(1,2));
  249.     else
  250.     btemp := bnum;
  251.     bn <= btemp;
  252.     end if;
  253.     end process;
  254.    
  255.     --komparatory bajtów
  256.     c8: process (in8, x8, y8, compare8)
  257.     begin
  258.         if (in8 = '1') then
  259.             compare8(7) <= x8(7) xor y8(7);
  260.             compare8(6) <= x8(6) xor y8(6);
  261.             compare8(5) <= x8(5) xor y8(5);
  262.             compare8(4) <= x8(4) xor y8(4);
  263.             compare8(3) <= x8(3) xor y8(3);
  264.             compare8(2) <= x8(2) xor y8(2);
  265.             compare8(1) <= x8(1) xor y8(1);
  266.             compare8(0) <= x8(0) xor y8(0);
  267.         else
  268.         compare8 <= (others => '1');
  269.         end if;
  270.         --złączenie wszystkich XOR bramką NOR-na wyjściu uzyskujemy informacje czy są takie same bajty czy różne
  271.             out8 <= not (compare8(7) or compare8(6) or compare8(5) or compare8(4) or compare8(3) or compare8(2) or compare8(1) or compare8(0));
  272.     end process;
  273.    
  274.     --komparatory wyróżników
  275.     c10: process (in10, x10, y10, compare10)
  276.     begin
  277.         if (in10 = '1') then
  278.             compare10(9) <= x10(9) xor y10(9);
  279.             compare10(8) <= x10(8) xor y10(8);
  280.             compare10(7) <= x10(7) xor y10(7);
  281.             compare10(6) <= x10(6) xor y10(6);
  282.             compare10(5) <= x10(5) xor y10(5);
  283.             compare10(4) <= x10(4) xor y10(4);
  284.             compare10(3) <= x10(3) xor y10(3);
  285.             compare10(2) <= x10(2) xor y10(2);
  286.             compare10(1) <= x10(1) xor y10(1);
  287.             compare10(0) <= x10(0) xor y10(0);
  288.         else
  289.         compare10 <= (others => '1');
  290.         end if;
  291.         --złączenie wszystkich XOR bramką NOR-na wyjściu uzyskujemy informacje czy są takie same bajty czy różne
  292.         out10 <= not (compare10(9) or compare10(8) or compare10(7) or compare10(6) or compare10(5) or compare10(4) or compare10(3) or compare10(2) or compare10(1) or compare10(0));
  293.  
  294.     end process;
  295.    
  296.     clock: process (rst,clk, wn, bn, fund)
  297.    begin
  298.     if (rst = '1') then
  299.         state <= search_wyr;
  300.         wnum <= "00000";
  301.         bnum <= "00";
  302.         fn <= "10";
  303.     elsif (clk'event and clk = '1') then
  304.     state <= next_state;
  305.         wnum <= wn;
  306.         bnum <= bn;
  307.         fn <= fund;
  308.         end if;
  309.     end process;
  310. end architecture porownaj;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement