Sử dụng sơ đồ cấu trúc Atmega103 ta có thể tạo ra những mô hình VHDL riêng biệt cho những khối mà được nối tới những bus bên trong và sau đó thiết kế khối điều khiển tới xử lý toàn bộ thứ tự sắp xếp liên quan và những cờ điều khiển lần lượt các khối.
Trước khi việc này có thể được bắt đầu, cần xác định tiêu chuẩn cơ bản của những mô hình và đầu tiên là định nghĩa kiểu cơ bản. Trong bất kỳ mô hình số nào nó biết chắc chắn rằng dữ liệu có thể được truyền qua những mô hình tiêu chuẩn và vì thế trong trường hợp này ta sẽ sử dụng thư viện std_logic_1164 làm tiêu chuẩn cho những mô hình số.
Để sử dụng thư viện này, mỗi tín hiệu sẽ được định nghĩa kiểu std_logic cơ bản và thư viện ieee.std_logic_1164.all sẽ được khai báo ở đầu mục trong những mô hình của bộ vi xử lý.
Mỗi khối trong vi xử lý sẽ được định nghĩa như một khối riêng rẽ cho hệ thống xử lý trong VHDL. Để đơn giản hoá VHDL cho những khối riêng lẻ, một tập những chức năng tiêu chuẩn được định nghĩa trong một gói gọi là hàm chức năng được dùng cho những kiểu định nghĩa và những chức năng cho tập mô hình
4.2.1 ALU
Một phần quan trọng của những vi xử lý là ALU (Arithmetic Logic Unit). Khối này trong vi xử lý lấy một số đầu vào từ những thanh ghi và
thực hiện những hàm logic (not, and, or, xor) trên những đầu vào, hay những chức năng số học (cộng, trừ).
Để thiết bị hoạt động như một bộ vi xử lý, ta phải định nghĩa tập lệnh cơ bản. Những tập lệnh ALU, hàm bộ nhớ được thực hiện:
ADD, ADC, ADIW
SUB, SUBI, SBC, SBCI, SBIW INC, DEC
AND, ANDI OR, ORI, EOR
COM, NEG, CP, CPC, CPI, SWAP LSR, ROR, ASR
MUL, MULS, MULSU FMUL, FMULS, FMULSU MOV, MOVW
Trong tập lệnh cơ bản này, có 32 lệnh riêng biệt, ta dùng 8 bit để mô tả từng lệnh trên. Muốn có 8 bit cho mỗi từ dữ liệu, cần có khả năng cất giữ chương trình trong ROM với những từ mã ít nhất rộng 16 bit. Để cung cấp một số lớn những lệnh, và cũng cần vị trí cho bảng liệt kê của những chế độ địa chỉ khác nhau (sự khác nhau giữa những số độc lập và những biến). Ta có thể thành lập một hệ thống 16 bit cho bộ nhớ chương trình.
Các cờ trong ALU:
H (half carry): Chỉ báo cho thấy sự mang sang (nhớ) một nửa trong một số lệnh toán học.
định N và cờ tràn (Overflow).
V (two's complement): Cờ tràn lấy bù nhị phân. N (negative): Cờ phủ định.
Z (zero): Cờ số 0. Chỉ báo một kết quả bằng 0 sau khi thực hiện một phép tính số học hoặc logic.
C (carry): Cờ mang. Báo hiệu sự mang sang trong phép tính số học hoặc logic
Hình 4.1: Sơ đồ kết nối ALU
4.2.1 Tệp thanh ghi
Việc thiết kế những thanh ghi một phần phụ thuộc vào sự mong muốn một bản sao của Atmega103 hay tạo lên một phiên bản điều chỉnh. Trong mọi trường hợp có một vài thanh ghi bắt buộc phải được định nghĩa. Giả thiết với 2 cổng vào/ra (PORTA, PORTB), ngoài dữ liệu cho những cổng, ta cần định nghĩa hướng cổng và yêu cầu 2 thanh ghi nữa để quản lý những bộ đệm 3 trạng thái vào trong bus dữ liệu đi và đến các cổng (DDRA, DDRB). Ngoài ra ta có thể định nghĩa một số thanh ghi để sử dụng cho
những mục đích chung. Việc đặt tên trong trường hợp tổng quát, thứ tự và số của các thanh ghi không quan trọng. Để sử dụng lõi như là mô hình mẫu, và sẽ sử dụng mã bit giống như thế, thì những thanh ghi cấu hình phải khớp với bản chính và chế độ phải giống nhau. Để kết nối những thanh ghi này ta cần có một bộ giải mã nhỏ để lựa chọn đúng thanh ghi và đặt nội dung lên bus dữ liệu.
4.2.3 Bộ nhớ vào/ra
Bộ nhớ vào/ra là con đường đến với tất cả các bộ phận ngoại vi của bộ xử lý. Nó được thiết kế giống như RAM, bao gồm một tệp những thanh ghi riêng biệt. Bộ nhớ vào/ra có một cổng đọc/ghi tổng hợp và được định hướng, cổng đọc/ghi được phân biệt bởi các thanh ghi trong bộ nhớ vào/ra. Mỗi thanh ghi bộ nhớ vào/ra được gán một địa chỉ duy nhất trong không gian IO.
1. Cổng vào/ra thông thường
Nó có thể đọc những byte từ các thanh ghi vào/ra tới đầu ra và ghi những byte từ đầu vào tới những thanh ghi vào/ra. Đồng thời nó có thể có một số xử lý bit: tải những bit từ cờ T trong SREG tới đầu ra, lưu trữ bit từ đầu vào tới bit T trong thanh ghi trạng thái SREG; thiết đặt, xoá những bit vào/ra. Những mã lệnh sau đây được thực hiện:
- Đọc byte (dùng những lệnh IN, SBIC, SBIS) - Ghi byte (OUT)
- Xoá bit (CBI) - Thiết đặt bit (SBI) - Tải bit (BLD) - Lưu bit (BST)
2. Thanh ghi trạng thái SREG
Thanh ghi trạng thái có chứa 8 bit cờ, đóng vai trò báo hiệu trạng thái hiện tại của bộ xứ lý. Tất cả các bit đó được xoá khi reset và có thể được đọc hoặc ghi bởi chương trình.
3. Thanh ghi con trỏ ngăn xếp SP
Phương pháp tiêu chuẩn để việc thực hiện chương trình trong một vi xử lý là cất giữ chương trình trong bộ nhớ của vi xử lý và sau đó là một chuỗi những sự kiện để thực hiện những quy trình. Đầu tiên là sử dụng bộ đếm chương trình để tăng dần dòng chương trình, sau đó gọi những lệnh kế tiếp từ bộ nhớ, sau đó chương trình có thể được tải vào trong thanh ghi lưu trữ để thực hiện.
Đầu tiên nội dung của con trỏ chương trình được tải vào thanh ghi địa chỉ bộ nhớ (MAR). Dữ liệu trong ô nhớ sau đó được khôi phục và tải vào trong thanh ghi dữ liệu bộ nhớ (MDR). Nội dung của MDR sau đó có thể được chuyển vào trong thanh ghi lệnh (IR). Trong một vi xử lý đơn giản, con trỏ chương trình có thể sau đó được tăng lên 1.
Một mã lệnh (và những tham số thích hợp) được tải, sau đó lệnh có thể được thực hiện. Thực chất mỗi lệnh có cấu trúc trạng thái và đường điều khiển được liên kết tới IR và một chuỗi định nghĩa những tín hiệu điều khiển được yêu cầu chuyển chính xác dữ liệu quanh bộ nhớ và những thanh ghi cho những lệnh kia.
4.2.7 Bộ nhớ dữ liệu
Bộ nhớ dữ liệu là một RAM cổng đơn, cổng này cung cấp khả năng đọc ghi để truy nhập bộ nhớ.
Bộ xử lý yêu cầu một bộ nhớ RAM với một thanh ghi địa chỉ và thanh ghi dữ liệu bởi vậy cần một tín hiệu tải cho mỗi thanh ghi. Như một bộ
nhớ, nó cần một tín hiệu cho phép và cần một tín hiệu biểu thị kiểu đọc hay ghi. Cuối cùng kết nối tới bus hệ thống là một vectơ tiêu chuẩn.
Hình 4.2: Sơ đồ kết nối bộ nhớ dữ liệu
4.2.8 Bộ nhớ chương trình
Những lệnh của AVR là những từ 16 bit nên bộ nhớ chương trình được tổ chức thành những từ 16 bit.
Bộ nhớ chương trình về bản chất là tập hợp những giá trị dữ liệu được cất giữ trong thanh ghi. Bộ nhớ có 2 định nghĩa, đầu tiên là một số những vùng lưu trữ và tiếp theo là số bit. Ví dụ, nếu bộ nhớ có 16 vùng nhớ 16 bit, bộ nhớ được định nghĩa là ROM 16x16. ROM cơ bản có một đầu vào, địa chỉ truy nhập, một đầu ra là một vector logic, vị trí dữ liệu được đặt. Thực thể cho mô hình ROM:
entity prom is port (
address_in : in std_logic_vector (15 downto 0); data_out : out std_logic_vector (15 downto 0)); end prom;
Hình 4.3: Sơ đồ kết nối của bộ nhớ chương trình
Địa chỉ phải được định nghĩa là số nguyên, nhưng phạm vi hạn chế bởi phạm vi của ROM. Kiến trúc của ROM được định nghĩa như một mảng cố
định những phần tử có thể được truy nhập trực tiếp.
4.2.9 Các ngắt
Lõi của hệ thống ngắt là module quản lý ngắt. Nó ưu tiên những nguồn ngắt, kiểm tra nếu những ngắt được cho phép và nếu đường ống sẵn sàng xử lý những ngắt và cuối cùng gửi những yêu cầu tới đường ống, đồng thời liên kết vectơ ngắt với những tín hiệu điều khiển đường ống khác.
Ống dẫn thừa nhận những yêu cầu ngắt bằng cách buộc phần giải mã lệnh giải mã lệnh gọi, với địa chỉ nhảy tuyệt đối được đưa ra bởi phần quản lý ngắt. 2 lệnh tiếp theo đã vô hiệu được thoát ra.
Vectơ ngắt được tham số hoá và có thể được đặt bất cứ đâu trong bộ nhớ chương trình.
Mọi ngắt đều có quyền ưu tiên được tham số hoá.
2 nguồn ngắt được thực hiện : ngắt ngoài 0 và ngắt time 0.
Ngắt có độ trễ là 5 chu kỳ đồng hồ (một chu kỳ cần cho phần quản lý ngắt, 4 chu kỳ cần cho việc gọi)
4.2.10 Thiết bị ngoại vi
Một cổng IO, một ngắt ngoài, một bộ định thời 8 bit được thực hiện để kiểm tra sự đúng đắn của hệ thống ngắt. Thiết bị ngoại vi được thiết kế tách rời với lõi, chúng có thể được nâng cấp dễ dàng mà không cần tác động đến lõi.
1. Cổng A
Cấu trúc cổng A:
Cổng A đưa ra 8 đường IO dùng chung hai chiều,những chân được cung cấp những điện trở kéo bên trong.
Cổng A được quản lý thông qua 3 thanh ghi: PORTA, DDRA và PINA. DDRA đặt hướng dữ liệu cho các chân cổng A, DDRA(i)=0 thì chân i là đầu vào, DDRA(i)=1 thì chân i là đầu ra. Khi ghi một giá trị ra cổng, thì giá trị này sẽ vào PORTA, Nếu DDRA định hình những đường tương ứng như là đầu ra, nội dung của PORTA sẽ sẵn sàng trên những chân bên ngoài. Tuy nhiên nếu DDRA định hình những đường tương ứng là đầu vào thì:
- Nếu PORTA(i)=0, đường i là đầu vào thuần tuý (trở kháng cao). - Nếu PORTA(i)=1, đường i là một đầu được kéo cao.
PINA đọc những giá trị vật lý của những đường bên ngoài.
Hình 4.4: Mô tả chi tiết một trong các bit cổng
Thực tế các chân vào/ra còn có thể làm các chân chức năng khác nên sơ đồ có thể thay đổi
2. Bộ định thời
Bộ định thời trong vi điều khiển AVR có chức năng giống như một bộ định thời hoặc một bộ đếm. Khi là bộ định thời, tín hiệu giữ nhịp bên trong hoặc một dẫn xuất của tín hiệu dữ nhịp đó được sử dụng để giữ nhịp bộ
định thời, khi là bộ đếm, một tín hiệu từ bên ngoài ở chân của một cổng được dùng để giữ nhịp bộ định thời. Hình 4.5 mô tả bộ dồn kênh đóng vai trò lựa chọn một trong những nguồn tín hiệu đồng hồ dùng cho bộ định thời/bộ đếm:
Hình 4.5: Mạch chia tần số đồng hồ dùng cho bộ định thời
Sơ đồ khối bộ định thời/bbọ đếm 8 bit được mô tả trên hình 4.6:
Hình 4.6 Sơ đồ khối bộ định thời/bộ đếm 8 bit
Bộ timer/counter có thể lựa chọn nguồn tín hiệu đồng hồ từ CK, được chia từ CK hay một chân bên ngoài. Ngoài ra nó có thể được làm ngừng bằng cách sử dụng các bit điều khiển trong thanh ghi điều khiển
timer/counter TCCR. Các trạng thái tràn (overflow) được tìm thấy trong thanh ghi cờ ngắt bộ định thời/bộ đếm TIFR. Việc đặt cho phép/cấm ngắt đối với bộ định thời/bộ đếm được tìm thấy trong thanh ghi che ngắt TIMSK. Khi bbộ định thời/bộ đếm được giữ nhịp từ bên ngoài, tin hiệu bên ngoài được đồng bộ với tần số của bộ dao động của CPU. Để dảm bảo lấy mẫu chính xác đối với tín hiệu giữ nhịp từ bên ngoài, thời gian cực tiểu giữa hai lần xảy ra sự chuyển mức tín hiệu đồng hồ ít nhất cũng bằng một chu kỳ đồng hồ bên trong CPU.
3. Ngắt ngoài
Nó được liên kết với cờ ngắt trong thanh ghi GIFR (General Interrupt Flags Register)
Ngắt được cho phép hay không cho phép bằng cách thiết lập hay xoá bit 6 trong thanh ghi GIMSK (General Interrupt Mask)
Nếu được cho phép, nó có thể thúc đẩy một ngắt chuyển tiếp từ mức cao xuống mức thấp, thấp lên cao hay mức thấp của đầu vào ngắt 0. Trạng thái này được định nghĩa bởi 2 bit trên thanh ghi GIMSK (General Interrupt Mask)