Advertisement
milanmetal

[VHDL] COUNTER 10-bit // UPDOWN, OVERFLOW, LOAD, CE, EN, VAL

Apr 27th, 2017
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 4.62 KB | None | 0 0
  1. ----------------------------------------------------------------------------------
  2. -- Company:
  3. -- Engineer:
  4. --
  5. -- Create Date:    18:42:11 04/27/2017
  6. -- Design Name:
  7. -- Module Name:    COUNTER10BIT - Behavioral
  8. ----    Zadatak 4:
  9. ----    Napisati VHDL model 10-bitnog obostranog brojača sa sledećim dodatnim ulaznim i
  10. ----    izlazni portovima:
  11. ----    • signal dozvole brojanja - en
  12. ----    • clock enable ulaz - ce
  13. ----    • indikator smera brojanja, u slučaju obostranog brojača - updown
  14. ----    • ulazni port dozvole upisa novog sadržaja u brojački registar - load
  15. ----    • ulazni port podataka za prosleđivanje nove vrednosti koje se želi upisati u
  16. ----    brojački registar - counter_value
  17. ----    • indikator prekoračenja opsega - overflow
  18. ----    Za tako napisani model brojača razviti i potrebno verifikaciono okruženje koje će
  19. ----    moći da se iskoristi za njegovu funkcionalnu verifikaciju.
  20. ----------------------------------------------------------------------------------
  21. library IEEE;
  22. use IEEE.STD_LOGIC_1164.ALL;
  23. use IEEE.STD_LOGIC_ARITH.ALL;
  24. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  25.  
  26.  
  27. entity COUNTER10BIT is
  28.     PORT(
  29.         CLK           :     in std_logic;
  30.         EN                :     in std_logic;
  31.         CE                :     in std_logic;
  32.         UPDOWN        :     in std_logic;   -- 0 kada je unapred, 1 kada je unazad
  33.                                                     -- sta god to INDIKATOR znacilo, napravio sam kao ULAZNI
  34.                                                     -- port, a ne bi bio problem ni da je izlazni i time stvarno bio
  35.                                                     -- INDIKATOR stanja, onda bi dodao port DIRECTION koji bi bio ULAZNI
  36.                                                     -- i npr kada je 1, BROJI UNAPRED, kada je 0, BROJI UNAZAD.
  37.         LOAD              : in std_logic;
  38.         COUNTER_VALUE :     in std_logic_vector(9 downto 0);
  39.         Q                 :     out std_logic_vector(9 downto 0);       -- izlaz
  40.         OVERFLOW          : out std_logic
  41.     );
  42. end COUNTER10BIT;
  43.  
  44. architecture Behavioral of COUNTER10BIT is
  45.     signal TEMP_DATA_s : std_logic_vector(9 downto 0) := (others => '0');
  46. begin
  47.     --COUNTER10BIT:
  48.     process(CLK)
  49.     begin
  50.         if(CLK'event and CLK = '1') then
  51.             OVERFLOW <= '0';
  52.            
  53.             if(LOAD = '1') then
  54.                 TEMP_DATA_s <= COUNTER_VALUE;
  55.             else
  56.                 if(EN = '1') then
  57.                     if(CE = '1') then
  58.                         -- 2 ** 10 - 1 = 1023 = 0b1111111111
  59.                         -- 2 ** 10 - 1 = 1023 = 0b1111111111
  60.                         -- 2 ** 10 - 1 = 1023 = 0b1111111111
  61.                         if(TEMP_DATA_s < conv_std_logic_vector(2 ** 10 - 1, 10)) then
  62.                             if(UPDOWN = '0') then
  63.                                 TEMP_DATA_s <= TEMP_DATA_s + '1';
  64.                             --else
  65.                             end if;
  66.                             if(UPDOWN = '1') then
  67.                                 TEMP_DATA_s <= TEMP_DATA_s - '1';
  68.                             end if;
  69.                         else
  70.                             OVERFLOW <= '1';
  71.                             TEMP_DATA_s <= conv_std_logic_vector(0, 10);
  72.                         end if;
  73.  
  74.                             -- Kada razdvojim na dve provjere za UPDOWN, onda nema WARNING koji kaze
  75.                             -- DA VECINA PORTOVA KOJE SAM DEKLARISAO U ENTITYJU NISU NIKADA ISKORISTENI!
  76.                             -- Warning se javljao jer KOMPAJLER prolazi kroz kod i pronalazi gdje je
  77.                             -- upotrebljen svaki od PORTOVA koji su navedeni, ako je neki port koristen
  78.                             -- unutar NEKOG USLOVA, i taj uslova NIKADA nije zadovoljen, KOMPAJLER nece ni uci unutra
  79.                             -- i na taj nacin nece znati da je taj PORT koristen, iako mu EKSPLICITNO u kodu kazes
  80.                             -- da koristis taj port koji javlja kao neiskoristen.
  81.                            
  82.                             --      ZAKOMENTARISANI KOD ISPOD TAKODJE RADI!
  83.                             --      ALI OVAJ NACIN ZAHTEVA NEPOTREBNO DUPLIRANJE KODA...
  84.                             --  PROBLEM JE BIO poredjenje NULE kao 10-bitnog podatka sa 1024 kao 10-bitnog podatka
  85.                             --  0       = 0b0000_0000_00
  86.                             --      1024    = 0b1_0000_0000_00 , conv_std_logic_vector(1024, 10) ce vratiti 10 bita nizeg prioriteta
  87.                             --  sto ce dati 10 nula, pa kada kazes 0 < 0,  dobijes FALSE, i nikada ne udjes u IF!
  88.                            
  89.                             --  UBIJE MI 2 SATA NA RJESAVANJE, ALI SADA ZNAM! UOPAA! In you' face, Xilinx!
  90.  
  91. ----------------------------------------------------------------------------------------
  92. --                          if(UPDOWN = '0') then
  93. --                              if(TEMP_DATA_s < conv_std_logic_vector(2 ** 10 - 1, 10)) then
  94. --                                  TEMP_DATA_s <= TEMP_DATA_s + '1';
  95. --                              else
  96. --                                  OVERFLOW <= '1';
  97. --                                  TEMP_DATA_s <= conv_std_logic_vector(0, 10);
  98. --                              end  if;
  99. --                          end if;
  100. --                         
  101. --                          if(UPDOWN = '1') then
  102. --                              if(TEMP_DATA_s < conv_std_logic_vector(2 ** 10 - 1, 10)) then
  103. --                                  TEMP_DATA_s <= TEMP_DATA_s - '1';
  104. --                              else
  105. --                                  OVERFLOW <= '1';
  106. --                                  TEMP_DATA_s <= conv_std_logic_vector(0, 10);
  107. --                              end  if;
  108. --                          end if;
  109. ----------------------------------------------------------------------------------------
  110.                        
  111.                     end if;
  112.                 end if;
  113.             end if;
  114.         end if;
  115.     end process;
  116.    
  117.     Q <= TEMP_DATA_s;               -- konacnu vrednost dodeljujem izlazu.
  118.    
  119. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement