Laboratorium

Materiały do laboratorium TEC dla studiów dziennych.

Lab. 1 | Lab. 2 | Lab. 3 | Lab. 4 | Lab. 5 | Lab. 6 | Lab. 7 | Lab. 8 | Lab. 9 | Lab. 10


Laboratorium 1. Wprowadzenie do systemów Quartus i ModelSim

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity bramka is
  5. port
  6. (
  7. -- Input ports
  8. a : in std_logic;
  9. b : in std_logic;
  10. c : in std_logic;
  11. -- Output ports
  12. y : out std_logic
  13. );
  14. end bramka;
  15.  
  16. architecture arch_bramka of bramka is
  17. begin
  18.  
  19. y <= a xor b xor c;
  20.  
  21. end arch_bramka;

Skrypt testujący test.do - wywołanie w Modelsim:

  1. do test.do
  1. restart
  2. add wave *
  3. run
  4. force a 0 0
  5. force b 0 0
  6. force c 0 0
  7. run
  8. force a 0 0
  9. force b 0 0
  10. force c 1 0
  11. run
  12. force a 0 0
  13. force b 1 0
  14. force c 0 0
  15. run
  16. force a 0 0
  17. force b 1 0
  18. force c 1 0
  19. run
  20. force a 1 0
  21. force b 0 0
  22. force c 0 0
  23. run
  24. force a 1 0
  25. force b 0 0
  26. force c 1 0
  27. run
  28. force a 1 0
  29. force b 1 0
  30. force c 0 0
  31. run
  32. force a 1 0
  33. force b 1 0
  34. force c 1 0
  35. run

Skrypt testujący - wersja 2.

  1. restart
  2. add wave *
  3. run
  4. force c 0 0, 1 {100 ps} -r 200
  5. force b 0 0, 1 {200 ps} -r 400
  6. force a 0 0, 1 {400 ps} -r 800
  7. run 800

w górę


Laboratorium 2. Instrukcje współbieżne

Multiplekser bitowy 2:1

mux2:1

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity mux is
  5. port(
  6. a, b : in std_logic;
  7. s : in std_logic;
  8. y : out std_logic
  9. );
  10. end mux;
  11.  
  12. -- przypisanie podstawowe - concurrent signal assigment
  13. architecture arch_mux1 of mux is
  14. begin
  15. y <= (a and not(s)) or (b and s);
  16. end arch_mux1;
  17.  
  18. -- przypisanie warunkowe - conditional signal assigment
  19. architecture arch_mux2 of mux is
  20. begin
  21. with s select
  22. y <= a when '0',
  23. b when others;
  24. end arch_mux2;
  25.  
  26. -- przypisanie selektywne - selected signal assigment
  27. architecture arch_mux3 of mux is
  28. begin
  29. y <= a when (s = '0') else
  30. b;
  31. end arch_mux3;

Multiplekser bitowy 4:1

mux4:1

  1. entity mux is
  2. port(
  3. a, b, c, d : in std_logic;
  4. s : in std_logic_vector(1 downto 0);
  5. y : out std_logic
  6. );
  7. end mux;
  8.  
  9. -- przypisanie podstawowe - concurrent signal assigment
  10. architecture arch_mux1 of mux is
  11. begin
  12. y <= (a and not(s(1)) and not(s(0)))
  13. or (b and not(s(1)) and s(0))
  14. or (c and s(1) and not(s(0)))
  15. or (d and s(1) and s(0));
  16. end arch_mux1;
  17.  
  18. -- przypisanie warunkowe - conditional signal assigment
  19. architecture arch_mux2 of mux is
  20. begin
  21. with s select
  22. y <= a when "00",
  23. b when "01",
  24. c when "10",
  25. d when others;
  26. end arch_mux2;
  27.  
  28. -- przypisanie selektywne - selected signal assigment
  29. architecture arch_mux3 of mux is
  30. begin
  31. y <= a when (s = "00") else
  32. b when (s = "01") else
  33. c when (s = "10") else
  34. d;
  35. end arch_mux3;

Multiplekser grupowy 4:1

mux4:1

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity mux is
  5. generic(
  6. n : integer := 4
  7. );
  8. port(
  9. a, b, c, d : in std_logic_vector(n-1 downto 0);
  10. s : in std_logic_vector(1 downto 0);
  11. y : out std_logic_vector(n-1 downto 0)
  12. );
  13. end mux;
  14.  
  15. -- przypisanie podstawowe - concurrent signal assigment
  16. architecture arch_mux1 of mux is
  17. begin
  18. y(0) <= (a(0) and not(s(1)) and not(s(0)))
  19. or (b(0) and not(s(1)) and s(0))
  20. or (c(0) and s(1) and not(s(0)))
  21. or (d(0) and s(1) and s(0));
  22. y(1) <= (a(1) and not(s(1)) and not(s(0)))
  23. or (b(1) and not(s(1)) and s(0))
  24. or (c(1) and s(1) and not(s(0)))
  25. or (d(1) and s(1) and s(0));
  26. y(2) <= (a(2) and not(s(1)) and not(s(0)))
  27. or (b(2) and not(s(1)) and s(0))
  28. or (c(2) and s(1) and not(s(0)))
  29. or (d(2) and s(1) and s(0));
  30. y(3) <= (a(3) and not(s(1)) and not(s(0)))
  31. or (b(3) and not(s(1)) and s(0))
  32. or (c(3) and s(1) and not(s(0)))
  33. or (d(3) and s(1) and s(0));
  34. end arch_mux1;
  35.  
  36. -- przypisanie warunkowe - conditional signal assigment
  37. architecture arch_mux2 of mux is
  38. begin
  39. with s select
  40. y <= a when "00",
  41. b when "01",
  42. c when "10",
  43. d when others;
  44. end arch_mux2;
  45.  
  46. -- przypisanie selektywne - selected signal assigment
  47. architecture arch_mux3 of mux is
  48. begin
  49. y <= a when (s = "00") else
  50. b when (s = "01") else
  51. c when (s = "10") else
  52. d;
  53. end arch_mux3;

Komparator, opis bloku na stronie 42 dokumentu

komparator

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity komparator is
  5. generic(
  6. n: integer := 4
  7. );
  8. port(
  9. a, b : in std_logic_vector(n-1 downto 0);
  10. aeqb, agtb, altb : out std_logic
  11. );
  12. end komparator;
  13.  
  14. -- z uzyciem operatorow relacji
  15. architecture komp1 of komparator is
  16. begin
  17. aeqb <= '1' when a = b else '0';
  18. agtb <= '1' when a > b else '0';
  19. altb <= '1' when a < b else '0';
  20. end komp1;
  21.  
  22. -- z uzyciem instrukcji przypisania
  23. architecture komp2 of komparator is
  24. signal i : std_logic_vector(n-1 downto 0);
  25. signal aequalb, agreaterb : std_logic;
  26. begin
  27. i(3) <= not (a(3) xor b(3));
  28. i(2) <= not (a(2) xor b(2));
  29. i(1) <= not (a(1) xor b(1));
  30. i(0) <= not (a(0) xor b(0));
  31.  
  32. aequalb <= i(3) and i(2) and i(1) and i(0);
  33. agreaterb <= (a(3) and (not b(3)))
  34. or (i(3) and a(2) and (not b(2)))
  35. or (i(3) and i(2) and a(1) and (not b(1)))
  36. or (i(3) and i(2) and i(1) and a(0) and (not b(0)));
  37.  
  38. altb <= not (aequalb or agreaterb);
  39. aeqb <= aequalb;
  40. agtb <= agreaterb;
  41. end komp2;

w górę


Laboratorium 3. Projekt hierarchiczny
Plik dmux_2.vhd:

  1. -- demultiplekser grupowy 1:2
  2. library ieee;
  3. use ieee.std_logic_1164.all;
  4.  
  5. entity dmux_2 is
  6. generic(
  7. m : integer := 8
  8. );
  9. port(
  10. a : in std_logic_vector(m-1 downto 0);
  11. s : in std_logic;
  12. y0, y1 : out std_logic_vector(m-1 downto 0)
  13. );
  14. end entity;
  15.  
  16. architecture arch_dmux of dmux_2 is
  17. begin
  18. y0 <= a when s='0' else (others => '0');
  19. y1 <= a when s='1' else (others => '0');
  20. end arch_dmux;

Skrypt testujący:

  1. restart
  2. add wave -radix unsigned *
  3. run
  4. force a 10#100 0
  5. force s 0 0
  6. run
  7. force s 1 0
  8. run

Plik dmux.vhd:

  1. -- demultiplekser grupowy 1:4 z komponentów 1:2
  2. library ieee;
  3. use ieee.std_logic_1164.all;
  4.  
  5. entity dmux is
  6. generic(
  7. m : integer := 4
  8. );
  9. port(
  10. a : in std_logic_vector(m-1 downto 0);
  11. s : in std_logic_vector(1 downto 0);
  12. y0, y1, y2, y3 : out std_logic_vector(m-1 downto 0)
  13. );
  14. end entity;
  15.  
  16. architecture arch_dmux of dmux is
  17.  
  18. component dmux_2 is
  19. generic(
  20. m : integer := 8
  21. );
  22. port(
  23. a : in std_logic_vector(m-1 downto 0);
  24. s : in std_logic;
  25. y0, y1 : out std_logic_vector(m-1 downto 0)
  26. );
  27. end component;
  28.  
  29. signal temp0, temp1 : std_logic_vector(m-1 downto 0);
  30.  
  31. begin
  32. -- y0 <= a when s="00" else (others => '0');
  33. -- y1 <= a when s="01" else (others => '0');
  34. -- y2 <= a when s="10" else (others => '0');
  35. -- y3 <= a when s="11" else (others => '0');
  36.  
  37. d1 : dmux_2
  38. generic map( m => m )
  39. port map(
  40. a => a,
  41. s => s(1),
  42. y0 => temp0,
  43. y1 => temp1
  44. );
  45. d2 : dmux_2
  46. generic map( m => m )
  47. port map(
  48. a => temp0,
  49. s => s(0),
  50. y0 => y0,
  51. y1 => y1
  52. );
  53. d3 : dmux_2
  54. generic map( m => m )
  55. port map(
  56. a => temp1,
  57. s => s(0),
  58. y0 => y2,
  59. y1 => y3
  60. );
  61. end arch_dmux;

Skrypt testujący:

  1. restart
  2. add wave -radix unsigned *
  3. run
  4. force a 10#100
  5. force s 00 0
  6. run
  7. force s 01 0
  8. run
  9. force s 10 0
  10. run
  11. force s 11 0
  12. run

Zadanie: zbudować sumator kaskadowy z komponentów 1-bitowych
Plik sum_1_bit.vhd

  1. library ieee ;
  2. use ieee.std_logic_1164.all ;
  3.  
  4. entity sum_1_bit is
  5. port (
  6. a, b, cin : in std_logic;
  7. y, cout : out std_logic
  8. );
  9. end sum_1_bit ;
  10.  
  11. architecture arch_sum of sum_1_bit is
  12. begin
  13. y <= a xor b xor cin;
  14. cout <= (a and b) or (a and cin) or (b and cin);
  15. end arch_sum;

Plik adder.vhd

  1. library ieee ;
  2. use ieee.std_logic_1164.all ;
  3.  
  4. entity adder is
  5. generic(
  6. n : integer := 4
  7. );
  8. port (
  9. a, b : in std_logic_vector(n-1 downto 0);
  10. cin : in std_logic;
  11. y : out std_logic_vector(n downto 0)
  12. );
  13. end entity;
  14.  
  15. architecture arch_sum of adder is
  16.  
  17. component sum_1_bit is
  18. port (
  19. a, b, cin : in std_logic;
  20. y, cout : out std_logic
  21. );
  22. end component;
  23.  
  24. signal c_temp : std_logic_vector(n-1 downto 0);
  25.  
  26. begin
  27. s0 : sum_1_bit port map(
  28. a => a(0),
  29. b => b(0),
  30. cin => '0',
  31. y => y(0),
  32. cout => c_temp(0)
  33. );
  34. s1 : sum_1_bit port map(
  35. a => a(1),
  36. b => b(1),
  37. cin => c_temp(0),
  38. y => y(1),
  39. cout => c_temp(1)
  40. );
  41. s2 : sum_1_bit port map(
  42. a => a(2),
  43. b => b(2),
  44. cin => c_temp(1),
  45. y => y(2),
  46. cout => c_temp(2)
  47. );
  48. s3 : sum_1_bit port map(
  49. a => a(3),
  50. b => b(3),
  51. cin => c_temp(2),
  52. y => y(3),
  53. cout => c_temp(3)
  54. );
  55.  
  56. y(4) <= c_temp(3);
  57. end arch_sum;

Skrypt testujący:

  1. restart
  2. add wave -radix unsigned *
  3. run
  4. force a 1001 0
  5. force b 0110 0
  6. run
  7. force b 0111 0
  8. run

w górę


Laboratorium 4. Blok sekwencyjny process, konfiguracja bloków, pakiet

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity mux is
  5. generic(
  6. n : integer := 4
  7. );
  8. port(
  9. a, b, c, d : in std_logic_vector(n-1 downto 0);
  10. s : in std_logic_vector(1 downto 0);
  11. y : out std_logic_vector(n-1 downto 0)
  12. );
  13. end mux;
  14.  
  15. -- przypisanie podstawowe - concurrent signal assigment
  16. architecture arch_mux1 of mux is
  17. begin
  18. [..]
  19. end arch_mux1;
  20.  
  21. -- przypisanie warunkowe - conditional signal assigment
  22. architecture arch_mux2 of mux is
  23. begin
  24. [..]
  25. end arch_mux2;
  26.  
  27. -- przypisanie selektywne - selected signal assigment
  28. architecture arch_mux3 of mux is
  29. begin
  30. [..]
  31. end arch_mux3;
  32.  
  33. -- przypisanie sekwencyjne - if
  34. architecture arch_mux4 of mux is
  35. begin
  36. pr_if: process(a,b,c,d,s) -- lista czulosci/wrazliwosci
  37. begin
  38. if s = "00" then
  39. y <= a;
  40. elsif s = "01" then
  41. y <= b;
  42. elsif s = "10" then
  43. -- y <= (others => '0');
  44. y <= c; -- wazna kolejnosc wykonania!
  45. -- y <= (others => '0'); -- co jesli odkomentujemy?
  46. else
  47. y <= d;
  48. end if;
  49. end process;
  50. end arch_mux4;
  51.  
  52. -- przypisanie sekwencyjne - case
  53. architecture arch_mux5 of mux is
  54. begin
  55. pr_case: process(a,b,c,d,s)
  56. begin
  57. case s is
  58. when "00" => y <= a;
  59. when "01" => y <= b;
  60. when "10" => y <= c;
  61. when others => y <= d;
  62. end case;
  63. end process;
  64. end arch_mux5;
  65.  
  66. -- przypisanie sekwencyjne - if z pamiecia latch
  67. architecture arch_mux6 of mux is
  68. begin
  69. pr_if: process(a,b,c,d,s)
  70. begin
  71. y <= (others => '0'); -- latch jesli zakomentujemy, dlaczego?
  72. if s = "00" then
  73. y <= a;
  74. end if;
  75. if s = "01" then
  76. y <= b;
  77. end if;
  78. if s = "10" then
  79. y <= c;
  80. end if;
  81. if s = "11" then
  82. y <= d;
  83. end if;
  84. end process;
  85. end arch_mux6;
  86.  
  87. -- przypisanie sekwencyjne - if ... else
  88. architecture arch_mux7 of mux is
  89. begin
  90. pr_if: process(a,b,c,d,s)
  91. begin
  92. -- dlaczego dopelnienie warunkow przez else nie zadziala?
  93. if s = "00" then
  94. y <= a;
  95. else
  96. y <= (others => '0');
  97. end if;
  98. if s = "01" then
  99. y <= b;
  100. else
  101. y <= (others => '0');
  102. end if;
  103. if s = "10" then
  104. y <= c;
  105. else
  106. y <= (others => '0');
  107. end if;
  108. if s = "11" then
  109. y <= d;
  110. else
  111. y <= (others => '0');
  112. end if;
  113. end process;
  114. end arch_mux7;
  115.  
  116. -- zasieg konfiguracji lokalny
  117. -- w narzedziu Quartus2: Tools>Netlist Viewer>RTL Viewer - sprawdzic realizacje dla roznych arch
  118. configuration cfg of mux is -- blok konfigurujacy
  119. for arch_mux1
  120. end for;
  121. end cfg;
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. library work;
  4. use work.mux_package.all;
  5.  
  6. entity mux4 is
  7. generic(
  8. n : integer := 4
  9. );
  10. port(
  11. a, b, c, d : in std_logic_vector(n-1 downto 0);
  12. s : in std_logic_vector(1 downto 0);
  13. y : out std_logic_vector(n-1 downto 0)
  14. );
  15. end mux4;
  16.  
  17. -- przypisanie podstawowe - concurrent signal assigment
  18. architecture arch_mux4 of mux4 is
  19. -- przeniesienie deklaracji komponentu do pakietu
  20. --component mux
  21. -- port(
  22. -- a, b : in std_logic;
  23. -- s : in std_logic;
  24. -- y : out std_logic
  25. -- );
  26. --end component;
  27.  
  28. -- konfiguracja architektury dla bloku b1
  29. for b1 : mux use entity work.mux(arch_mux6);
  30. begin
  31. b1: mux generic map (n => n) port map(a => a, b => b, c => c, d => d, s => s, y => y);
  32. end arch_mux4;

Można też tak...

  1. -- konfiguracja architektury dla bloku b1
  2. -- for b1 : mux use entity work.mux(arch_mux6);
  3. begin
  4. b1: work.mux(arch_mux5) generic map (n => n) port map(a => a, b => b, c => c, d => d, s => s, y => y);
  5. end arch_mux4;
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. package mux_package is
  5.  
  6. -- deklaracje komponentow
  7. component mux
  8. generic(
  9. n : integer := 4
  10. );
  11. port(
  12. a, b, c, d : in std_logic_vector(n-1 downto 0);
  13. s : in std_logic_vector(1 downto 0);
  14. y : out std_logic_vector(n-1 downto 0)
  15. );
  16. end component;
  17. end mux_package;

Zadanie: korzystając z powyższych kodów, zrealizować mux8:1 wykorzystując dwa mux4:1 i jeden mux2:1, gdzie dla bloku b1 realizację arch_mux5 (proces z case), dla bloku b2 realizację arch_mux6 (proces z if), i dla bloku b3 dowolną realizację.
zadanie4

w górę


Laboratorium 5. Rejestr z sygnałem reset asynchronicznym lub synchronicznym

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity cw5_1 is
  5. generic(
  6. n : integer := 8
  7. );
  8. port(
  9. clk : in std_logic;
  10. reset : in std_logic;
  11. data : in std_logic_vector (n-1 downto 0);
  12. result : out std_logic_vector (n-1 downto 0)
  13. );
  14. end cw5_1;
  15.  
  16. architecture arch of cw5_1 is
  17. signal q_reg, q_next : std_logic_vector (n-1 downto 0);
  18. begin
  19. -- opis rejestru z resetem asynchronicznym
  20. process (clk, reset)
  21. begin
  22. if (reset = '1') then
  23. q_reg <= (others => '0');
  24. elsif rising_edge(clk) then
  25. q_reg <= q_next;
  26. end if;
  27. end process;
  28.  
  29. -- opis logiki wejsciowej
  30. q_next <= data;
  31.  
  32. -- opis logiki wyjsciowej
  33. result <= q_reg;
  34. end arch;

  1. restart
  2. add wave -radix unsigned *
  3. run
  4. force clk 0 0, 1 {100 ps} -r 200
  5. force data 10#222 0
  6. run
  7. force reset 0 0
  8. run
  9. force reset 1 0
  10. run
  11. run
  12. force reset 0 0
  13. run 400

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity cw5_2 is
  5. generic(
  6. n : integer := 8
  7. );
  8. port(
  9. clk : in std_logic;
  10. reset : in std_logic;
  11. data : in std_logic_vector (n-1 downto 0);
  12. result : out std_logic_vector (n-1 downto 0)
  13. );
  14. end cw5_2;
  15.  
  16. architecture arch of cw5_2 is
  17. signal q_reg, q_next : std_logic_vector (n-1 downto 0);
  18. begin
  19. -- opis rejestru z resetem synchronicznym
  20. process (clk)
  21. begin
  22. if rising_edge(clk) then
  23. q_reg <= q_next;
  24. end if;
  25. end process;
  26.  
  27. -- opis logiki wejsciowej
  28. q_next <= (others => '0') when (reset = '1')
  29. else data;
  30.  
  31. -- opis logiki wyjsciowej
  32. result <= q_reg;
  33. end arch;

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. entity cw5_3 is
  6. generic(
  7. n : integer := 8
  8. );
  9. port(
  10. clk : in std_logic;
  11. load : in std_logic;
  12. data : in std_logic_vector (n-1 downto 0);
  13. par : out std_logic;
  14. result : out std_logic_vector (n-1 downto 0)
  15. );
  16. end cw5_3;
  17.  
  18. architecture arch of cw5_3 is
  19. signal q_reg, q_next : std_logic_vector (n-1 downto 0);
  20. begin
  21. -- opis rejestru z funkcja load i liczeniem +1
  22. process (clk)
  23. begin
  24. if rising_edge(clk) then
  25. q_reg <= q_next;
  26. end if;
  27. end process;
  28.  
  29. -- opis logiki wejsciowej
  30. --q_next <= data when (load = '1')
  31. -- else std_logic_vector(unsigned(q_reg) + 1);
  32. process(load, q_reg, data)
  33. begin
  34. if(load ='1') then
  35. q_next <= data; -- load
  36. else
  37. q_next <= std_logic_vector(unsigned(q_reg) + 1); -- +1
  38. end if;
  39. end process;
  40.  
  41. -- opis logiki wyjsciowej
  42. result <= q_reg;
  43. par <= not(q_reg(0)); -- sprawdzanie parzystosci
  44. end arch;

Zadanie: realizacja układu kombinacyjnego w wersji współbieżnej i/lub sekwencyjnej (process).

w górę


Laboratorium 6. Realizacja automatu Moore'a i Mealy'ego

  1. -- patrz: przyklad automatu z
  2. -- http:// rawski.zpt.tele.pw.edu.pl/pl/system/files/Realizacji_logiki_sekwencyjnej.pdf
  3. --
  4. library ieee;
  5. use ieee.std_logic_1164.all;
  6.  
  7. entity aut is
  8. port(
  9. serial : in std_logic;
  10. clk, reset : in std_logic;
  11. found, busy : out std_logic
  12. );
  13. end aut;
  14.  
  15. -- dekoder sekwencji 011
  16. -- automatyczne kodowanie stanow, wielosegmentowy opis
  17. architecture arch_aut1 of aut is
  18. type state_type is (s1,s2,s3);
  19. -- kodowanie uzytkownika : START
  20. --attribute ENUM_ENCODING: STRING; -- mozna wymusic kodowanie, nie zawsze mozliwe w realizacji - patrz: symulacja
  21. --attribute ENUM_ENCODING of STATE_TYPE:type is "00 10 11"; -- zaleca sie pozostawienie kodowania przez system
  22. -- kodowanie uzytkownika : KONIEC
  23. signal state_reg, state_next : state_type;
  24. begin
  25. -- rejest automatu
  26. process(clk, reset)
  27. begin
  28. if(reset = '1') then
  29. state_reg <= s1;
  30. elsif rising_edge(clk) then
  31. state_reg <= state_next;
  32. end if;
  33. end process;
  34. -- blok kombinacyjny opisujacy przejscia automatu
  35. process(serial, state_reg)
  36. begin
  37. case state_reg is
  38. when s1 =>
  39. if(serial = '1') then
  40. state_next <= s1;
  41. else
  42. state_next <= s2;
  43. end if;
  44. when s2 =>
  45. if(serial = '1') then
  46. state_next <= s3;
  47. else
  48. state_next <= s2;
  49. end if;
  50. when s3 =>
  51. if(serial = '1') then
  52. state_next <= s1;
  53. else
  54. state_next <= s2;
  55. end if;
  56. end case;
  57. end process;
  58. -- wyjscia automatu Moore'a
  59. process(state_reg)
  60. begin
  61. case state_reg is
  62. when s1 =>
  63. busy <= '0';
  64. when s2 =>
  65. busy <= '1';
  66. when s3 =>
  67. busy <= '1';
  68. end case;
  69. end process;
  70. -- wyjscia automatu Mealy'ego
  71. process(state_reg,serial)
  72. begin
  73. if((state_reg = s3) and (serial = '1')) then
  74. found <= '1';
  75. else
  76. found <= '0';
  77. end if;
  78. end process;
  79. end arch_aut1;
  80.  
  81. -- dekoder sekwencji 011
  82. -- kodowanie stanow, dwusegmentowy opis
  83. architecture arch_aut2 of aut is
  84. constant s1 : std_logic_vector(1 downto 0) := "00";
  85. constant s2 : std_logic_vector(1 downto 0) := "10";
  86. constant s3 : std_logic_vector(1 downto 0) := "11";
  87. signal state_reg, state_next : std_logic_vector(1 downto 0);
  88. begin
  89. -- rejest automatu
  90. process(clk, reset)
  91. begin
  92. if(reset = '1') then
  93. state_reg <= s1;
  94. elsif rising_edge(clk) then
  95. state_reg <= state_next;
  96. end if;
  97. end process;
  98. -- blok kombinacyjny opisujacy przejscia automatu
  99. process(serial, state_reg)
  100. begin
  101. busy <= '0';
  102. found <= '0';
  103. case state_reg is
  104. when s1 =>
  105. if(serial = '1') then
  106. state_next <= s1;
  107. else
  108. state_next <= s2;
  109. end if;
  110. when s2 =>
  111. busy <= '1';
  112. if(serial = '1') then
  113. state_next <= s3;
  114. else
  115. state_next <= s2;
  116. end if;
  117. when s3 =>
  118. busy <= '1';
  119. if(serial = '1') then
  120. state_next <= s1;
  121. found <= '1';
  122. else
  123. state_next <= s2;
  124. end if;
  125. when others => -- dopelnienie warunkow CASE
  126. state_next <= s1;
  127. end case;
  128. end process;
  129. end arch_aut2;
  130.  
  131. -- configuration
  132. configuration cfg of aut is
  133. for arch_aut1
  134. end for;
  135. end cfg;

