MỤC LỤC
Vớ dụ trong hỡnh 2.3 ta cú thể thấy rừ cỏc chõn IN, OUT chỉ cú một chiều (vào hoặc ra) trong khi INOUT là 2 chiều và BUFFER lại khác, tín hiệu ra phải được sử dụng từ dữ liệu bên trong. 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.
Nó cũng cho biết chế độ ( hướng) của tín hiệu, lưu ý rằng các mũi tên ứng với rst, d và clk hướng vào trong, đây là phía input, còn q hướng ra ngoài tương ứng với phía output. Trong lời giải sau đây, chúng ta đã giới thiệu một cách có chủ định một tín hiệu không cần thiết (temp), chỉ để minh họa một tín hiệu sẽ được khai báo như thế nào.
“weak”, chúng được giải quyết trong sự ưu tiên của các giá trị “forcing” trong các nút đa chiều ( Bảng 3.1). Thật vậy, nếu 2 tín hiệu std_logic bất kỳ được nối đến cùng một node, thì các mức logic đối lập được tự động giải quyết theo Bảng 3.1. Hệ thống logic giải được. Thật vậy, hệ STD_LOGIC mô tả ở trên là một tập con của STD_ULOGIC. Hệ thống thứ 2 này thêm giá trị logic ‘U’. • Physic literals: sử dụng đối với các đại lượng vật lý, như thời gian, điện áp,…Hữu ích trong mô phỏng. • Character literals: ký tự ASCII đơn hoặc một chuỗi các ký tự như thế. • SIGNED và UNSIGNED: các kiểu dữ liệu được định nghĩa trong gói std_logic_arith của thư viện ieee. Chúng có hình thức giống như STD_LOGIC_VECTOR, nhưng ngọai trừ các toán tử số học, mà tiêu biểu là kiểu dữ liệu INTEGER. Các ví dụ:. Ví dụ: Các toán tử được phép và không được phép nằm giữa các kiểu dữ liệu khác nhau:. SIGNAL a: BIT;. SIGNAL c: STD_LOGIC;. -- STD_LOGIC_VECTOR). 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ó.
VARIABLE temp1 : STD_LOGIC_VECTOR (x'HIGH. 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.
Bên cạnh đó, các phép gán dùng các toán tử được sử dụng để tạo các mạch tổ hợp. Cuối cùng một loại khối lện đặc biệt được gọi là BLOCK sẽ được sử dụng.
Sau đây là chương trình mô phỏng sử dụng WHEN theo cả hai cách dùng WHEN / ELSE,và WITH / SELECT / WHEN. 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 đó.
Nó chứa một điều kiện và BLOCK chỉ được thực hiện khi điều kiện đó có giá trị là TRUE. 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.
(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);. 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.
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);. Trong PROCESS, biến temp sẽ gây ra tín hiệu x để lưu trữ 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);.
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). 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.
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í 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).
Từ công thức trên ta xây dựng chương trình VHDL như sau (Ở đây chúng ta có thể áp dụng cho bất kỳ số lượng đầu vào nào):. LIBRARY ieee;. --- ENTITY Bo_cong_carry_ripple IS. cin: IN STD_LOGIC;. cout: OUT STD_LOGIC);. --- ARCHITECTURE arc OF Bo_cong_carry_ripple IS SIGNAL c: STD_LOGIC_VECTOR (n DOWNTO 0);. 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);.
+ 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:. LIBRARY ieee;. --- ENTITY Bo_dieu_khien_may_bh IS. nickel_in, dime_in, quarter_in: IN BOOLEAN;. candy_out, nickel_out, dime_out: OUT STD_LOGIC);. Khi load ở trạng thái cao thì dữ liệu được nạp vào thanh ghi dịch theo thư tự bit MSB là bít gần đầu ra nhất, và đầu ra là d(7). Mỗi khi load trả lại “0” thì bit tiếp theo đượ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);.
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.