1. Trang chủ
  2. » Luận Văn - Báo Cáo

thiết kế logic số VHDL

65 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 65
Dung lượng 1,26 MB

Cấu trúc

  • 1.1. Mô hình (4)
  • 1.2. Nguyên lý (4)
  • 1.3. Mô tả VHDL (5)
  • 1.4. Mô tả testbench (5)
  • 1.5. Code VHDL (6)
  • 1.6. Kết quả mô phỏng (8)
  • 2.1. Mô hình (9)
  • 2.2. Trigơ JK (9)
  • 2.3. Bộ đếm tiến nhị phân 4 bit (15)
  • 3.1. Lên ý tưởng thiết kế mạch (22)
  • 3.2. Thiết kế khối đếm tiến BCD (22)
  • 3.3. Thiết kế khối giải mã BCD sang led 7 đoạn loại Anode chung (34)
  • 3.4. Kết hợp hai khối trên để tạo thành mạch hoàn chỉnh (40)
  • 4.1. Mô hình (46)
  • 4.2. Nguyên lý (46)
  • 4.3. Mô tả VHDL (47)
  • 4.4. Mô tả testbench (48)
  • 4.5. Code VHDL (49)
  • 4.6. Kết quả mô phỏng (51)
  • 5.1. Mô tả mô hình chung của một trigger D (52)
  • 5.2. Kết nối các trigger D đã mô tả ở phần trên theo mạch đã cho (57)
  • 5.3. Phân tích hoạt động của mạch (60)
  • 5.4. Viết testbench mô phỏng cho mạch (62)
  • 5.5. Kết quả mô phỏng (64)

Nội dung

thiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic sốthiết kế logic số VHDLthiết kế logic số VHDLthiết kế logic số VHDL VHDLthiết kế logic số VHDLthiết kế logic số VHDL

Nguyên lý

- Thanh ghi 8 bit gồm: Đầu vào 8 bit, đầu ra 8 bit, xung Clock đầu vào tích cực cao, đầu vào Clear tích cực thấp.

 Đầu vào 8 bit xác định giá trị đầu ra 8 bit tương ứng

 Mỗi khi xung Clock thay đổi trạng thái theo hướng tích cực cao thì đầu ra sẽ được lập giá trị tương ứng đầu vào hoặc bằng 0x00 tùy theo giá trị đầu vào Clear:

Clear tích cực cao thì đầu ra bằng đầu vào Clear tích cực thấp thì đầu ra bằng 0x00

Mô tả VHDL

- Register 8 bit  Chọn đơn vị thiết kế Entity

Mô tả đơn vị thiết kế

Port Kiểu dữ liệu Hướng Kích thước

D(dữ liệu vào) std_logic_vector in 8

Q(dữ liệu ra) std_logic_vector out 8

- Tạo process cho entity Register 8 bit có các hành vi:

 Phát hiện trạng thái xung Clock, tiếp tục xử lý khi tích cực cao

 Kiểm tra trạng thái chân Clear sử dụng lệnh if

 Xác định đầu ra theo 2 trường hợp:

Mô tả testbench

- Mô tả hệ thống theo mô hình cấu trúc sử dụng component, port map và các tín hiệu nội bộ signal:

 Khai báo thực thể con component có port tương ứng entity Register 8 bit

 Khai báo các tín hiệu nội bộ cho từng port tương ứng entity Register 8 bit

5 entity reg8 is port( D: in std_logic_vector (7 downto 0);

Q: out std_logic_vector (7 downto 0):=(others => '0') ); end reg8; if rising_edge(CLK) then if CLR = '0' then

 Gọi component Register 8 bit bằng port map

 Clock: lật trạng thái mỗi 100 ns

Gán Clear bằng 0, chờ vô cùng

Code VHDL

6 architecture Behaviorial of tb_reg8 is component reg8 port( D: in std_logic_vector (7 downto 0);

Q: out std_logic_vector (7 downto 0) ); end component; signal D : std_logic_vector (7 downto 0) := (others => '0'); signal Q : std_logic_vector (7 downto 0) := (others => '0'); signal CLK : std_logic; signal CLR : std_logic := '1'; begin

Register8 : reg8 port map ( D => D, CLK => CLK, CLR => CLR, Q => Q );

CLK '0'); signal CLK : std_logic; signal CLR : std_logic := '1'; begin

Register8 : reg8 port map (D => D, CLK => CLK, CLR => CLR, Q => Q );

CLK QR2);

JK3: ff_jk port map (PA1, PA1, Clear, PA0, Q=>Q3, QR=>QR3);

JK4: ff_jk port map (PA2, PA2, Clear, PA0, Q=>Q4, QR=>QR4);

20 library ieee; use ieee.std_logic_1164.all; entity tb_counter_4b is end tb_counter_4b; architecture Behaviorial of tb_counter_4b is component counter_4b port( Clear: in std_logic;

Count: out std_logic_vector (3 downto 0) ); end component; signal Clear: std_logic := '0'; signal Clock: std_logic := '0'; signal Pause: std_logic := '0'; signal Count: std_logic_vector (3 downto 0); begin

Counter4b: counter_4b port map (Clear, Clock, Pause, Count);

Clock HIGH của tín hiệu clock.

+ Chân CLR và Pause hoạt động ở mức logic LOW -> để mạch hoạt động bình thường, khi không sử dụng, các chân này phải được đặt ở mức logic HIGH.

+ Các chân đầu ra là các chân mã BCD, hoạt động ở mức logic HIGH. entity BCD_counter_up is port( counter_input: in std_logic_vector(2 downto 0); BCD_output: out std_logic_vector(3 downto 0)); end BCD_counter_up;

* Các chân counter_input có thể được miêu tả lại bằng các alias ở trong architecture: architecture BEH of BCD_counter_up is alias CLK: std_logic is counter_input(0); rising edge alias CLR: std_logic is counter_input(1); hoat dong muc logic thap alias PAUSE: std_logic is counter_input(2); hoat dong muc logic thap

- Mô tả ý tưởng về hoạt động của khối:

+ Mỗi khi mạch đọc được sườn lên của CLK, mạch sẽ đếm tăng dần.

+ Mạch sẽ đếm tăng dần từ 0 đến 9 dưới dạng mã BCD và lặp lại theo từng xung clock.

+ Khi chân CLR được kéo xuống LOW thì số trên led 7 đoạn sẽ bị xóa về số 0 và giữ nguyên Đến khi CLR được kéo lên HIGH lại thì mạch tiếp tục đếm.

+ Khi chân Pause được kéo xuống LOW thì số trên led 7 đoạn sẽ dừng đếm tiến, số trên led 7 đoạn sẽ giữ nguyên ở số đang đếm tại thời điểm đó Đến khi Pause được kéo lên HIGH, mạch sẽ bắt đầu đếm tiếp tục đếm từ số đã dừng.

-> Có thể mô tả được hoạt động của khối bằng 2 bảng trạng thái sau đây:

* Mô tả trạng thái do các chân CLR và Pause tác động:

-> Mô tả bảng trạng thái khi các chân CLR và Pause cùng kéo lên HIGH:

CLK BCD_Output (n) BCD_Output (n+1)

+ BCD_Output(n) là số đếm hiện tại của khối.

+ BCD_Output(n+1) là số đếm kế tiếp của khối.

+ CLR và Pause là các tín hiệu kích thích trên các chân CLR và Pause.

- Mô tả hoạt động cho khối bằng ngôn ngữ VHDL:

+ Em sẽ chia nhỏ chương trình trong architecture thành nhiều process ứng với các tín hiệu kích thích trên các chân CLK, CLR, Pause một cách riêng rẽ nhằm mục đích khiến chương trình dễ theo dõi hơn.

+ Để có thể làm được như trên, em sẽ tạo thêm các tín hiệu nội bộ bên trong khối làm nhiệm vụ trung gian giữa các process với nhau (clear_flag và pause_flag), và lưu số đếm hiện tại của chương trình (current_counter).

24 signal current_counter: integer range 0 to 10; so dem hien tai signal clear_flag: std_logic; bao hieu cho tin hieu CLR signal pause_flag: std_logic; bao hieu cho tin hieu Pause

+ Khi CLR = 0-> clear_flag = 1 và ngược lại process(CLR) begin if(CLR = '0')then clear_flag số đếm giữ nguyên giá trị hiện tại.

* stop_counter = 0 -> Kiểm tra xem giá trị số đếm hiện tại đã vượt qua 9 chưa Nếu số đếm hiện tại < 9, ta tiếp tục tăng số đếm hiện tại lên 1 Nếu lớn hơn hoặc bằng 9, số đếm tiếp theo reset về 0. process(CLK,clear_flag,pause_flag) variable stop_counter: std_logic:= '0'; begin stop_counter:= '0'; if(clear_flag = '1')then current_counter '0'); alias CLK: std_logic is main_input(0); rising edge alias CLR: std_logic is main_input(1); hoat dong muc logic thap alias PAUSE: std_logic is main_input(2); hoat dong muc logic thap

main output signal main_output: std_logic_vector(7 downto 0); (bit 0-> bit 7) = abcdefgh

- constant Tclk_counter: time:= 20 ns;

- begin uut: full_counter_7seg port map(main_input,main_output); clock_genterator: CLK

- Ở mỗi sườn dương của CLK, mạch sẽ đếm tăng dần từ 0->9 và xuất ra tín hiệu led 7 đoạn tương ứng.

- Khi CLR = LOW, led 7 đoạn sẽ hiển thị số 0 (tín hiệu 0xC0).

-> Khi CLR = HIGH lại, mạch sẽ lại tiếp tục đếm tiến.

- Khi Pause = LOW, mạch sẽ dừng lại ở số mà mạch đang đếm hiện tại

- Khi Pause = HIGH, mạch sẽ tiếp tục đếm tiến từ số đang dừng.

Câu 4: Viết chương trình mô tả bộ hợp kênh 8:1 (Enable hoạt động mức thấp) Viết testbench để kiểm tra hoạt động của mạch.

Nguyên lý

- Mux 8_1 bao gồm: Đầu vào 8 bit, đầu ra 1 bit, đầu vào chọn kênh 3 bit, đầu vào Enable tích cực mức thấp.

 Đầu vào 8 bit xác định giá trị tham chiếu cho đầu ra

 Hoạt động khi đầu vào Enable tích cực thấp, ngược lại giá trị đầu ra sẽ luôn bằng 0

 Giá trị Sel sẽ quyết định đầu ra Y tương ứng với 1 giá trị tại 1 kênh nằm từ 0 đến 7 của đầu vào D

Mô tả VHDL

- Mux 8-1  Chọn đơn vị thiết kế Entity

Mô tả đơn vị thiết kế

Port Kiểu dữ liệu Hướng Kích thước

D(dữ liệu vào) std_logic_vector in 8

Y(dữ liệu ra) std_logic out 1

Sel std_logic_vector in 3

- Tạo process cho cho entity Mux8 có các hành vi:

 Kiểm tra trạng thái chân Enable sử dụng lệnh if

 Xác định đầu ra Y theo giá trị Sel dựa vào bảng giá trị, sử dụng cấu trúc case when

47 entity mux8 is port( D: in std_logic_vector (7 downto 0) := (others=>'0');

Sel: in std_logic_vector (2 downto 0) := (others=>'0');

Y: out std_logic ); end mux8; if E = '0' then case(Sel) is when "000" => Y Y Y Y Y Y Y Y '0'); Sel: in std_logic_vector (2 downto 0) := (others=>'0'); E: in std_logic;

Y: out std_logic ); end component; signal D: std_logic_vector (7 downto 0) := (others=>'0'); signal Sel: std_logic_vector (2 downto 0) := (others=>'0'); signal E: std_logic := '0'; signal Y: std_logic; begin

MUXING8: mux8 port map (D => D,Sel => Sel,E => E,Y => Y );

Code VHDL

49 library ieee; use ieee.std_logic_1164.all; entity mux8 is port( D: in std_logic_vector (7 downto 0) := (others=>'0'); Sel: in std_logic_vector (2 downto 0) := (others=>'0'); E: in std_logic;

Y: out std_logic ); end mux8; architecture Behaviorial of mux8 is begin process(Sel) begin if E = '0' then case(Sel) is when "000" => Y Y Y Y Y Y Y Y '0'); Sel: in std_logic_vector (2 downto 0) := (others=>'0'); E: in std_logic;

Y: out std_logic ); end component; signal D: std_logic_vector (7 downto 0) := (others=>'0'); signal Sel: std_logic_vector (2 downto 0) := (others=>'0'); signal E: std_logic := '0'; signal Y: std_logic; begin

Sel

Ngày đăng: 08/12/2023, 21:46

w