Zadanie 1: zapisać automat 4-stanowy (A,B,C,D) zadany tabelą.
S\x 0 1 | y
A| B A | 0
B| C D | 1
C| D D | 0
D| A C | 0
Zadanie 2: zapisać automat liczący mod5 dla trybów x=0 to +1, x=1 to -2.
Zadanie 3: zapisać automat jak w z.2 liczący dla dwóch cyfr.

w górę


Laboratorium 7. Układ z wieloma automatami: licznik modulo N z dwiema cyframi

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity aut is
  5. port(
  6. tick : in std_logic;
  7. clk, reset : in std_logic;
  8. digit_0, digit_1 : out std_logic_vector(1 downto 0)
  9. );
  10. end aut;
  11.  
  12. -- licznik modulo N
  13. -- automatyczne kodowanie stanow, wielosegmentowy opis
  14. architecture arch_aut of aut is
  15. type state_type is (s0,s1,s2);
  16. signal state_reg_0, state_next_0 : state_type;
  17. signal state_reg_1, state_next_1 : state_type;
  18. signal tick_0 : std_logic;
  19. begin
  20. -- rejest automatow
  21. process(clk, reset)
  22. begin
  23. if(reset = '1') then
  24. state_reg_0 <= s0;
  25. state_reg_1 <= s0;
  26. elsif rising_edge(clk) then
  27. state_reg_0 <= state_next_0;
  28. state_reg_1 <= state_next_1;
  29. end if;
  30. end process;
  31. -- blok kombinacyjny opisujacy przejscia automatu cyfry 0
  32. process(tick, state_reg_0)
  33. begin
  34. case state_reg_0 is
  35. when s0 =>
  36. if(tick = '1') then
  37. state_next_0 <= s1;
  38. else
  39. state_next_0 <= s0;
  40. end if;
  41. when s1 =>
  42. if(tick = '1') then
  43. state_next_0 <= s2;
  44. else
  45. state_next_0 <= s1;
  46. end if;
  47. when s2 =>
  48. if(tick = '1') then
  49. state_next_0 <= s0;
  50. else
  51. state_next_0 <= s2;
  52. end if;
  53. end case;
  54. end process;
  55.  
  56. -- przeniesienie dla cyfry 0
  57. process(state_reg_0)
  58. begin
  59. case state_reg_0 is
  60. when s2 =>
  61. tick_0 <= '1';
  62. when others =>
  63. tick_0 <= '0';
  64. end case;
  65. end process;
  66.  
  67. -- blok kombinacyjny opisujacy przejscia automatu cyfry 1
  68. process(tick_0, state_reg_1)
  69. begin
  70. case state_reg_1 is
  71. when s0 =>
  72. if(tick_0 = '1') then
  73. state_next_1 <= s1;
  74. else
  75. state_next_1 <= s0;
  76. end if;
  77. when s1 =>
  78. if(tick_0 = '1') then
  79. state_next_1 <= s2;
  80. else
  81. state_next_1 <= s1;
  82. end if;
  83. when s2 =>
  84. if(tick_0 = '1') then
  85. state_next_1 <= s0;
  86. else
  87. state_next_1 <= s2;
  88. end if;
  89. end case;
  90. end process;
  91.  
  92. -- wyjscie dla cyfry 0
  93. process(state_reg_0)
  94. begin
  95. digit_0 <= "00";
  96. case state_reg_0 is
  97. when s0 =>
  98. digit_0 <= "00";
  99. when s1 =>
  100. digit_0 <= "01";
  101. when s2 =>
  102. digit_0 <= "10";
  103. end case;
  104. end process;
  105. -- wyjscie dla cyfry 1
  106. process(state_reg_1)
  107. begin
  108. digit_1 <= "00";
  109. case state_reg_1 is
  110. when s0 =>
  111. digit_1 <= "00";
  112. when s1 =>
  113. digit_1 <= "01";
  114. when s2 =>
  115. digit_1 <= "10";
  116. end case;
  117. end process;
  118.  
  119. --digit_0 <= to_std_logic_vector(state_reg_0);
  120. --digit_1 <= state_reg_1;
  121. end arch_aut;

  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity aut is
  5. port(
  6. tick : in std_logic;
  7. clk, reset : in std_logic;
  8. digit_0, digit_1 : out std_logic_vector(1 downto 0)
  9. );
  10. end aut;
  11.  
  12. -- licznik modulo N
  13. -- automatyczne kodowanie stanow, wielosegmentowy opis
  14. architecture arch_aut of aut is
  15. constant s0 : std_logic_vector(1 downto 0) := "00";
  16. constant s1 : std_logic_vector(1 downto 0) := "01";
  17. constant s2 : std_logic_vector(1 downto 0) := "10";
  18.  
  19. signal state_reg_0, state_next_0 : std_logic_vector(1 downto 0);
  20. signal state_reg_1, state_next_1 : std_logic_vector(1 downto 0);
  21. signal tick_0 : std_logic;
  22. begin
  23. -- rejest automatow
  24. process(clk, reset)
  25. begin
  26. if(reset = '1') then
  27. state_reg_0 <= s0;
  28. state_reg_1 <= s0;
  29. elsif rising_edge(clk) then
  30. state_reg_0 <= state_next_0;
  31. state_reg_1 <= state_next_1;
  32. end if;
  33. end process;
  34. -- blok kombinacyjny opisujacy przejscia automatu cyfry 0
  35. process(tick, state_reg_0)
  36. begin
  37. case state_reg_0 is
  38. when s0 =>
  39. if(tick = '1') then
  40. state_next_0 <= s1;
  41. else
  42. state_next_0 <= s0;
  43. end if;
  44. when s1 =>
  45. if(tick = '1') then
  46. state_next_0 <= s2;
  47. else
  48. state_next_0 <= s1;
  49. end if;
  50. when s2 =>
  51. if(tick = '1') then
  52. state_next_0 <= s0;
  53. else
  54. state_next_0 <= s2;
  55. end if;
  56. when others =>
  57. state_next_0 <= s0;
  58. end case;
  59. end process;
  60. -- przeniesienie dla cyfry 0
  61. process(state_reg_0)
  62. begin
  63. case state_reg_0 is
  64. when s2 =>
  65. tick_0 <= '1';
  66. when others =>
  67. tick_0 <= '0';
  68. end case;
  69. end process;
  70.  
  71. -- blok kombinacyjny opisujacy przejscia automatu cyfry 1
  72. process(tick_0, state_reg_1)
  73. begin
  74. case state_reg_1 is
  75. when s0 =>
  76. if(tick_0 = '1') then
  77. state_next_1 <= s1;
  78. else
  79. state_next_1 <= s0;
  80. end if;
  81. when s1 =>
  82. if(tick_0 = '1') then
  83. state_next_1 <= s2;
  84. else
  85. state_next_1 <= s1;
  86. end if;
  87. when s2 =>
  88. if(tick_0 = '1') then
  89. state_next_1 <= s0;
  90. else
  91. state_next_1 <= s2;
  92. end if;
  93. when others =>
  94. state_next_1 <= s0;
  95. end case;
  96. end process;
  97.  
  98. -- wyjscie dla cyfry 0
  99. digit_0 <= state_reg_0;
  100. -- wyjscie dla cyfry 1
  101. digit_1 <= state_reg_1;
  102. end arch_aut;

  1. add wave *
  2. force clk 0 0, 1 {50 ps} -r 100
  3. run
  4. force reset 1 0
  5. force tick 0 0
  6. run
  7. force reset 0 0
  8. run 200
  9. force tick 1 0
  10. run 1000

Zadanie: Rozbudować układ dwóch liczników o funkcje zatrzymania dla zadanej wartości i wygenerowania impulsu.
w górę


Laboratorium 8. Użycie funkcji bibliotecznych LPM

  1. -- substraction, a>b, unsigned
  2. library ieee;
  3. use ieee.std_logic_1164.all;
  4. use ieee.std_logic_unsigned.all; -- arch_lab8_1
  5. use ieee.numeric_std.all; -- arch_lab8_2
  6. LIBRARY lpm; -- arch_lab8_3/4
  7. USE lpm.lpm_components.all;-- arch_lab8_3/4
  8.  
  9. entity lab8_1 is
  10. generic( N : integer :=8);
  11. port(
  12. a,b : in std_logic_vector(N-1 downto 0);
  13. s : out std_logic_vector(N-1 downto 0)
  14. );
  15. end lab8_1;
  16.  
  17. architecture arch_lab8_1 of lab8_1 is
  18. begin
  19. s <= a - b;
  20. end arch_lab8_1;
  21.  
  22. architecture arch_lab8_2 of lab8_1 is
  23. begin
  24. s <= std_logic_vector(unsigned(a) - unsigned(b));
  25. end arch_lab8_2;
  26.  
  27. -- lpm_add_sub, SUB used signal
  28. architecture arch_lab8_3 of lab8_1 is
  29. begin
  30. b1: lpm_add_sub generic map(LPM_WIDTH => N,
  31. LPM_REPRESENTATION => "UNSIGNED")
  32. port map(dataa => a, datab => b, result => s, add_sub => '0');
  33. end arch_lab8_3;
  34.  
  35. -- lpm_add_sub, SUB used parameter
  36. architecture arch_lab8_4 of lab8_1 is
  37. begin
  38. b2: lpm_add_sub generic map(LPM_WIDTH => N,
  39. LPM_REPRESENTATION => "UNSIGNED", LPM_DIRECTION => "SUB")
  40. port map(dataa => a, datab => b, result => s);
  41. end arch_lab8_4;
  42.  
  43. -- configuration
  44. configuration cfg of lab8_1 is
  45. for arch_lab8_4
  46. end for;
  47. end cfg;
  1. -- multiplication, unsigned
  2. library ieee;
  3. use ieee.std_logic_1164.all;
  4. use ieee.std_logic_unsigned.all; -- arch_lab8_1
  5. use ieee.numeric_std.all; -- arch_lab8_2
  6. LIBRARY lpm; -- arch_lab8_3
  7. USE lpm.lpm_components.all; -- arch_lab8_3
  8.  
  9. entity lab8_2 is
  10. generic( N : integer :=4);
  11. port(
  12. clk : in std_logic; -- arch_lab8_5 only
  13. a,b : in std_logic_vector(N-1 downto 0);
  14. p : out std_logic_vector(2*N-1 downto 0)
  15. );
  16. end lab8_2;
  17.  
  18. architecture arch_lab8_1 of lab8_2 is
  19. begin
  20. p <= a * b;
  21. end arch_lab8_1;
  22.  
  23. architecture arch_lab8_2 of lab8_2 is
  24. begin
  25. p <= std_logic_vector(unsigned(a) * unsigned(b));
  26. end arch_lab8_2;
  27.  
  28. -- lpm_mult
  29. architecture arch_lab8_3 of lab8_2 is
  30. begin
  31. b1: lpm_mult generic map(LPM_WIDTHA => N,LPM_WIDTHB => N,
  32. LPM_WIDTHP => 2*N)
  33. port map(dataa => a, datab => b, result => p);
  34. end arch_lab8_3;
  35.  
  36. -- lpm_mult, MegaWizard
  37. architecture arch_lab8_4 of lab8_2 is
  38. component b2
  39. PORT
  40. (
  41. dataa : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
  42. datab : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
  43. result : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
  44. );
  45. end component;
  46. begin
  47. b2_inst : b2 PORT MAP (
  48. dataa => a,
  49. datab => b,
  50. result => p
  51. );
  52. end arch_lab8_4;
  53.  
  54. -- lpm_rom
  55. -- http:// tomaszewicz.zpt.tele.pw.edu.pl/system/files/mnozenie.pdf
  56. architecture arch_lab8_5 of lab8_2 is
  57. begin
  58. b3: lpm_rom generic map(LPM_WIDTH => 2*N, LPM_WIDTHAD => 2*N,
  59. LPM_FILE => "4x4_mult.mif", LPM_ADDRESS_CONTROL => "UNREGISTERED",
  60. LPM_OUTDATA => "REGISTERED")
  61. port map(address => (a & b), q => p, outclock => clk);
  62. end arch_lab8_5;
  63.  
  64. -- configuration
  65. configuration cfg of lab8_2 is
  66. for arch_lab8_5
  67. end for;
  68. end cfg;
  1. -- Zadanie domowe do lab8
  2. -- mnozenie 5x5 bitów, unsigned
  3. -- Założenie: wykorzystać 1 tablicę ROM 4x4
  4. -- Uwaga1: rozpisać wektory A i B na składowe 1-bit + 4-bit
  5. -- skorzystać ze struktury jak na planszach 25-30: mnożenie 4-bitowe w ROM, reszta zsumowana
  6. -- http:// tomaszewicz.zpt.tele.pw.edu.pl/system/files/mnozenie.pdf
  7. -- Uwaga2: niektóre układy fpga wymagają wejścia lub wyjścia rejestrowego,
  8. -- stąd niektóre sygnały sumy należy opóźnić o odpowiednią liczbę taktów.
  9.  
  10. library ieee;
  11. use ieee.std_logic_1164.all;
  12. use ieee.numeric_std.all;
  13. LIBRARY lpm;
  14. USE lpm.lpm_components.all;
  15.  
  16. entity lab8_zad is
  17. generic( N : integer :=5);
  18. port(
  19. clk, reset : in std_logic;
  20. a,b : in std_logic_vector(N-1 downto 0);
  21. p : out std_logic_vector(2*N-1 downto 0)
  22. );
  23. end lab8_zad;
  24.  
  25. architecture arch_lab8 of lab8_zad is
  26. ....
  27.  
  28. p <= ... + ... + ... + ... ; -- :) powodzenia!
  29. end arch_lab8;

w górę


Laboratorium 9. Realizacja zadanego algorytmu kombinacyjnego i zaprogramowanie płytki laboratoryjnej.

  1.  

w górę


Laboratorium 10. Realizacja zadanego algorytmu sekwencyjnego i zaprogramowanie płytki laboratoryjnej.

  1.  

w górę

ZałącznikRozmiar
Plik 4x4_mult.mif4.86 KB

Etykiety przedmiotów:

Etykiety rzeczowe: