Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
- use IEEE.NUMERIC_STD.all;
- entity lab is
- Port ( clk,rst, rx : in STD_LOGIC; -- rst är tryckknappen i mitten under displayen
- seg: out UNSIGNED(7 downto 0);
- an : out UNSIGNED (3 downto 0));
- end lab;
- architecture Behavioral of lab is
- component leddriver
- Port ( clk,rst : in STD_LOGIC;
- seg : out UNSIGNED(7 downto 0);
- an : out UNSIGNED (3 downto 0);
- value : in UNSIGNED (15 downto 0));
- end component;
- signal sreg : UNSIGNED(9 downto 0) := B"0_00000000_0"; -- 10 bit skiftregister
- signal tal : UNSIGNED(15 downto 0) := X"0000";
- signal rx1,rx2 : std_logic; -- vippor på insignalen
- signal sp : std_logic; -- skiftpuls
- signal run : std_logic; -- Bestäm om vi ska läsa in ett värde eller inte
- signal lp : std_logic; -- laddpuls
- signal pos : UNSIGNED(1 downto 0) := "00";
- signal bit_counter : UNSIGNED(9 downto 0) := "0000000000";
- signal state_counter : UNSIGNED(3 downto 0) := "0000";
- alias nya_talet: UNSIGNED(3 downto 0) is sreg(4 downto 1);
- alias pos0: UNSIGNED(3 downto 0) is tal(15 downto 12);
- alias pos1: UNSIGNED(3 downto 0) is tal(11 downto 8);
- alias pos2: UNSIGNED(3 downto 0) is tal(7 downto 4);
- alias pos3: UNSIGNED(3 downto 0) is tal(3 downto 0);
- begin
- -- vippor
- process(clk) begin
- if rising_edge(clk) then
- if rst = '1' then
- rx1 <= '1';
- rx2 <= '1';
- else
- rx1 <= rx;
- rx2 <= rx1;
- end if;
- end if;
- end process;
- -- skiftregister
- process(clk) begin
- if rising_edge(clk) then
- if rst = '1' then
- sreg <= "0000000000";
- elsif sp = '1' then
- sreg(9) <= rx2;
- sreg(8 downto 0) <= sreg(9 downto 1);
- --sp <= '0';
- else
- sreg <= sreg;
- end if;
- end if;
- end process;
- -- styrenhet
- process(clk) begin
- if rising_edge(clk) then
- if rst = '1' then
- bit_counter <= "0000000000";
- state_counter <= "0000";
- run <= '0';
- lp <= '0';
- sp <= '0';
- elsif run = '1' then
- if state_counter = 0 then --när state_counter == 10 har vi fått in hela talet
- lp <= '1';
- sp <= '0';
- run <= '0';
- --nya_talet <= sreg; --(4 downto 1); --Ger variabeln nya_talet värdet inläst
- elsif bit_counter = 0 then --När bit_counter har räknat färdigt
- sp <= '1';
- bit_counter <= "1101100100";
- state_counter <= state_counter - 1;
- else --Om inget av ovan ska den bara räkna ner bit_counter
- bit_counter <= bit_counter - 1;
- lp <= '0';
- sp <= '0';
- end if;
- elsif rx1 = '0' and rx2 = '1' then
- run <= '1';
- bit_counter <= "0110110010"; --Ger den värdet 434
- --bit_counter <= "0110110010" 434
- --bit_counter <= "1101100100" 868
- state_counter <= "1010"; --Ger den värdet 9
- else --Om inget av ovan ska programmet inte gör något
- run <= run;
- --Kanske sätta flera variabler till noll eller liknande
- --för att de inte ska ha konstiga värden
- end if;
- end if;
- end process;
- -- 2-bitsräknare
- process(clk) begin
- if rising_edge(clk) then
- if rst = '1' then
- pos <= "00";
- elsif lp = '1' then
- pos <= pos + 1; --Den borde slå över till 0 från 3 eftersom pos är bara två bitar
- --lp <= '0';
- else
- pos <= pos;
- end if;
- end if;
- end process;
- -- 16- bitsregister
- process(clk) begin
- if rising_edge(clk) then
- if rst = '1' then
- pos0 <= "0000";
- pos1 <= "0000";
- pos2 <= "0000";
- pos3 <= "0000";
- elsif lp = '1' then --Uppdatera tal bara då lp = 1
- if pos = "00" then
- pos0 <= nya_talet;
- elsif pos = "01" then
- pos1 <= nya_talet;
- elsif pos = "10" then
- pos2 <= nya_talet;
- elsif pos = "11" then
- pos3 <= nya_talet;
- else
- pos0 <= pos0;
- pos1 <= pos1;
- pos2 <= pos2;
- pos3 <= pos3;
- end if;
- else
- pos0 <= pos0;
- pos1 <= pos1;
- pos2 <= pos2;
- pos3 <= pos3;
- end if;
- end if;
- end process;
- -- *****************************
- -- * Multiplexad display *
- -- *****************************
- -- Inkoppling av komponenten leddriver
- led: leddriver port map (clk, rst, seg, an, tal);
- end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement