Advertisement
filip710

ledmatrix.vhdl

Nov 20th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 9.54 KB | None | 0 0
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3.  
  4. entity LEDMatrixCNTRL is
  5.  
  6. PORT(
  7.     --TO DO 1 -> deklarirati ulaze "rst", "wake", "send_data", "send_reg" i "clk_in" (STD_LOGIC)
  8.     rst, wake, send_data, send_reg, clk_in: in std_logic;
  9.     --TO DO 2 -> deklarirati ulaz "data" (STD_LOGIC_VECTOR) veličine 64 bita (koristiti '0 to 63')
  10.     data: in STD_LOGIC_VECTOR(0 to 63);
  11.     --TO DO 3 -> deklarirati ulaz "CNTRL_reg" (STD_LOGIC_VECTOR) veličine 16 bita
  12.     CNTRL_reg: in STD_LOGIC_VECTOR(0 to 15);
  13.     --TO DO 4 -> deklarirati izlaze "load" i "d_out" (STD_LOGIC)
  14.     load, d_out: out std_logic;
  15.     --TO DO 5 -> deklarirati buffer "clk_out" (STD_LOGIC)
  16.     clk_out: buffer std_logic;
  17.    
  18. );
  19.  
  20. end LEDMatrixCNTRL;
  21.  
  22. architecture Behavioral of LEDMatrixCNTRL is
  23.  
  24.     --TO DO 6 -> deklarirati signal "decoded_data" (STD_LOGIC_VECTOR) veličine 16 bita i signal "decode" (integer) koji može poprimiti vrijednosti u rasponu od 0 do 7
  25.     signal decoded_data: STD_LOGIC_VECTOR(0 to 15);
  26.     signal decore: integer range 0 to 7;
  27.    
  28.  
  29.     --TO DO 7 -> definirati konstante "wake_signal" i "shutDown_signal" (STD_LOGIC_VECTOR) veličine 16 bita te im pridružiti odgovarajuće vrijednosti
  30.     constant wake_signal: STD_LOGIC_VECTOR(0 to 15) := "0000_1100_0000_0001";
  31.     constant shutDown_signal: STD_LOGIC_VECTOR(0 to 15) := "0000_1100_0000_0000";
  32.    
  33.  
  34.     --TO DO 8 -> definirati korisnički tip podataka naziva "state" koji može imati vrijednosti "ShutDown", "WakeState", "SSD", "NormalOP", "SendData" i "SendReg"
  35.     TYPE state IS (ShutDown, WakeState, SSD, NormalOP, SendData, SendReg);
  36.  
  37.     --TO DO 9 -> deklarirati signale "current_state" i "next_state" koji su tipa "state"
  38.     SIGNAL current_state, next_state: state;
  39.  
  40.     --TO DO 10 -> deklarirati signale "sent" i "sentMatrix" (STD_LOGIC)
  41.     SIGNAL sent, sentMatrix: std_logic;
  42.    
  43.  
  44. begin
  45.  
  46.     --TO DO 11 -> instancirati generički djelitelj frekvencije na način da od ulaznog singala takta kreira signal takta frekvencije 390 625 Hz
  47.    
  48.  
  49.     FSMSequential: process(clk_out, rst)
  50.     begin
  51.     --TO DO 12 -> ako je "rst" jednak 1, signalu "current_state" pridružiti vrijednost SSD
  52.         if(rst='1') then
  53.             current_state <= SSD;
  54.     --TO DO 13 -> u suprotnom, na rastući brid signala "clk_out", signalu "current_state" pridružiti vrijednost signala "next_state"
  55.         elsif(clk_out'event and clk_out='1') then
  56.             current_state <= next_state;
  57.         end if;
  58.     end process;
  59.  
  60.     process(current_state, wake, send_data, send_reg, sent, sentMatrix)
  61.     begin
  62.  
  63.         case current_state IS
  64.        
  65.     --TO DO 14 -> ako signal "current_state" ima vrijednost ShutDown, onda signalu "next_state" pridružiti vrijednost WakeState u slučaju da ulaz "wake" ima vrijednost 1, a u suprotnom mu pridružiti vrijednost ShutDown
  66.             when  ShutDown =>
  67.                 if(wake='1') then
  68.                     next_state <= WakeState;
  69.                 else
  70.                     next_state <= ShutDown;
  71.                 end if;
  72.     --TO DO 15 -> ako signal "current_state" ima vrijednost WakeState, onda signalu "next_state" pridružiti vrijednost NormalOP u slučaju da signal "sent" ima vrijednost 1, a u suprotnom mu pridružiti vrijednost WakeState           
  73.             when  WakeState=>
  74.                 if(sent='1') then
  75.                     next_state <= NormalOP;
  76.                 else
  77.                     next_state <= WakeState;
  78.                 end if;
  79.     --TO DO 16 -> ako signal "current_state" ima vrijednost SSD, onda signalu "next_state" pridružiti vrijednost ShutDown u slučaju da signal "sent" ima vrijednost 1, a u suprotnom mu pridružiti vrijednost SSD                       
  80.             when SSD =>
  81.                 if(sent='1') then
  82.                     next_state <= ShutDown;
  83.                 else
  84.                     next_state <= SSD;
  85.                 end if;        
  86.     --TO DO 17 -> ako signal "current_state" ima vrijednost NormalOP, onda signalu "next_state" pridružiti vrijednost SendReg (u slučaju da ulaz "send_reg" ima vrijednost 1), vrijednost SendData (u slučaju da ulaz "send_data"
  87.      --ima vrijednost 1), a u suprotnom mu pridružiti vrijednost NormalOP                             
  88.             when NormalOP =>
  89.                 if(send_reg='1') then
  90.                     next_state <= SendReg;
  91.                 elsif(send_data='1') then
  92.                     next_state <= SendData;
  93.                 else
  94.                     next_state <= NormalOP;
  95.                 end if;
  96.     --TO DO 18 -> ako signal "current_state" ima vrijednost SendReg, onda signalu "next_state" pridružiti vrijednost NormalOP u slučaju da signal "sent" ima vrijednost 1, a u suprotnom mu pridružiti vrijednost SendReg                                   
  97.             when  SendReg=>
  98.                 if(sent='1') then
  99.                     next_state <= NormalOP;
  100.                 else
  101.                     next_state <= SendReg;
  102.                 end if;
  103.     --TO DO 19 -> ako signal "current_state" ima vrijednost SendData, onda signalu "next_state" pridružiti vrijednost NormalOP u slučaju da signal "sentMatrix" ima vrijednost 1, a u suprotnom mu pridružiti vrijednost SendData                                               
  104.             when  SendData =>
  105.                 if(sentMatrix='1') then
  106.                     next_state <= NormalOP;
  107.                 else
  108.                     next_state <= SendData;
  109.                 end if;
  110.             end case;
  111.     end process;
  112.  
  113.     --TO DO 20 -> u listi osjetljivosti navesti signale "clk_out" i "rst"
  114.     setLoad: process(clk_out, rst)
  115.     begin
  116.     --TO DO 21 -> ako signal "rst" ima vrijednost 1, onda signalu "load" pridružiti vrijednost 0
  117.         if (rst='1') then
  118.             load <= '0';
  119.     --TO DO 22 -< u suprotnom, na rastući brid signala takta "clk_out", signalu "load" pridružiti vrijednost 1 (ako signal "sent" ima vrijednost 1), odnosno 0 (ako signal "sent" nema vrijednost 1)
  120.         elsif(clk_out'event and clk_out='1') then
  121.             if (sent='1') then
  122.                 load <= '1';
  123.             else
  124.                 load <= '0';
  125.             end if;
  126.         end if;
  127.     end process;
  128.  
  129.     SendProcess: process(rst, clk_out)
  130.     --TO DO 23 -> deklarirati varijable "counter_reg" i "counter_data" (integer) koje mogu poprimiti vrijednosti u rasponu od 0 do 16, odnosno 0 do 8
  131.     variable counter_reg: integer range 0 to 16;
  132.     variable counter_data: integer range 0 to 8;
  133.    
  134.     begin
  135.     --TO DO 24 -> ako ulaz "rst" ima vrijednost 1, onda signalima "sent" i "sentMatrix", izlazu "d_out" te varijablama "counter_reg" i "counter_data" pridružiti vrijednost 0
  136.         if(rst='1') then
  137.             sent <= '0';
  138.             sentMatrix <= '0';
  139.             d_out <= '0';
  140.             counter_reg := 0;
  141.             counter_data := 0;
  142.            
  143.         elsif(clk_out'event AND clk_out = '0') then
  144.        
  145.             case currentS IS
  146.     --TO DO 25 -> ako signal "current_state" ima vrijednost ShutDown onda signalu "sent" te varijablama "counter_reg" i "counter_data" pridružiti vrijednost 0
  147.                 when  ShutDown =>
  148.                     sent <= '0';
  149.                     counter_reg := 0;
  150.                     counter_data := 0;
  151.                    
  152.                 when WakeState =>
  153.                     --SEND: xxxx1100_xxxxxxx1
  154.     --TO DO 26 -> izlazu "d_out" pridružiti vrijednost bita s indeksom "counter_reg" u konstanti "wake_signal" te varijablu "counter_reg" povećati za 1
  155.                     d_out <= wake_signal(counter_reg);
  156.                     counter_reg := counter_reg + 1;
  157.                    
  158.     --TO DO 27 -> ako je "counter_reg" veći ili jendak 16, signalu "sent" pridružiti vrijednost 1, a varijabli "counter_reg" pridružiti vrijednost 0            
  159.                     if(counter_reg >= 16) then
  160.                         sent <= '1';
  161.                         counter_reg := 0;
  162.                     end if;
  163.                    
  164.                 when SSD =>
  165.                     --SEND: xxxx1100_xxxxxxx0
  166.     --TO DO 28 -> izlazu "d_out" pridružiti vrijednost bita s indeksom "counter_reg" u konstanti "shutDown_signal" te varijablu "counter_reg" povećati za 1
  167.                     d_out <= shutDown_signal(counter_reg);
  168.                     counter_reg := counter_reg + 1;
  169.                    
  170.     --TO DO 29 -> ako je "counter_reg" veći ili jendak 16, signalu "sent" pridružiti vrijednost 1, a varijabli "counter_reg" pridružiti vrijednost 0                
  171.                     if(counter_reg >= 16) then
  172.                         sent <= '1';
  173.                         counter_reg := 0;
  174.                     end if;                
  175.     --TO DO 30 -> ako signal "current_state" ima vrijednost NormalOP, signalima "sent" i "sentMatrix" te varijablama "counter_reg" i "counter_data" pridružiti vrijednost 0
  176.                 when  NormalOP =>
  177.                     sent <= '0';
  178.                     sentMatrix <= '0';
  179.                     counter_reg := 0;
  180.                     counter_data := 0;
  181.                    
  182.                    
  183.                 when SendReg =>
  184.                     -- SEND CNTRL_reg values
  185.     --TO DO 31 -> izlazu "d_out" pridružiti vrijednost bita s indeksom "counter_reg" u signalu "CNTRL_reg" te varijablu "counter_reg" povećati za 1
  186.                     d_out <= CNTRL_reg(counter_reg);
  187.                     counter_reg := counter_reg + 1;
  188.                    
  189.     --TO DO 32 -> ako je "counter_reg" veći ili jendak 16, signalu "sent" pridružiti vrijednost 1, a varijabli "counter_reg" pridružiti vrijednost 0            
  190.                     if(counter_reg >= 16) then
  191.                         sent <= '1';
  192.                         counter_reg := 0;
  193.                     end if;
  194.                    
  195.                 when SendData =>
  196.                     -- SEND decoded_data values
  197.     --TO DO 33 -> izlazu "d_out" pridružiti vrijednost bita s indeksom "counter_reg" u signalu "decoded_data" te varijablu "counter_reg" povećati za 1
  198.                     d_out <= decoded_data(counter_reg);
  199.                     counter_reg := counter_reg + 1;
  200.                    
  201.     --TO DO 34 -> ako je "counter_reg" veći ili jendak 16, signalu "sent" pridružiti vrijednost 1, varijabli "counter_reg" pridružiti vrijednost 0, a varijabli "counter_data" vrijednost povećati za 1            
  202.                     if(counter_reg >= 16) then
  203.                         sent <= '1';
  204.                         counter_reg := 0;
  205.                     else
  206.                         sent <= '0';
  207.                     end if;
  208.     --TO DO 35 -> ako je "counter_data" veći ili jendak 8, signalu "sentMatrix" pridružiti vrijednost 1, a varijabli "counter_data" pridružiti vrijednost 0             
  209.                     if(counter_data >= 8) then
  210.                         sentMatrix <= '1';
  211.                         counter_data := 0;
  212.                     end if;        
  213.                    
  214.             end case;      
  215.         end if;
  216.    
  217.     --TO DO 36 -> signalu "decode" pridružiti vrijednost varijable "counter_data"
  218.         decode <= counter_data;
  219.  
  220.     end process;
  221.    
  222.     --TO DO 37 -> u ovisnosti o vrijednosti signala "decode", signalu "decoded_data" pridružiti odgovarajuće vrijednosti
  223.     decoded_data <= "" & "" & data() when decode =  else
  224.                         "" & "" & data() when decode =  else
  225.                         "" & "" & data() when decode =  else
  226.                         "" & "" & data() when decode =  else
  227.                         "" & "" & data() when decode =  else
  228.                         "" & "" & data() when decode =  else
  229.                         "" & "" & data() when decode =  else
  230.                         "" & "" & data();
  231. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement