Trong bài này chỉ tóm tắt hướng dẫn sử dụng các phần cấu trúc và cú pháp về các phát biểu, khai báo, chỉ dẫn… chủ yếu nhất để phục vụ cho cách lập trình cho vi mạch GAL và cách lập trình
Trang 1Biên soạn Ngô Văn Bình
Phần 3: TÓM TẮT HƯỚNG DẪN SỬ DỤNG NGÔN NGỮ
ABEL
Ngôn ngữ ABEL (Advanced Boolean Equation Language) là một trong những ngôn ngữ lập trình rất mạnh cho PLD bao gồm cả phần lập trình mô phỏng và tạo file fuslemap (cầu chì) 'đốt' PLD Trong bài này chỉ tóm tắt hướng dẫn sử dụng các phần cấu trúc và cú pháp về các phát biểu, khai báo, chỉ dẫn… chủ yếu nhất để phục vụ cho cách lập trình cho vi mạch GAL và cách lập trình cho các vi mạch ứng dụng trong mạch sau này Để hiểu sâu hơn về ngôn ngữ này, người học nên cần tham khảo thêm các tài liệu khác hoặc phần help trong ngôn ngữ
3.1 CẤU TRÚC VÀ CÚ PHÁP:
3.1.1 CÁC PHÁT BIỂU (STATEMENT)
1 Phát biểu Module:
Cú pháp: module modname [(dummy_arg[,….])]
Modname là một danh hiệu hợp lệ được đặt làm tên gọi cho module chương trình
Danh hiệu hợp lệ là một chuỗi dài tối đa 31 ký tự (chữ cái, chữ số, dấu gạch dưới '_'), được bắt đầu bằng chữ cái hay dấu gạch dưới '_' Danh hiệu phân biệt chữ hoa hay chữ thường
Dummy _ arg (có thể có) là một thông số hình thức (tương tự như thông số hình thức của các procedure ngôn ngữ cấp cao)
Trang 2Biên soạn Ngô Văn Bình
Trong module này có sử dụng hai thông số hình thức A và B, biểu thức
C = A + B, với A, B được trả về giá trị thực (từ module khác) khi biên dịch
Sử dụng phát biểu title là tùy chọn (không nhất thiết phải có)
4 Phát biểu Truth _ table:
Cú pháp: Truth _ table (inputs -> outputs)
hay truth _ table (inputs : > reg _ outs)
hay truth _ table (inputs: > reg _ outs -> outputs)
Inputs : là các ngõ vào của hàm logic
Outputs : là các ngõ ra của hàm logic
Reg _ outs : là các ngõ ra của các thanh ghi (FF)
Dấu -> : biểu diễn hệ tổ hợp
Dấu : > : biểu diễn hệ tuần tự
Mục đích - Cách dùng:
Truth _ table trình bày bảng sự thật minh họa hoạt động của hàm logic hoặc hệ logic cần thiết kế
Trang 3Biên soạn Ngô Văn Bình
Các bảng sự thật có thể thay thế hoặc bổ sung thêm cho các biểu thức (trong equations) hay sơ đồ trạng thái (trong state _ dragram)
Rõ ràng truth _ table ở trên biểu diễn biểu thức C = A + B
5 Phát biểu state _ diagram:
Cú pháp: state _ diagram state variables
state state _ exp : [equations] ;
State_variables : là tập hợp các biến trạng thái trong máy trạng thái
State : là từ khóa để biểu diễn sự chuyển biến từ trạng thái hiện tại sang trạng thái
kế tiếp và ngõ ra hiện tại
State _exp : là biểu thức hay hằng số định nghĩa trạng thái hiện tại
Equations là các biểu thức logic ngõ ra hiện tại của máy trạng thái
Trans _ stmt là một phát biểu dạng IF - THEN - ELSE, GOTO, CASE (tùy chọn)
để mô tả sự chuyển biến từ trạng thái hiện tại sang trạng thái kế tiếp theo điều kiện tác động của ngõ vào
Mục đích - cách dùng: Phát biểu state _ diagram định nghĩa các biến trạng thái bắt đầu sự mô tả hoạt động của máy trạng thái (tương tự như đồ thị trạng thái hay lưu
else S1 state S1 : z = 1 ;
Trang 4Biên soạn Ngô Văn Bình
go to S2 ; state S2 : z = 0 ;
go to S0 ; Đoạn chương trình trên tương đương với lưu đồ máy trạng thái hình bên
Ví dụ: Si: goto Sj ; nhảy đến trạng thái Sj
Sj: goto x + y; nhảy đến trạng thái x + y
7 If - then - else:
Cú pháp: If exps then state _ exp1
[else state _ exp2];
hay if exps1 then state _ exp1
else if exps2 then state _ exp2 [else if …]
else state _ expn;
_ Exps : là bất kỳ biểu thức hợp lệ nào
_ State _exp1, state _ exp2 … : là biểu thức biểu diễn trạng thái kế tiếp Mục đích - cách dùng:
Phát biểu if - then - else : mô tả sự chuyển hóa trạng thái theo điều kiện ngõ vào Nếu biểu thức ngay sau từ khóa if là đúng, chuyển biến hướng đến trạng thái ngay sau từ khóa then; nếu sai chuyển biến hướng đến trạng thái ngay sau từ khóa else Các phát biểu if - then - else có thể được nối với nhau liên tiếp nhưng kết thúc phải là dấu chấm phẩy
Ví dụ:
state 1: if (A = = B) then 2; "nếu A = B chuyển đến trạng thái 2
state 2: if A then 3 else 4; "nếu A đúng ( 0) chuyển đến trạng thái 3"
"nếu A sai (= 0) chuyển đến trạng thái 4"
state 0: if a then 1
else if b then 2
else if c then 3
Trang 5Biên soạn Ngô Văn Bình
else 0;
8 Phát biểu case:
Cú pháp: case [exps1 : state_ exp1;]
[expsi : state _ expi;]
9 Phát biểu test _ vectors:
Cú pháp: Test vectors['note'] (inputs -> outputs)
[invalues -> out values]
Note: là một chuỗi ký tự để mô tả các test _ vector
Inputs: là một danh hiệu hay tập hợp danh hiệu tên các tín hiệu vào hay hồi tiếp
về ngõ vào của hệ
Outputs là một danh hiệu hay tập hợp danh hiệu tên các tín hiệu ra của hệ
Invalues là một hay tập hợp các giá trị vào
Outvalues là một hay tập hợp các giá trị ra là hàm logic của các giá trị vào và giá trị trạng thái (hệ tuần tự)
Trang 6Biên soạn Ngô Văn Bình
Cú pháp: signal [ , signal] … istype 'attr [ , attr]…';
hay signal [ , signal] … pin is type 'attr [ , attr] …';
_ Signal là một danh hiệu pin hay node
_ Attr là một chuỗi ký tự xác định các thuộc tính (attribution) của các signal
'neg' : tính cực mức thấp 'pos' : tính cực mức cao 'reg' : thanh ghi (hệ tuần tự) 'reg D', 'reg _T', 'reg _ JK', 'reg _SR': các FF, D, T, JK, SR
Ví dụ: FO, A istype 'neg, reg'
Istype định nghĩa FO, A là tín hiệu của thanh ghi, tác động mức thấp Output pin 15 istype 'reg, invert';
Tín hiệu output chân 15 của thanh ghi ngõ đảo (ngõ ra Q)
Pin _id là một danh hiệu dùng để đặt tên cho một chân
Pin # là số thứ tự chân trên dụng cụ (PLD) thật
Attr: là một chuỗi xác định các thuộc tính của chân
Trang 7Biên soạn Ngô Văn Bình
! : ký hiệu NOT, tích cực mức thấp
Mục đích - cách dùng:
Từ khóa pin dùng để khai báo những tín hiệu input và output, là những tín hiệu in / out qui định sẵn trên dụng cụ (theo sổ tra cứu) Khai báo cũng có thể định nghĩa thuộc tính chân
Khi một danh sách danh hiệu chân và số chân có trong cùng một khai báo chân,
sẽ có tự tương xứng 1 - 1 giữa danh hiệu chân và số chân
Ví dụ: !clock, reset, S1 pin 12, 15,3;
Khai báo này gán tên chân: clock chân 12, reset chân 15, S1 chân 3
!clock: tác động mức thấp
2 Nút (node):
Cú pháp: [!]node_id[,[!]node_id …]node [node# [,nod # …][istype 'attr'];
_ Node_id là một danh hiệu dùng để đặt tên một nút
_ Node # là số thứ tự nút trên dụng cụ thật (nút tương đương như chân ẩn trong dụng cụ và số nút được cho trong sổ tay tra cứu)
Cú pháp: device-id device real_device;
Device-id là một danh hiệu, chính là tên file fusemap
Real-device là chuỗi mô tả mã số dụng cụ (PLD) đặt giữa 2 dấu nháy đơn (')
Mục đích - cách dùng:
Khai báo dụng cụ gắn tên dụng cụ sử dụng trong một module với một dụng cụ (PLD) thật Trong quá trình biên dịch, các hàm logic sẽ được đưa về dạng theo cấu trúc cổng đúng như của dụng cụ thật
Phải đặt dấu; sau khai báo
Ví dụ: D1 device 'P16R4';
Khai báo này cho biết D1 là loại PLD PAL 16R4
3.3 CÁC KHAI BÁO KHÁC (OTHER DEDARATIONS):
1 Hằng (Constant):
Trang 8Biên soạn Ngô Văn Bình
Cú pháp: id [, id]… = expr [, expr]…;
id là một danh hiệu đặt tên cho một hằng
expr xác định giá trị hằng
Mục đích - cách dùng:
Khai báo hằng định nghĩa những hằng số được dùng trong một module
Ví dụ: X = X ; "X mang ý nghĩa không xác định
Z = Z ; "Z mang ý nghĩa tổng trở cao
C = C ; "C mang ý nghĩa tác động cạnh lên
Cú pháp: macro_id macro [(dummy_arg [, dummy_arg]…)]{block};
_ macro_id : là một danh hiệu đặt tên cho macro
Trang 9Biên soạn Ngô Văn Bình
_ dummy_arg : là một thông số hình thức
_ block : là các biểu thức logic
Mục đích - cách dùng: Khai báo macro định nghĩa một macro thực hiện các chức năng các phép toán, biểu thức logic trong block
Chỉ định nghĩa macro một lần trong phần khai báo macro trong module và sẽ được dùng bất cứ nơi nào trong module
Khai báo macro tương tự như trong trình hợp ngữ
Macro chỉ có thể được dùng trong module mà nó được khai báo
Ví dụ:
NAND 3 macro (A, B, C) { ! (A&B&C)}
NAND3 là macro thực hiện chức năng hàm logic A.B.C, với A, B, C là các thông số hình thức
Sau đó trong mudule khai báo macro này ta có khai báo:
D = NAND 3 (Clock, Hello, busy) ;
Sẽ cho kết quả : D = ! (Clock & Hello & Busy) khi biên dịch
4 Enable:
Cú pháp: Enable output_id = [!] expr ;
Output_id là danh hiệu đặt tên cho một ngõ ra hoặc một tập hợp ngõ ra
Expr là một biểu thức logic
Trang 10Biên soạn Ngô Văn Bình
& : AND
$ : XOR
!$: XNOR
= : toán tử gán cho biểu thức tổ hợp
: = : toán tử gán cho biểu thức thanh ghi (tuần tự)
Ngoài ra từ khóa @ ALTERNATE báo cho trình biên dịch biết bộ toán tử tương đương (atternate) thay thế cho bộ toán tử chuẩn (các ký hiệu dễ nhớ hơn)
Bộ toán tử thay thế (phải có từ khóa @ ALTERNATE ở đầu module chương trình)
/ : NOT
* : AND + : OR :+: : XOR :* : : XNOR
2 Toán tử so sánh:
= = : bằng
! = : không bằng
< : nhỏ hơn > : lớn hơn
<= : nhỏ hơn hoặc bằng
> = : lớn hơn hoặc bằng Ngoài ra còn cho phép viết các biểu thức điều kiện, biểu thức này sẽ trả về 1 nếu thỏa điều kiện và trả về 0 nếu không thỏa điều kiện
Q0.CK truy xuất đến chân clock của tín hiệu ra Q0 ở chế độ thanh ghi
Tương tự như đối với RE, PR, D, T … lần lượt truy xuất đến các chân reset, preset, D, T của thanh ghi
Tiếp vĩ ngữ OE cho phép xuất ở ngõ ra 3 trạng thái
Ví dụ: out.oe = !ena ; ena = 0 -> ngõ ra out được phép xuất
Trang 11Biên soạn Ngô Văn Bình
ena = 1 -> ngõ ra out ở trạng thái high-Z
3.6 TRÌNH BIÊN DỊCH NGÔN NGỮ ABEL V2.02:
3.6.1 Sọan thảo file nguồn:
Ta có thể dùng bất kỳ trình soạn thảo văn bản trong NC, EDLINE, SK… để soạn
thảo file nguồn Chỉ cần lưu ý là phần mở rộng của tên file nugồn phải là “.ABL”
Ví dụ: encoder.abl
Để thuận tiện cho biên dịch ta nên dùng phần soạn thảo văn bản trong NC để soạn thảo file nguồn
1 Trong môi trường NC nhấn Shift + F4
2 Đánh tên file.abl vào khung hội thoại, nhấn Enter
3 Bắt đầu soạn thảo file nguồn (file.abl)
4 Sau khi soạn thảo kết thúc nhấn F2 để lưu file
3.6.2 BIÊN DỊCH:
1 Vào thư mục ABEL, nạp file nguồn vào trong thư mục này
2 Đánh lệnh abe tên file (không cần đánh phần mở rộng), trình biên dịch bắt đầu làm việc và cho ra các file kết quả:
File.lst : file liệt kê lại file nguồn có số thứ tự từng dòng và có thông báo lỗi từng dòng (nếu có)
File.doc: file liệt kê các phương trình, biểu thức Boole đã rút gọn theo cấu trúc dụng cụ (device) đã khai báo, đồng thời có vẽ hình sơ đồ chân dụng cụ với ký hiệu tương ứng gán vào chân
File.sim: là file kết quả mô phỏng dưới dạng bảng sự thật theo các test-vectors chỉ báo ở file nguồn
File*.jed: với file* là danh hiệu đặt cho device trong phần khai báo decive ở file nguồn
Các trường hợp xảy ra khi biên dịch
Lỗi cú pháp: Kết quả trả về chỉ có file.lst mà không có xuất hiện các file còn lại
Ta phải xem lại file.lst (nhấn F3 hoặc F4 trong NC) để biết lỗi và sửa lại file.abl rồi biên dịch lại cho đến khi file.lst không báo lỗi Đây là trường hợp thường xảy ra nhất, cần phải lưu ý
Các lỗi còn lại như vector mô phỏng (trong test-vectors) không phù hợp, cấu trúc dụng cụ không thích hợp với hệ thiết kế…, sẽ được khai báo trong quá trình biên dịch ở môi trường DOS và trên các file.sim hoặc file.jed hoặc file.doc tùy theo loại lỗi Như vậy công việc biên dịch từ file nguồn xem như hoàn chỉnh khi kết quả biên dịch trả về đầy đủ 4 file đã nói trên và không có báo lỗi trong file.lst cũng như trong các file còn lại
Ghi chú:
Trang 12Biên soạn Ngô Văn Bình
Để có thể xem xét được kết quả mô phỏng theo test-vectors trong file.sim, ở file nguồn phải được thêm từ khóa flag'-t1' ngay sau chỉ dẫn / phát biểu module mod-name
Ví dụ: module decol2-4 flag'-t1-'
3.7 GIỚI THIỆU TÓM TẮT CẤU TRÚC GAL16V8 và GAL20V8
Các dụng cụ PLD sử dụng trong các bài thí nghiệm đều dùng GAL16V8 hoặc GAL20V8 Trong phần này sẽ giới thiệu tóm tắt cấu trúc các mode làm việc của các dụng cụ trên và cách khai báo device tương ứng mode làm việc
3.7.1 GAL16V8: ( xem thêm ở phần phụ lục)
1 Mode thanh ghi (Registered mode) (hình 3.1&3.2)
Sử dụng mode thanh ghi nếu cần có thanh ghi trong thiết kế (tối đa 8 DFF xem hình 0.6a,b) Mỗi macrocell có thể được định hình ngõ ra của thanh ghi (hệ tuần tự), ngõ ra của hệ tổ hợp, I/O hoặc ngõ vào Trường hợp macrocell là ngõ ra thanh ghi hoặc I/O, ngõ ra được cho phép xuất bằng chân OE, thanh ghi được kích xung CK từ ngõ CLK Tám khối tích (product terms) nối đến khối tổng (sum terms) Trường hợp macrocell là ngõ ra hệ tổ hợp hoặc I/O, tín hiệu cho phép xuất được điều khiển bằng một khối tích và 7 khối tích còn lại nối đến khối tổng (hình 0.6b) Khi macrocell được định là ngõ vào, tín hiệu cho phép xuất phải ở trạng thái không cho phép xuất
2 Mode phức (complexmode) (hình 3.1&3.2):
Trong mode phức, các ngõ ra hệ tổ hợp và các chức năng I/O được sử dụng Chân 1 và 11 là các ngõ vào bình thường Chân 13 đến chân 18 có các đường hồi tiếp
về dãy AND để tạo chức năng I/O đầy đủ Chân 12 và 19 là ngõ bình thường (thường được dùng làm ngõ ra), không được dùng làm ngõ vào Trong mode này, mỗi
Trang 13Biên soạn Ngô Văn Bình
macrocell có 7 khối tích dẫn đến khối tổng và một khối tích tạo tín hiệu cho phép xuất Các ứng dụng hệ tổ hợp cần tín hiệu OE điều khiển thường được sử dụng mode này
3 Mode đơn (simple mode) (hình 3.1&3.2):
Trong mode đơn, 8 khối tích nối đến khối tổng Chân 15 và 16 (các macrocell giữa) thường được định là ngõ ra hệ tổ hợp Các macrocell khác có thể là ngõ vào hoặc ngõ ra hệ tổ hợp có chân hồi tiếp về dãy AND Chân 1 và 11 là ngõ vào bình thường
Sử dụng mode này cho các ứng dụng hệ tổ hợp không cần ngõ điều khiển OE
3.7.2 GAL20V8 ( xem thêm ở phần phụ lục)
Sơ đồ chân GAL20V8 như hình 3.2
So với GAL16V8, GAL20V8 có thêm 4 ngõ vào
3.7.4 Các Mode làm việc:
1 Mode thanh ghi (hình 3.1&3.2)
Tương tự như mode thanh ghi GAL16V8
2 Mode phức (hình 3.1&3.2)
Tương tự như mode phức GAL16V8, chân 22,15 là ngõ ra bình thường, không
có đường hồi tiếp về dãy AND
3 Mode đơn (hình 3.1&3.2):
Tương tự như mode đơn GAL15V8 Chân 18,19 là ngõ ra bình thường, không có đường hồi tiếp về dãy AND
* Khai báo device cho trình biên dịch:
Trong khai báo decive chọn - dụng cụ, để trình biên dịch làm việc đúng, ta phải khai báo mode làm việc thích hợp cho 2 loại GAL trên tùy theo yêu cầu thiết kế Danh hiệu khai báo device như sau:
Trang 14Biên soạn Ngô Văn Bình
3 'P16V8R', 'P20V8R': Sử dụng mode thanh ghi
Ví dụ: Trong thiết kế hệ tổ hợp không sử dụng ngõ ra 3 trạng thái, dùng
GAL16V8, ta khai báo: U1 device 'P16V8S'
3.8 CÁC VÍ DỤ:
3.8.1 VÍ DỤ 1:
Thiết kế bộ phân kênh 1 -> 8 dùng PAL16V8 như hình 0.1
Ngõ vào : x
Ngõ ra : y0, y1, y2, y3, y4, y5, y6, y7
Điều khiển chọn kênh : S2, S1, S0
Tín hiệu cho phép ngõ ra : OE
Tùy theo tổ hợp mà chọn kênh S2, S1, S0 tín hiệu ra y0 - y7 sẽ lấy giá trị x khi
OE = 1 Các ngõ ra ở trạng thái hi-Z khi OE = 0
Hình 3.3
* Chương trình:
1 module dmux1_8
2 title '1 to 8 line demultiplexer
4 "Các khai báo
5 U1 device 'P16V8s' ;
6 y0, y1, y2, y3 pin 12, 13, 14, 15 ;
7 y4, y5, y6, y7 pin 16, 17, 18, 19 ;
8 S0, S1, S2 pin 1, 2, 3 ;
10 H, L, Z = 1, 0, Z ; "Hang
11 select = [S2, S1, S0]; "Tap hop
12 outputs = [y7, y6, y5, y4, y3, y2, y1, y0]; "Tap hop
13 equations
14 !y0 = (select = = 0)&x;
15 !y1 = (select = = 1)&x;
OE
x
S2 S1 S0
16V8