Advertisement
Awarty

Untitled

Feb 18th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 4.08 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(3 downto 0);
  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. -- vippor
  38. begin
  39.  
  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.         else
  61.             sreg <= sreg;
  62.         end if;
  63.     end if;
  64. end process;
  65.  
  66.  
  67. -- styrenhet
  68. process(clk) begin
  69.     if rising_edge then
  70.         if rst = '1' then
  71.             bit_counter <= "0000000000";
  72.             state_counter <= "0000";
  73.             run <= '0';
  74.             lp <= '0';
  75.             sp <= '0';
  76.         elsif run = '1' then
  77.             if state_counter = 10 then --när state_counter == 10 har vi fått in hela talet
  78.                 lp <= '1';
  79.                 sp <= '0';
  80.                 run <= '0';
  81.                 nya_talet <= sreg(4 downto 1); --Ger variabeln nya_talet värdet inläst  
  82.             elsif bit_counter < 0 then --bit_counter räknar ner från ett givet värde tills den blir negativ
  83.                 sp <= '1';
  84.                 bit_counter <= "1101100100"
  85.                 state_counter <= state_counter - 1;
  86.             else  --Om inget av ovan ska den bara räkna ner bit_counter
  87.                 bit_counter <= bit_counter - 1;
  88.                 lp <= '0';
  89.                 sp <= '0';
  90.             end if;
  91.         elsif rx1 = 0 and rx2 = 1 then
  92.             run <= '1';
  93.             bit_counter <= "0110110010"; --Ger den värdet 434
  94.             state_counter <= "1001"; --Ger den värdet 9
  95.         else --Om inget av ovan ska programmet inte gör något
  96.             run <= run;
  97.             --Kanske sätta flera variabler till noll eller liknande
  98.             --för att de inte ska ha konstiga värden
  99.         end if;
  100.     end if;
  101. end process;   
  102.        
  103.  
  104. -- 2-bitsräknare
  105. process(clk) begin
  106.     if rising_edge(clk) then
  107.         if rst = '1' then
  108.             pos <= "00";
  109.         elsif lp = '1' then
  110.             pos <= pos + 1; --Den borde slå över till 0 från 3 eftersom pos är bara två bitar
  111.         else
  112.             pos <= pos;
  113.         end if;
  114.     end if;
  115. end process;
  116.  
  117.  
  118. -- 16- bitsregister
  119. process(clk) begin
  120.     if rising_edge(clk) then
  121.         if rst = '1' then
  122.             pos0 <= "0000";
  123.             pos1 <= "0000";
  124.             pos2 <= "0000";
  125.             pos3 <= "0000";
  126.         elsif lp = '1' then --Uppdatera tal bara då lp = 1
  127.             if pos = "00" then
  128.                 pos0 <= nya_talet;
  129.             elsif pos = "01" then
  130.                 pos1 <= nya_talet;
  131.             elsif pos = "10" then
  132.                 pos2 <= nya_talet;
  133.             elsif pos = "11" then
  134.                 pos3 <= nya_talet;
  135.             else
  136.                 pos0 <= pos0;
  137.                 pos1 <= pos1;
  138.                 pos2 <= pos2;
  139.                 pos3 <= pos3;
  140.         else
  141.             pos0 <= pos0;
  142.             pos1 <= pos1;
  143.             pos2 <= pos2;
  144.             pos3 <= pos3;
  145.         end if;
  146.     end if;
  147. end process;
  148.  
  149.   -- *****************************
  150.   -- * Multiplexad display       *
  151.   -- *****************************
  152.   -- Inkoppling av komponenten leddriver
  153.   led: leddriver port map (clk, rst, seg, an, tal);
  154.  
  155. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement