Cấu trúc mã VHDL và các gói/thư viện hỗ trợ

MỤC LỤC

Cấu trúc mã

    Mục đích của 3 gói/thư viện được kể ở trên là như sau: gói std_logic_1164 của thư viện ieee cho biết một hệ logic đa mức; std là một thư viện tài nguyên (kiểu dữ kiệu, i/o text.) cho môi trường thiết kế VHDL và thư viện work được sủ dụng khi chúng ta lưu thiết kế ( file .vhd, các file được tạop bởi chương trình dịch và chương trình mô phỏng…). Như với ví dụ mô tả mô hình cấu trúc một flip-flop RS gồm hai cổng NAND có thể mô tả cổng NAND được định nghĩa tương tự như ví dụ với cổng NOT, sau đó mô tả sơ đồ móc nối các phần tử NAND tạo thành trigơ RS.

    Kiểu dữ liệu

      Lý do chính cho việc sử dụng kiểu dữ liệu con để sau đó định ra một kiểu dữ liệu mới đó là, các thao tác giữa các kiểu dữ liệu khác nhau không được cho phép, chúng chỉ được cho phép trong trường hợp giữa một kiểu con và kiểu cơ sở tương ứng với nó. Nếu dữ liệu được quan hệ đóng ( nghĩa là 2 toán hạng có cùng kiểu cơ sở, bất chấp đang được khai báo thuộc về hai kiểu lớp khác nhau), thì std_logic_1164 của thư viện ieee cung cấp các hàm chuyển đổi dễ thực hiện.

      Toán tử và thuộc tính

        PROCESS (ena, sel). END PROCESS;. END generic_decoder;. Hình sau đây mô tả kết quả hoạt động của bộ giải mã trên. Như chúng ta thấy khi ena =0 thì tất cả các bít phía đầu ra đều bằng 1. Trong ví dụ trên ta đã sử dụng các toán tử +, * , các toán tử gán và thuộc tính RANGE. Ví dụ sau đây mô phỏng một mạch phát hiện tính parity. Nó bao gồm một đầu vào n bít và một đầu ra. Đầu ra sẽ có giá trị bằng 0 khi số đầu vào có giá trị là một là một số chẵn và bằng 1 trong các trường hợp còn lại. Bộ phát hiện bít chãn lẻ Sau đây là mã nguồn mô tả mạch trên. ENTITY parity_det IS. output: OUT BIT);. Như vậy mạch sẽ gồm n-1 đầu vào dữ liệu và n đầu ra, trong đó n-1 đầu ra bên phải giống như n-1 đầu vào, đầu ra còn lại là giá trị kiểm tra parity.

        Mã song song

          Nó tương đương với khối lệnh tuần tự LOOP trong việc cho phép các đoạn lệnh được thực hiện lặp lại một số lần nào đó. Khối lệnh BLOCK cho phép đặt một khối lệnh song song vào một đoạn, điều đó giúp cho các đoạn lệnh dễ đọc và dễ quản lý hơn. Ví dụ 2: DFF dùng Guarded BLOCK.Trong ví dụ này chúng ta sẽ xem xét hoạt động của một TrigerT hoạt động đồng bộ sườn dương.

          Mã tuần tự

          CASE

          Tuy nhiên, CASE cho phép nhiều phép gán với mỗi điều kiện kiểm tra, trong khi WHEN chỉ cho phép một. LIBRARY ieee; -- Unnecessary declaration, -- because USE ieee.std_logic_1164.all; -- BIT was used instead of.

          LOOP

          (other statements) END LOOP;. Bộ cộng có nhớ 8 bit không dấu. Bộ cộng có nhớ 8 bit không dấu. Kết quả mô phỏng Mỗi phần tử của sơ đồ là một bộ cộng đầy đủ. Dùng Generic với các VECTOR. LIBRARY ieee;. ENTITY adder IS. cin: IN STD_LOGIC;. cout: OUT STD_LOGIC);.

          Bad Clocking

          Nếu trình biên dịch giả thiết một giá trị mặc định, một mạch lỗi sẽ được tổng hợp, bởi vì chỉ một sườn của clk sẽ được quan tâm; nếu không có giá trị mặc định giả thiết, thì một thông điệp lỗi và không có sự biên dịch được mong muốn. Nếu một tín hiệu xuất hiện trong danh sách nhạy, nhưng không xuất hiện trong bất kỳ phép gán nào của PROCESS, thì xem như trình biên dịch sẽ bỏ qua. Khi wr_ena trở về mức cao, d được nối với đầu vào của thanh ghi, vì vậy tại sườn dương tiếp theo của clk, d sẽ ghi đè giá trị liền trước.

          Sử dụng mã tuần tự để thiết kế các mạch tổ hợp

          Sau khi biên dịch, các file báo cáo thể hiện không có flip-flop nào được suy ra. Do đó, một chốt (sử dụng các cổng AND/OR) đã được thực hiện, trả về bảng thật 2.

          Signal và Variable

            Tóm lại, chỉ một phép gán với SIGNAL được phép bên trong PROCESS, vì vậy phần mềm chỉ xét phép gán cuối cùng (sel <= sel +2) hoặc đơn giản là đưa ra thông báo lỗi và kết thúc việc biên dịch. Đây cũng không bao giờ là vấn đề khi sử dụng VARIABLE. DFF với q và qbar. LIBRARY ieee;. ENTITY dff IS. q: BUFFER STD_LOGIC;. qbar: OUT STD_LOGIC);. PROCESS (clk). VARIABLE temp: BIT;. DFF với q và qbar. Cách 2 có một trong các phép gán là đồng bộ, việc tổng hợp sẽ luôn suy ra chỉ một flip-flop. Sinh hai DFF. LIBRARY ieee;. ENTITY dff IS. q: BUFFER STD_LOGIC;. qbar: OUT STD_LOGIC);. Tuy nhiên, một phép gán cho một biến là tức thì, và khi các biến đang được sử dụng trong thứ tự trực tiếp (sau khi các giá trị vừa được gán cho chúng), dòng 13-15 thành 1 dòng, tương đương với c:=din.

            Máy trạng thái

            Giới thiệu

            Thông thường các tín hiệu clock và các tín hiệu reset trong phần mạch dãy sẽ xuất hiện trong PROCESS (trừ khi tín hiệu reset là đồng bộ hoặc không được sử dụng, tín hiệu WAIT được sử dụng thay cho lệnh IF). Một điều quan trọng liên quan tới phương pháp FSM là : về nguyên tắc chung là bất kỳ một mạch dãy nào cũng có thể được mô hình hoá thành 1 máy trạng thái, nhưng điều này không phải luôn luôn thuận lợi. Vì có nhiều trường hợp (đặc biệt là các mạch thanh ghi như: bộ đếm,…) nếu thiết kế theo phương pháp FSM thì mã nguồn có thể trở nên dài hơn, phức tạp hơn, mắc nhiều lỗi hơn so với phương pháp thông thường.

            Thiết kế kiểu 2

            Ví dụ, chúng ta có thể sử dụng một tín hiệu thêm (như tín hiệu trung gian) để tính toán giá trị đầu ra (đoạn trên), nhưng chỉ chuyển các giá trị của nó thành tín hiệu đầu ra khi sự kiện clock thay đổi (phần mạch dãy). So sánh khuôn mẫu của thiết kế kiểu 2 với thiết kế kiểu 1, chúng ta thấy chỉ có một sự khác nhau duy nhất, đó là xuất hiện tín hiệu trung gian temp. + Chế độ kiểm tra: Cho phép tất cả thời gian được lập trình trước được viết lên với 1 giá trị nhỏ, do vậy hệ thống có thể dễ dàng được kiểm tra trong suốt quá trình baỏ dưỡng.

            Bài tập tham khảo

            Bộ so sánh không dấu và có dấu

            Phần mã VHDL sau đây là bản sao của phần mã đã được trình bày (ở bộ so sánh không dấu). Bộ so sánh không dấu có thể cũng được thực hiện với STD_LOGIC_VECTORS, trong trường hợp này không cần thiết phải khai báo std_logic_arith.

            Bộ cộng Carry Ripple và bộ cộng Carry Look Ahead

            END GENERATE;. Kết quả mô phỏng:. Kết quả mô phỏng cho bộ cộng ripple carry + Bộ cộng carry look ahead:. Sơ đồ bộ cộng carry look ahead. Mạch được hoạt động dựa trên các khái niêm generate và propagate. Chính đặc điểm này đã làm cho bộ cộng này thực hiện với tốc độ nhanh hơn so với bộ cộng trước. Nếu chúng ta xem a, b là các vector:. Từ công thức tình trên, chúng ta viết chương trình thiết kế bộ cộng carry look ahead 4 bit như sau:. --- ENTITY Bo_cong_carry_look_ahead IS. cin: IN STD_LOGIC;. cout: OUT STD_LOGIC);. Từ đó nếu 1 đồng nickel được gửi vào tài khoản, máy sẽ chuyển trạng thái đến trạng thái 5, nếu 1 đồng dime được gửi vào tài khoản thì máy chuyển tới trạng thái 10 hoặc nếu 1 đồng quarter thì máy sẽ chuyển đến trạng thái 25. + Trong phần đầu: diện mạo cơ bản liên quan đến thiết kế bộ điều khiển máy bán hàng (như trong hình 9.11). + Trong phần 2: Các chức năng mở rộng được thêm vào. Ở đây chúng ta chỉ nghiên cứu phần một của bài toán: Nhìn vào đồ hình trạng thái của máy ở hình 9.11, chúng ta thấy có 10 trạng thái, như vậy cần có 4 bit để mã hoá các trạng thái, tức là cần sử dụng 4 flip-flop. Mã thiết kế sẽ như sau:. --- ENTITY Bo_dieu_khien_may_bh IS. nickel_in, dime_in, quarter_in: IN BOOLEAN;. candy_out, nickel_out, dime_out: OUT STD_LOGIC);.

            Bộ chuyển song song thành nối tiếp

            Kết quả mô phỏng:. được xuất hiện tại đầu ra của mỗi sườn dương của xung đồng hồ. Sau khi tất cả 8 bit được gửi đi, đầu ra trở lại mức thấp cho đến lần chuyển đổi tiếp theo. Mã thiết kế như sau:. LIBRARY ieee;. clk, load: IN STD_LOGIC;. dout: OUT STD_LOGIC);. ARCHITECTURE Bo_chuyen_dl_ss_nt OF Bo_chuyen_dl_ss_nt IS SIGNAL reg: STD_LOGIC_VECTOR (7 DOWNTO 0);.

            Trò chơi trên led 7 thanh

            Mạch của chúng ta sẽ tạo ra một sự chuyển động liên tục theo chiều kim đồng hồ của các đoạn SSD. Đồng thời nó còn tạo ra sự dịch chuyển chồng lắp giữa các thanh kề nhau. Quá trình sẽ dừng lại khi có tín hiệu Stop, và khi đó mạch sẽ trở lại trạng thái a và chờ cho đến khi stop xuống thấp trở lại.

            Thiết kế bộ nhớ

            RAM với đường bus vào ra riêng biệt: Sơ đồ của RAM với đường bus vào ra riêng biệt được thể hiện trong hình 9.25. Như chúng ta thấy trên hình, RAM có các bus dư liệu vào data_in, bus dữ liệu ra data_out, bus địa chỉ, tín hiệu clk và tín hiệu cho phép đọc/ghi. Khi tín hiệu cho phép ghi/đọc được xác nhận là ghi thì tại mỗi xung lên tiếp theo của clk thì dữ liệu đầu vào (data_in) phải được lưu trữ tại vị trí addr, và dữ liệu ra phải được đọc từ địa chỉ addr.