Advertisement
felixen98

Lab 3 - Typ klar

Feb 19th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 4.17 KB | None | 0 0
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.NUMERIC_STD.all;
  4.  
  5.  
  6. entity lab is
  7.     Port ( clk,rst, rx : in  STD_LOGIC;    -- rst är tryckknappen i mitten under displayen
  8.            seg: out  UNSIGNED(7 downto 0);
  9.            an : out  UNSIGNED (3 downto 0));
  10. end lab;
  11.  
  12. architecture Behavioral of lab is
  13.  
  14.   component leddriver
  15.     Port ( clk,rst : in  STD_LOGIC;
  16.            seg : out  UNSIGNED(7 downto 0);
  17.            an : out  UNSIGNED (3 downto 0);
  18.            value : in  UNSIGNED (15 downto 0));
  19.   end component;
  20.  
  21.     signal sreg : UNSIGNED(9 downto 0) := B"0_00000000_0";  -- 10 bit skiftregister
  22.     signal tal : UNSIGNED(15 downto 0) := X"0000";
  23.     signal rx1,rx2 : std_logic;         -- vippor på insignalen
  24.     signal sp : std_logic;              -- skiftpuls
  25.     signal run : std_logic;             -- Bestäm om vi ska läsa in ett värde eller inte
  26.     signal lp : std_logic;              -- laddpuls
  27.     signal pos : UNSIGNED(1 downto 0) := "00";
  28.     signal bit_counter : UNSIGNED(9 downto 0) := "0000000000";
  29.     signal state_counter : UNSIGNED(3 downto 0) := "0000";
  30.     alias nya_talet: UNSIGNED(3 downto 0) is sreg(4 downto 1);
  31.     alias pos0: UNSIGNED(3 downto 0) is tal(15 downto 12);
  32.     alias pos1: UNSIGNED(3 downto 0) is tal(11 downto 8);
  33.     alias pos2: UNSIGNED(3 downto 0) is tal(7 downto 4);
  34.     alias pos3: UNSIGNED(3 downto 0) is tal(3 downto 0);
  35.  
  36.    
  37. begin
  38.  
  39. -- vippor
  40. process(clk) begin
  41.     if rising_edge(clk) then
  42.         if rst = '1' then
  43.             rx1 <= '1';
  44.             rx2 <= '1';
  45.         else
  46.             rx1 <= rx;
  47.             rx2 <= rx1;
  48.         end if;
  49.     end if;
  50. end process;
  51.  
  52. -- skiftregister
  53. process(clk) begin
  54.     if rising_edge(clk) then
  55.         if rst = '1' then
  56.             sreg <= "0000000000";
  57.         elsif sp = '1' then
  58.             sreg(9) <= rx2;
  59.             sreg(8 downto 0) <= sreg(9 downto 1);
  60.             --sp <= '0';
  61.         else
  62.             sreg <= sreg;
  63.         end if;
  64.     end if;
  65. end process;
  66.  
  67.  
  68. -- styrenhet
  69. process(clk) begin
  70.     if rising_edge(clk) then
  71.         if rst = '1' then
  72.             bit_counter <= "0000000000";
  73.             state_counter <= "0000";
  74.             run <= '0';
  75.             lp <= '0';
  76.             sp <= '0';
  77.         elsif run = '1' then
  78.             if state_counter = 0 then --när state_counter == 10 har vi fått in hela talet
  79.                 lp <= '1';
  80.                 sp <= '0';
  81.                 run <= '0';
  82.                 --nya_talet <= sreg; --(4 downto 1); --Ger variabeln nya_talet värdet inläst  
  83.             elsif bit_counter = 0 then --När bit_counter har räknat färdigt
  84.                 sp <= '1';
  85.                 bit_counter <= "1101100100";
  86.                 state_counter <= state_counter - 1;
  87.             else  --Om inget av ovan ska den bara räkna ner bit_counter
  88.                 bit_counter <= bit_counter - 1;
  89.                 lp <= '0';
  90.                 sp <= '0';
  91.             end if;
  92.         elsif rx1 = '0' and rx2 = '1' then
  93.             run <= '1';
  94.             bit_counter <= "0110110010"; --Ger den värdet 434
  95.             --bit_counter <= "0110110010" 434
  96.             --bit_counter <= "1101100100" 868
  97.             state_counter <= "1010"; --Ger den värdet 9
  98.         else --Om inget av ovan ska programmet inte gör något
  99.             run <= run;
  100.             --Kanske sätta flera variabler till noll eller liknande
  101.             --för att de inte ska ha konstiga värden
  102.         end if;
  103.     end if;
  104. end process;   
  105.        
  106.  
  107. -- 2-bitsräknare
  108. process(clk) begin
  109.     if rising_edge(clk) then
  110.         if rst = '1' then
  111.             pos <= "00";
  112.         elsif lp = '1' then
  113.             pos <= pos + 1; --Den borde slå över till 0 från 3 eftersom pos är bara två bitar
  114.             --lp <= '0';
  115.         else
  116.             pos <= pos;
  117.         end if;
  118.     end if;
  119. end process;
  120.  
  121.  
  122. -- 16- bitsregister
  123. process(clk) begin
  124.     if rising_edge(clk) then
  125.         if rst = '1' then
  126.             pos0 <= "0000";
  127.             pos1 <= "0000";
  128.             pos2 <= "0000";
  129.             pos3 <= "0000";
  130.         elsif lp = '1' then --Uppdatera tal bara då lp = 1
  131.             if pos = "00" then
  132.                 pos0 <= nya_talet;
  133.             elsif pos = "01" then
  134.                 pos1 <= nya_talet;
  135.             elsif pos = "10" then
  136.                 pos2 <= nya_talet;
  137.             elsif pos = "11" then
  138.                 pos3 <= nya_talet;
  139.             else
  140.                 pos0 <= pos0;
  141.                 pos1 <= pos1;
  142.                 pos2 <= pos2;
  143.                 pos3 <= pos3;
  144.             end if;
  145.         else
  146.             pos0 <= pos0;
  147.             pos1 <= pos1;
  148.             pos2 <= pos2;
  149.             pos3 <= pos3;
  150.         end if;
  151.     end if;
  152. end process;
  153.  
  154.   -- *****************************
  155.   -- * Multiplexad display       *
  156.   -- *****************************
  157.   -- Inkoppling av komponenten leddriver
  158.   led: leddriver port map (clk, rst, seg, an, tal);
  159.  
  160. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement