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

VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG

102 327 5

Đ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

Tiêu đề Thiết Kế Chuẩn Giao Tiếp UART Bằng Verilog
Người hướng dẫn Thầy Phan Xuân Vũ
Trường học Trường Đại Học Bách Khoa Hà Nội
Chuyên ngành Kỹ Thuật Điện Tử
Thể loại Báo Cáo
Năm xuất bản 2020
Thành phố Hà Nội
Định dạng
Số trang 102
Dung lượng 1,95 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

There is a basic UART that support optional parity bit, settable baud and data width, written in Verilog with testbenches. Mô tả hoạt động: Ở phía phát nhận 8 bit dữ liệu từ buffer và tạo ra 1 bit parity để gửi sang bên phía nhận. Bên phía nhận thực hiện nhận 8 bit dữ liệu và 1 bit parity từ bên phát gửi sang và cũng tạo bit parity từ 8 bit dữ liệu nhận được đó, sau đó thực hiện so sánh bit parity tạo ra đó với bit parity từ bên phát gửi sang. Nếu 2 bit đó giống nhau thì thực hiện đẩy dữ liệu nhận được ra buffer, ngược lại thì không đưa dữ liệu ra buffer.

Trang 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ - VIỄN THÔNG

BÁO CÁO MÔN HỌC THIẾT KẾ VLSI

THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG

Nhóm sinh viên thực hiện:

Trang 2

Đầu vào: Các khung dữ liệu, mỗi khung dữ liệu gồm 8 bit dữ liệu

Đầu ra: Các khung dữ liệu nhận từ phía phát

Mô tả hoạt động: Ở phía phát nhận 8 bit dữ liệu từ buffer và tạo ra 1 bit parity để gửisang bên phía nhận Bên phía nhận thực hiện nhận 8 bit dữ liệu và 1 bit parity từ bênphát gửi sang và cũng tạo bit parity từ 8 bit dữ liệu nhận được đó, sau đó thực hiện sosánh bit parity tạo ra đó với bit parity từ bên phát gửi sang Nếu 2 bit đó giống nhau thìthực hiện đẩy dữ liệu nhận được ra buffer, ngược lại thì không đưa dữ liệu ra buffer.Các thông số kĩ thuật:

• Baud rate: 19200 bit/s

• Số lượng bit của 1 khung dữ liệu : 8

• Parity bit: 1 bit parity

• Stop bit: 1 (Thời gian truyền 16 x baudrate)

• Thời gian truyền 1 bit: 16 x baudrate

Hình dưới đây mô tả sơ đồ truyền 1 khung dữ liệu từ bên phát sang bên thu: Thứ tựtruyền được thực hiện là 8 bit dữ liệu sau đó là bit parity

Sơ đồ khối UART

Trang 3

BẢNG PHÂN CÔNG CÔNG VIỆC

LỜI NÓI ĐẦU

Trong kì học 20202, môn học thiết kế VLSI là môn học chúng em được ThầyPhan Xuân Vũ giảng dạy và hướng dẫn Vì chúng em là sinh viên năm 4 -K62 việnĐiện tử Viễn thông có lựa chọn định hướng Kĩ thuật điện tử, kĩ thuật máy tính nêntrước khi đăng kí môn học này, chúng em cũng khá mong đợi được tìm hiểu, học tập

và thực hành các nội dung của môn học, mong muốn đây có thể là một lựa chọnchuyên môn để sau khi ra trường có thể làm việc ở lĩnh vực thiết kế hệ thống số

Sau quá trình học tập, chúng em cũng đã tích lũy được các kiến thức của mônhọc, khả năng sử dụng phần mềm và thực hiện thiết kế một hệ thống số và thực hiệnlập trình bằng verilog

Để đáp ứng yêu cầu đánh giá của môn học và trao dồi kĩ năng thiết kế hệ thống,

kĩ năng lập trình verilog nên nhóm chúng em thực hiện đề tài: “THIẾT KẾ CHUẨNUART BẰNG VERILOG” Trong nhóm chúng em, không phải tất cả các bạn đều cóđịnh hướng Kĩ thuật điện tử, nhưng quá trình làm việc nhóm gắn bó, nghiêm túc,mỗi thành viên trong nhóm chúng em cũng đã học tập ở nhau nhiều điều và trao dồicác kiến thức kĩ năng cần thiết cho mình

Chuẩn UART chúng em thực hiện truyền 8 bit dữ liệu, 1 bit parity và 1 bit stopvới baud rate là 19200 Do tình hình phức tạp của dịch Covid – 19 nên quá trình thựchiện bài tập lớn của chúng em có phần ảnh hưởng Theo spec chúng em gửi Thầy banđầu, chúng em định thực hiện trên kit FPGA nhưng do nhà trường đóng cửa, chúng emkhông lên lab được để thực hiện trên kit, đó cũng là điều mà nhóm hơi tiếc nuối

Trang 4

Chúng em nghĩ rằng, sau môn học thiết kế VLSI này, chúng em có nền tảng đểtìm hiểu sâu về thiết kế hệ thống số, lập trình verilog để sau này ra trường có thể làmviệc trong lĩnh vực này Chúng em cũng học ở Thầy rất nhiều điều về nội dung mônhọc, phong cách làm việc và định hướng công việc Chúng em xin cảm ơn Thầy rấtnhiều về những nội dung Thầy giảng dạy, hướng dẫn và chia sẻ.

Dù chúng em đã nghiêm túc, cố găng thực hiện bài tập lớn nhưng vì điều kiệnthời gian và hạn chế về kiến thức nên chúng em còn nhiều thiếu sót và khi thực hiệnbit parity mới có chức năng báo lỗi mà chưa có chức năng truyền lại hay sửa lỗi.Chúng em mong nhận được sự góp ý, đánh giá của Thầy để chúng em có thể tích lũythêm kiến thức và hoàn thiện bộ UART của chúng em

Chúng em xin chân thành cảm ơn Thầy

NHÓM SINH VIÊN

Trang 5

MỤC LỤC

Trang 6

DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT

UART Universal asynchronous receiver-transmitter

FSM Finite-state machine

FSM Finite-state machine with datapath

FIFO First In, First Out

Trang 7

DANH MỤC HÌNH VẼ

Trang 8

DANH MỤC BẢNG BIỂU

Trang 9

Chương 2: Chúng em trình bày về spec của chuẩn UART mà nhóm thực hiện vàtiến hành thiết kế Nhóm thiết kế sơ đồ khối của bộ UART gồm 4 module là: Bộ thu,

bộ phát, bộ tạo baud rate và khối buffer Trong mỗi module có mô tả chi tiết về cáchthức hoạt động của module, thiết kế chi tiết và bảng tín hiệu để thực hiện cho quá trìnhlập trình verilog

Chương 3: Chúng em trình bày về kết quả mô phỏng bộ UART mà nhóm thựchiện Chúng em thực hiện kiểm tra kết quả mô phỏng của 4 module và thực hiện kiểmtra mô phỏng khi ghép nối bộ phát và bộ thu

Phần code degisn và testbench của bài tập lớn, chúng em có trích dẫn ở phần phụlục

Trang 10

CHƯƠNG 1 GIỚI THIỆU CHUNG

Trong chương này, chúng em giới thiệu về chuẩn giao tiếp UART, ứng dụng củaUART và cơ sở lý thuyết, phương pháp thiết kế loại mạch tổ hợp, mạch dãy, máy trạngthái (FSM), máy trạng thái với đường dữ liệu (FSMD) bằng verilog

1.1 Giới thiệu về chuẩn giao tiếp UART

1.1.1 Giới thiệu chung

Chuẩn giao tiếp UART (universal asynchronous receviver and transmitter) là mộtgiao thức truyền thông nối tiếp không đồng bộ Năm 1960 hiệp hội điện tử ETA đã xâydựng một chuẩn giao tiếp là RS – 232 , chuẩn này được được sử dụng cho giao tiếp dữliệu nối tiếp Bên cạnh RS – 232 , còn có các chuẩn RS – 422 , RS – 485 phổ biếnđược áp dụng cho mạch UART Các chuẩn này đề xuất nhiều tính thực tế trong giaotiếp hơn nhiều so với RS -232

Một khung dữ liệu trong UART bao gồm 1 bit start, 5-8 bit dữ liệu, bit parity (tùychọn) và bit stop Bit stop có thể có độ dài 1, 1.5 hoặc 2 bit

Dữ liệu được truyền từng bit theo khung, bit đầu tiên được truyền là bit start(mức logic 0), tiếp theo là các bit data, có thể có bit parity, cuối cùng là bit stop (mứclogic 1)

Hình 1 1 Cấu trúc truyền dữ liệu của UART

Hình ảnh trên mô tả cấu trúc truyền dữ liệu của bộ UART truyền 8 bit/ khung dữliệu, không có bit parity và sử dụng một bit stop

Trang 11

1.1.2 Ứng dụng của UART

UART là một trong những kỹ thuật Giao tiếp nối tiếp đơn giản nhất và được sửdụng phổ biến nhất UART xuất hiện trong hầu hết các bộ vi điều khiển cho các yêucầu có độ chính xác Ngày nay, UART đang được sử dụng trong nhiều ứng dụng như

Bộ thu GPS, Mô-đun Bluetooth, Mô-đun GSM và GPRS, Hệ thống Truyền thôngKhông dây, các ứng dụng dựa trên RFID, v.v

Hình 1 2 Một số ứng dụng của UART1.2 Thiết kế hệ thống số bằng verilog

1.2.1 Mạch tổ hợp

1.2.1.1 Lý thuyết chung

Mạch tổ hợp là mạch số không có phần tử nhớ Tương ứng với mỗi đầu vào củamạch thay đổi tại một thời điểm thì mạch tổ hợp sẽ cho đầu ra tương ứng Hình vẽ củamạch tổ hợp được thể hiện dưới đây:

Trang 12

Hình 1 3 Sơ đồ mạch tổ hợp

1.2.1.2 Cấu trúc hình thành mạch tổ hợp trong verilog

Ta coi mạch tổ hợp như một hộp đen (black box) Họp đen này sẽ phản ứng vớitừng đầu vào Trong verilog, ta sử dụng cú pháp always @(sensitivity list) Cú phápalways sẽ tạo ra một hộp đen của mạch tổ hợp Hộp đen đó sẽ phản ứng với các tínhiệu đầu vào trong (sensitivity list) Để miêu tả hoạt động logic của mạch tổ hợp, ta bắtđầu và kết thúc khối always bằng cú pháp: begin, end và miêu tả quan hệ logic của đầu

ra tương ứng với đầu vào trong đoạn begin, end đó

Ngoài ra trong quá trình thiết kế mạch, để thuận tiện cho việc thay đổi thông số

ta sử dụng cú pháp: localparam (tên tín hiệu) = (Giá trị muốn gán); Hoặc #(parameter)(Tên biến toàn cục) = (giá trị muốn gán)) trước khai báo module

Trang 13

Hình 1 4 Sơ đồ mạch dãy

Trong lập trình verilog, ta cũng sẽ chia thành các phần như hình vẽ trên: Phầnmiểu tả các thành phần nhớ (thanh ghi), phần miểu tả trạng thái tiếp theo được thựchiện qua mạch tổ hợp (next state logic) Chi tiết template của mạch dãy được thể hiệndưới đây:

Module ( khai báo đầu vào, đầu ra)

// Khai báo tín hiệu bên trong

Trang 14

1.2.3 Mạch dãy thông thường

Đối với mạch dãy thông thường, sự dịch chuyển trạng thái của mạch có quy luật

“thông thường”, nghĩa là trạng thái tiếp theo của mạch luôn có một quy tắc chung lặplại như là cộng lên 1, trừ đi 1 hoặc dịch 1 bit, 2 bit Mạch dãy thông thường có thểđược thấy qua các ví dụ như bộ cộng , bộ dịch Cấu trúc hình thành code của mạchdãy thông thường tương tự như template trong phần trên

1.2.4 FSM

Khác với mạch dãy, thông thường, máy trạng thái (FSM) có trạng thái tiếp theokhông theo một quy luật nào mà phải dựa vào trạng thái hiện tại và các đầu vào ngoàixung clock Hoạt động của FSM được biểu diễn bởi sơ đồ chuyển dịch trạng thái(State Transition Diagram) bao gồm sơ đồ moore và mealy

Trang 15

Hình 1 5 Sơ đồ mạch theo sơ đồ chuyển dịch trạng trái Moore và Mealy

Hình trên là hai mô hình mạch được thiết kế theo hai mô hình chuyển dịch trạngthái Moore và Mealy Sơ đồ moore có đầu ra phụ thuộc vào trạng thái Còn sơ đồmealy phụ thuộc vào input và trạng thái

Để thuận tiện cho việc lập trình, người ta đã đưa ra một sơ đồ thuật toán dựa vàoFSM được gọi là máy trạng thái ASM (Algorithmics state machine charts) Sơ đồ nàyghi lại input, output, trạng thái và sự chuyển dịch trạng thái trong một hình mô tả Haicách biểu diễn này cùng cung cấp một hoạt động chuyển dịch trạng thái, trong đó FSMbiểu diễn cô đọng và đơn giản hơn, còn ASM biểu diễn giống như một sơ đồ và có tính

mô tả hơn đối với các điều kiện chuyển dịch và hoạt động phức tạp

Một sơ đồ trạng thái bao gồm các node biểu diễn các trạng thái được vẽ là cáchình tròn và hoạt động chuyển dịch giữa các trạng thái đó Hình dưới dây vẽ một nodeđơn và hoạt động chuyển dịch nó.Hoạt động chuyển dịch được thực hiện khi biểu thứcđiều kiện có giá trị true

Trang 16

Hình 1 6 Hoạt động chuyển dịch của một node đơn trong ASM

Giá trị đầu ra của sơ đồ Moore được đăt ở trong hình tròn vì nó chỉ phụ thuộc vàotrạng thái hiện tại Giá trị đầu ra của sơ đồ Mealy được gắn với điều kiện của hoạtđộng chuyển dịch vì nó phụ thuộc vào trạng thái hiện tại và đầu vào Để giảm bớt sựlộn xộn trong sơ đồ, chỉ các giá trị đầu ra đã xác nhận mới được liệt kê Tín hiệu đầu ra

có thể bao gồm các giá trị giá trị mặc định khác (tức là không được gán)

Sơ đồ ASM gồm nhiều blocks ASM Mỗi block ASM bao gồm một hộp trạngthái, hộp kiểm tra điều kiện và hộp xác định tín hiệu đầu ra có điều kiện được minhhọa ở hình dưới đây:

Trang 17

Hình 1 7 Mô tả một block ASM

Một hộp trạng thái biểu diễn một trạng thái trong FSM và gán đầu ra theo sơ đồMoore ở bên trong hộp và nó chỉ có một đường ra Khối kiểm tra điều kiện kiểm trađầu vào và xác định đường ra sau đó Nó sẽ có 2 đường ra, nhãn T và F tương ứng vớihai giá trị True và False của biểu thức kiểm tra điều kiện Họp xác định đầu ra đượcdùng để xác định các hành động ra tín hiệu ra theo sơ đồ Mealy theo sau các điều kiện

đã kiểm tra Nó biểu diễn tín hiệu đầu ra chỉ được kích hoạt khi điều kiện trong hộpquyết định được đáp ứng

Trong lập trình verilog, mạch FSM có một khung chương trình để thực hiện Giả

sử thực hiện lập trình verilog cho sơ đồ chuyển dịch trạng thái sau:

Trang 18

Hình 1 8 Ví dụ sơ đồ chuyển dịch trạng thái

Khung chương trình được thực hiện như sau:

Module FSM1(clk, rst, in, out);

Trang 19

// Khai báo tín hiệu nội tại

//Khối định nghĩa trạng thái tiếp theo

Always @(present_state or in)

Case (present_state)

//Định nghĩa trạng thái tiếp theo đối với từng input

IDLE: begin

Trang 21

dữ liệu giữa các thanh ghi Hình ảnh mô tả FSMD được thể hiện bên dưới:

Trang 22

Hình 1 9 Khối FSMD

Để thiết kế được chuẩn giao tiếp UART, ta cần thực hiện thông qua sơ đồ ASMD

Sơ đồ ASMD, hay còn gọi là sơ đồ thuật toán máy trạng thái và luông dữ liệu, miêu tả cách thức hoạt động của một khối FSMD Hình ảnh bên dưới miêu tả cấu trúc của một khối sơ đồ ASMD

Trang 23

Hình 1 10 Một trạng thái trong FSMD

Hình nét đứt trong khối trên thể hiện một trạng thái (state) Mỗi trạng thái sẽ chỉđịnh những phép toán cần thực hiện giữa các thanh ghi Cách thiết kế sơ đồ này khôngkhác nhiều so với sơ đồ ASM hay sơ đồ thuật toán thông thường Điểm khác duy nhất,

đó là kết quả của các phép toán chỉ được cập nhật khi ra khỏi trạng thái đó, tức là tạisườn dương tiếp theo của chu kỳ đồng hồ

Trang 24

CHƯƠNG 2 THIẾT KẾ UART

Trong chương này, chúng em sẽ tiến hành thiết kế chuẩn giao tiếp UART Trướckhi tiến hành thiết kế, chúng em trình bày specification, sơ đồ khối của chuẩn UARTcủa nhóm thực hiện và chia sơ đồ khối thành 4 module để thiết kế Trong mỗi module

có mô tả chi tiết về cách thức hoạt động của module, thiết kế chi tiết và bảng tín hiệu

để thực hiện cho quá trình lập trình verilog

2.1 Specification

• Đầu vào: Các khung dữ liệu, mỗi khung dữ liệu gồm 8 bit dữ liệu

• Đầu ra: Các khung dữ liệu 8bit nhận từ phía phát

Trang 25

• Mô tả hoạt động:

Ở phía phát nhận 8 bit dữ liệu từ buffer và tạo ra 1 bit parity để gửi sang bênphía nhận Bên phía nhận thực hiện nhận 8 bit dữ liệu và 1 bit parity từ bên phát gửisang và cũng tạo bit parity từ 8 bit dữ liệu nhận được đó, sau đó thực hiện so sánh bitparity tạo ra đó với bit parity từ bên phát gửi sang Nếu 2 bit đó giống nhau thì thựchiện đẩy dữ liệu nhận được ra buffer, ngược lại thì không đưa dữ liệu ra buffer

Hình dưới đây mô tả sơ đồ truyền 1 khung dữ liệu từ bên phát sang bên thu: Thứ

tự truyền được thực hiện là 8 bit dữ liệu sau đó là bit parity

Hình 2 1 Sơ đồ truyền 1 khung dữ liệu

Các thông số kĩ thuật:

• Baud rate: 19200 bit/s

• Số lượng bit của 1 khung dữ liệu : 8

• Parity bit: 1 bit parity

• Stop bit: 1 (Thời gian truyền 16 x baudrate)

• Thời gian truyền 1 bit: 16 x baudrate

Từ các thông số kĩ thuật trên và xác định hoạt động cần có chúng em đưa ra sơ

đồ khối sau:

Trang 26

Hình 2 2 Sơ đồ khối hệ thống UART sử dụng

Từ sơ đồ khối trên, nhóm chung em chia thành 4 module để thực hiện thiết kế:Khối band rate, khối phát, khối thu, khối buffer Quá trình thiết kế các module đượctrình bày ở phần tiếp theo dưới đây

2.2 Thiết kế khối baud rate

Như đã miêu tả ở trên, khối Baudrate có chức năng gửi tín hiệu lấy mẫu đối vớikhối thu RX và tín hiệu gửi bit đối với khối TX Đối với khối RX, ta cần lấy mẫu vớitốc độ gấp 16 lần tốc độ của baudrate (19200 bit/s), vì vậy khối baudrate cần gửi19200*16 = 307200 (tín hiệu lẫy mẫu/s) Khối tạo dao động của kit De2 có tần số là50Mhz Do vậy, ta cần tìm xem tương ứng với mỗi tín hiệu lấy mẫu thì sẽ mất baonhiêu lần dao động Để làm được điều này, ta lấy: 50Mhz/ 307200 = 163 dao động/ tínhiệu Do đó trong khối Baudrate, ta sẽ tạo một bộ đếm có thanh ghi để lưu giá trị sốlần lên clock của kit De2 Bộ đếm có chức năng đếm đến 163 và reset về 0 KhốiBaudrate sẽ set tín hiệu lấy mẫu = 1 khi bộ đếm đếm đến 163 và set tín hiệu = 0 trongcác trường hợp còn lại Ta sẽ dùng một thanh ghi (đặt tên là q) để lưu trữ cho quá trìnhđếm này Chi tiết các tín hiệu được sử dụng cũng như là sơ đồ khối chi tiết được thểhiện dưới đây:

Trang 27

Bảng 2 1 Bảng tín hiệu của khối Baud rate

Tên tín

hiệu

Loại tín hiệu

s_tick Output Tín hiệu lấy mẫu đối với khối Rx và tín hiệu gửi đối với

khối Tx S_tick = 1 khi giá trị hiện tại của bộ đếm q_reg

= 136 và =0 trong các trường hợp còn lại

Sau khi thiết kế sơ đồ khối và đặt tên cho các tín hiệu được sử dụng, ta tiến hành lập trình dựa vào những phần vừa đề ra Chi tiết phần code sẽ được để trong phần phụ lục

Trang 28

2.3 Thiết kế khối phát

2.3.1 Mô tả chức năng

Bộ phát Uart hoạt động như một thanh ghi dịch từ song song sang nối tiếp Banđầu sau khi tín hiệu truyền được bật, bộ phát sẽ nhận vào 1 khối dữ liệu từ khối fifocủa bên phát Uart tránmitter thực hiện kiểm tra số lượng bit 0 và 1 trong khối dữ liệuvừa nhận sau đó lưu giá trị này vào 1 bit parity Bộ phát thực hiện chuyển toàn bộ khối

dữ liệu và bit parity vào một thanh ghi Sau đó quá trình truyền bắt đầu được thựchiện Đầu ra của khối Uart transmitter luôn trong trạng thái chờ Bit start được pháthiện khi đường dữ liệu chuyển từ trạng thái logic “1” sang trạng thái logic “0” Tiếptheo, lần lượt từng bit của khối dữ liệu và bit parity trong thanh ghi vừa lưu trữ đượctruyền qua đầu ra của bộ phát Bit stop được truyền cuối cùng Sau khi truyền xong bitstop, 1 tín hiệu sẽ được bật để báo 1 quá trình truyền đã hoàn tất

2.3.2 Sơ đồ khối

Hình 2 3 Sơ đồ khối của khối phát

2.3.3 Sơ đồ chuyển dịch trạng thái

Từ mô tả chức năng ở trên, chúng em thực hiện vẽ sơ đồ chuyển trạng thái Sơ đồchuyển trạng thái ở khối phát gồm 5 trạng thái: TX_ILDE, TX_START, TX_DATA,TX_PARITY, TX_STOP Quá trình chuyển đổi trạng thái sẽ diễn ra sau mỗi khoảng 16baud clock cycles

Trang 29

Hình 2 4 State machine khối phát

Trạng thái TX_IDLE: Khi khối Uart được reset, máy trạng thái sẽ trở về trạngthái TX_IDLE Bộ phát đợi tín hiệu tx_start được bật thì chuyển toàn bộ khối dữ liệu

và bit parity vào thanh ghi Sau đó máy trạng thái chuyển qua trạng thái TX_START.Trạng thái TX_START: Ở trạng thái này máy trạng thái sẽ gửi bit start Máytrạng thái sẽ giữ nguyên trạng thái cho đến 16 baud clock cycles trước khi chuyển sangtrạng thái TX_DATA

Trạng thái TX_DATA: Ở trạng thái này, máy trạng thái tải thanh ghi b nội bộ với

dữ liệu được truyền Tiếp theo lần lượt 8 bit dữ liệu được truyền theo quy luật LBS.Sau khi bit dữ liệu cuối cùng được truyền Máy trạng thái sẽ chuyển sang trạng tháiTX_PARITY

Trạng thái TX_PARITY: Máy trạng thái truyền bit parity Sau khi hoàn tất nóchuyển sang trạng thái TX_STOP

Trạng thái TX_STOP: Khi một khung dữ liệu hoàn chỉnh đã được truyền thànhcông cùng với bit parity, máy trạng thái sẽ chuyển sang trạng thái này để hoàn tất quátrình truyền bằng cách gửi đi một bit stop Sau khi hoàn tất, máy trạng thái sẽ quay lạitrạng thái TX_IDLE và chờ tín hiệu tx_start báo hiệu

Trang 30

4 Lặp lại bước 3 bảy lần để truyền toàn bộ 8 bit dữ liệu.

5 Lặp lại bước 3 thêm 1 lần nữa để truyền bit parity

6 Lặp lại bước 3 một lần nữa để hoàn tất truyền bit stop

2.3.5 Sơ đồ ASMD

Các thanh ghi sử dụng:

-Thanh ghi s: dùng để lưu giá trị của bộ đếm tín hiệu lấy mẫu tick

-Thanh ghi n: dùng để lưu giá trị của bộ đếm số bit data đã được truyền

-Thanh ghi din dùng để lưu dữ liệu 8 bit dữ liệu sẽ được gửi đi

-Thanh ghi b lưu các bit data được truyền

Trang 31

Hình 2 5 ASMD chart of Uart transmitter -Giải thích:

Trang 32

• Ở trạng thái ban đầu (Idle), tín hiệu truyền tx ở mức cao, tx_next = 1 Gọi p là bitparity (bit kiểm tra số bit dữ liệu chẵn, lẻ trong khung dữ liệu được truyền) Ta có p =

0 khi tổng bit dữ liệu truyền vào bằng 0 và p bằng 1 khi tổng bit dữ liệu truyền vàotrong khung truyền bằng 1 Vì vậy ta gán p = din[0] ^ din[1] ^ din[2] ^ din[3] ^ din[4]

^ din[5] ^ din[6] ^ din[7] Đợi cho đến khi tín hiệu thông báo truyền tx_start = 1 báohàng đợi Fifo không còn trống, quá trình truyền bắt đầu Lúc này state_next = start;s_next = 0; 8 bit dữ liệu của din và parity bit p được load vào b_next Vì thực hiệntruyền theo quy luật LBS, ta gán b_next = {p,din}

• Ở trạng thái start, start tx_next = 0 chính là bit start bắt đầu được truyền, quá trình đếmlấy mẫu bắt đầu hoạt động Khi bộ đếm của thanh ghi s đạt tới giá trị 15, quá trìnhtruyền bit start hoàn tất và hoạt động chuyển qua trạng thái truyền bit dữ liệu(state_next = data) Bộ đếm của 2 thanh ghi s và n được reset về 0 (s_next = 0 vàn_next = 0) Nếu bộ đếm của thanh ghi s chưa đạt tới giá trị 15, quá trình đếm sẽ tiếptục cho đến khi hoàn thành việc truyền bit start

• Ở trạng thái data, các bit được truyền theo thứ tự LWB Từng bit dữ liệu trong thanhghi b được truyền, bắt đầu từ b_reg[0] (tx_next = b_reg[0]) Quá trình truyền 1 bit dữliệu diễn ra như sau Bộ đếm của thanh ghi s bắt đầu hoạt động, khi đạt đến giả trị 15(16 tick) thì quá trình truyền 1 bit hoàn tất Bộ đếm của thanh ghi s được reset về 0đồng thời giá trị bộ đếm của thanh ghi n tăng lên 1 và thanh ghi b dịch 1 bit về bênphải để tiếp tục quá trình truyền bit tiếp theo Khi bộ đếm của thanh ghi s chưa đạt tớigiá tri 15, quá trình truyền 1 bit sẽ được tiếp tục Quá trình truyền 1 bit dữ liệu đượclặp lại 8 lần tương đương với việc bộ đếm của thanh ghi n tăng lần lượt từ 0 -> 7 Lúcnày, 8 vòng lặp được hoàn tất và trạng thái chuyển sang trạng thái parity (state_next =parity) để bắt đầu quá trình truyền bit parity Chú ý rằng bộ đếm của thanh ghi s khi đó

đã được reset về 0

• Ở trạng thái parity, sau khi 8 bit dữ liệu được truyền, thanh ghi b lúc này đã được dịch

8 lần về bên phải và parity bit p khi đó ở vị trí b[0] Thực hiện truyền bit p Ta cótx_next = b[0] Bộ đếm tick hoạt động Khi bộ đếm của thanh ghi s bằng 15, quá trìnhtruyền bit parity p hoàn tất Bộ đếm của thanh ghi s reset về 0 và hoạt động chuyểnsang trạng thái đếm bit stop Nếu bộ đếm của thanh ghi s chưa đạt tới giá trị 15, quátrình đếm sẽ tiếp tục cho đến khi hoàn thành việc truyền bit parity

• Ở trạng thái stop, bit được truyền tới tx_next = 1 chính là bit stop (luôn ở mức cao).Quá trình đếm lấy mẫu lại bắt bắt đầu hoạt động cho đến khi nó đạt tới giá trị 15 thìdừng lại Lúc này quá trình truyền bit stop hoàn tất Một tín hiệu tx_done_tick được

Trang 33

báo hiệu thông báo quá trình truyền 1 byte dũ liệu hoàn tất Trạng thái lúc này chuyển

về trạng thái ban đầu (Idle) để chờ byte dữ liệu tiếp theo được truyền

tx_start Input 1 Tín hiệu điều kiện báo hiệu bit

start bắt đầu được truyền

s_tick Input 1 Tín hiệu điều kiện báo hiệu bộ

đếm của thanh ghi s bắt đầu hoạtđộng

din Input 8 Biến lưu trữ 8 bit dữ liệu nhận từ

bộ đệm Fifo vào bộ Uarttransmitter

tx_done_tick Output 1 Tín hiệu báo hiệu hoàn tất quá

trình truyền 1 byte dữ liệu

tx Output 1 Tín hiệu đầu ra thể hiện cho từng

bí được truyền ra khỏi khối Uarttransmitter

state_reg Internal Signal 2 Tín hiệu ở dạng thanh ghi (reg),

lưu trữ giá trị trạng thái hiện tại.state_next Internal Signal 2 Tín hiệu ở dạng thanh ghi (reg),

lưu trữ giá trị trạng thái kế tiếp

Trang 34

s_reg Internal Signal 4 Tín hiệu ở dạng thanh ghi (reg),

lưu giá trị hiện tại của bộ đếm tínhiệu lấy mẫu tick

s_next Internal Signal 4 Tín hiệu ở dạng thanh ghi (reg),

xác đinh giá trị của bộ đếm tínhiệu lấy mẫu tick trong chu kỳ kếtiếp

n_reg Internal Signal 3 Tín hiệu ở dạng thanh ghi (reg),

lưu giá trị hiện tại của bộ đếm sốbit data đã được truyền

n_next Internal Signal 3 Tín hiệu ở dạng thanh ghi (reg),

xác đinh giá trị của bộ đếm số bitdata đã được truyền trong chu kỳ

kế tiếp

b_reg Internal Signal 8 Tín hiệu ở dạng thanh ghi (reg),

lưu các bit data hiện tại đangđược truyền

b_next Internal Signal 8 Tín hiệu ở dạng thanh ghi (reg),

lưu các bit data sẽ được truyềntrong chu kỳ kế tiếp

p Internal Signal 1 bit kiểm tra số bit dữ liệu chẵn, lẻ

trong khung dữ liệu được truyền

Ta có p = 0 khi tổng bit dữ liệutruyền vào bằng 0 và p bằng 1 khitổng bit dũ liệu truyền vào trongkhung truyền bằng 1s

tx_reg Internal Signal 1 Tín hiệu ở dạng thanh ghi (reg),

lưu bit hiện tại được truyền tx_next Internal Signal 1 Tín hiệu ở dạng thanh ghi (reg),

Trang 35

lưu bit sẽ được truyền trong chu

2.4.2 Sơ đồ khối

Hình 2 6 Sơ đồ khối của khối thu

2.4.3 Sơ đồ chuyển dịch trạng thái

Từ mô tả chức năng ở trên, chúng em thực hiện vẽ sơ đồ chuyển dịch trạng thái

Sơ đồ chuyển dịch trạng thái ở khối thu gồm 5 trạng thái: RX_ILDE, RX_START,RX_PARITY và RX_STOP như hình dưới đây Máy trạng thái sẽ chuyển trạng tháisau mỗi khoảng 16 baud clock cycles

Trang 36

Hình 2 7 State machine khối nhận

Trạng thái RX_IDLE: Khi khối thu UART được reset, máy trạng thái sẽ ở trạngthái RX_IDLE này Máy trạng thái sẽ đợi đến khi phát hiện ở bit start ở đường dữ liệutruyền Bit start được nhận định khi có giảm mức tín hiệu ở đường dữ liệu truyền từmúc logic “1” xuống mức logic “0” Khi phát hiện được bit start, máy trạng thái sẽchuyển từ trạng thái RX_IDLE sang trạng thái RX_START

Trạng thái RX_START: Ở trạng thái này, máy trạng thái sẽ đợi 16 baud clockcycles trước khi chuyển sang trạng thái tiếp theo là RX_DATA

Trạng thái RX_DATA: Máy trạng thái sẽ lấy mẫu tín hiệu nhận được thời điểmthời gian chính giữa khoảng thời gian bit dữ liệu được nhận Mỗi bit sẽ được lưu trongthanh ghi để ghép lại thành 8 bit dữ liệu Khi đã nhận đủ 8 bit dữ liệu và ghi vào thanhghi 8 bit, máy trạng trái sẽ chuyển sang trạng thái RX_PARITY

Trạng thái RX_PARITY: Trong trạng thái này, máy trạng thái lấy mẫu bit parity ởthời điểm chính giữa khoảng thời gian bit parity được nhận và kiểm tra tính chính xác

ở dữ liệu được nhận

Trang 37

Trạng thái RX_STOP: Máy trạng thái lấy mẫu bit stop ở thời điểm chính giữakhoảng thời gian bit stop được nhận Ở trạng thái này, còn tiếp

Thanh ghi sử dụng:

-Thanh ghi s: dùng để lưu giá trị của bộ đếm tín hiệu lấy mẫu tick

-Thanh ghi n: dùng để lưu giá trị của bộ đếm số bit data đã được truyền

-Thanh ghi dout dùng để lưu dữ liệu 8 bit dữ liệu nhận được để đẩy vào buffer-Thanh ghi b lưu các bit data được truyền

2.4.4 Thuật toán

Trong suốt quá trình nhận, tốc độ lấy mẫu được sử dụng gấp 16 lần baud rate, có nghĩa

là mỗi bit nối tiếp được lấy mẫu 16 lần Do giao thức Uart được lựa chọn thực hiệnnhận 8 bit dữ liệu, 1 bit parity, 1 bit stop, ta có quá trình hoạt động như sau:

1 Tín hiệu ban đầu luôn ở mức cao, chờ cho đến khi tín hiệu đến chuyển xuốngmức 0 chính là điểm bắt bầu của bit start, bộ đếm tich bắt đầu hoạt động, thựchiện đếm lấy mẫu tín hiệu

2 Khi bộ đếm tick đạt tới 7, lúc này đang ở chính giữa tín hiệu start, thực hiệnnhận bit start và khởi động lại bộ đếm

3 Khi bộ đếm đạt tới giá trị 15, lúc này đang ở chính giữa bit dữ liệu thứ nhất,thực hiện nhận bit dữ liệu, sau đó chuyển nó vào thanh ghi đồng thời reset lại

bộ đếm

4 Lặp lại bước 3 thêm 7 lần để nhận toàn bộ 8 bit dữ liệu

5 Lặp lại bước 3 thêm 1 lần nữa để nhận bit parity

6 Lặp lại bước 3 một lần nữa để nhận nốt bit stop

Trang 38

2.4.5 Sơ đồ ASMD

Hình 2 8 ASMD chart of Uart receiver

Giải thích:

Trang 39

• Ở trạng thái ban đầu (Idle) tín hiệu rx=1 Đợi cho đến khi tín hiệu rx=0 thì khởi tạos_next =0 và chuyển sang trạng thái start (next_state= start).

• Ở trạng thái start, start tx_next = 0 chính là bit start bắt đầu được truyền, quá trình đếmlấy mẫu bắt đầu hoạt động Khi bộ đếm của thanh ghi s đạt tới giá trị 15, quá trìnhtruyền bit start hoàn tất và hoạt động chuyển qua trạng thái truyền bit dũ liệu(state_next = data) Bộ đếm của 2 thanh ghi s và n được reset về 0 (s_next = 0 vàn_next = 0) Nếu bộ đếm của thanh ghi s chưa đạt tới giá trị 15, quá trình đếm sẽ tiếptục cho đến khi hoàn thành việc truyền bit start

Ở trạng thái start, quá trình đếm tick lấy mẫu bắt đầu Khi bộ đếm của thanh ghi sđạt tới giá trị bằng 7 thì hoạt động chuyển qua trạng thái truyền bit (state_next=data)

Bộ đếm của 2 thanh ghi s và n reset về 0 (s_next=0, n_next=0) Nếu bộ đếm của thanhghi s chưa đạt tới giá trị bằng 7, quá trình đếm sẽ tiếp tục cho đến khi s_tick =7

• Ở trạng thái data, dãy bit từ rx được đẩy thành luồng bit b[7:0]

(b ß {rx, b[7:1]}) Quá trình truyền 1 bit được thực hiện như sau: Bộ đếm của thanhghi s bắt đầu hoạt động, khi đạt đến giá trị 15 (16 ticks) thì quá trình lấy mẫu đượcthực hiện Bộ đếm của thanh ghi s được reset về 0, đồng thời giá trị bộ đếm của thanhghi n tăng lên 1 và cập nhật giá trị trong thanh ghi b Khi giá trị bộ đếm của bộ đếm schưa đạt tới giá trị 15 thì giá trị s tăng lên 1 (s_next= s_reg +1) và chưa thực hiện lấymẫu 1 bit Quá trình nhận 1 bit dữ liệu được lặp lại 8 lần, tương đương với việc bộđếm của thanh ghi n tăng lần lượt từ 0 → 7 Lúc này, 8 vòng được hoàn tất và trạngthái chuyển sang trạng thái stop (state_next = parity) để thực hiện quá trình tạo vànhận bit parity

• Ở trạng thái parity, quá trình bit parity và bit check_parity được tạo ra từ luồng bit từthanh ghi b Quá trình được thực hiện như sau: Bộ đếm của thanh ghi s bắt đầu hoạtđộng, khi đạt đến giá trị 15 (16 ticks) thì quá trình tạo bit parity và bit check_parityđược thực hiện Bit parity được thực hiện bằng cách xor các bit của thanh ghi b vớinhau, check_parity được tạo ra bằng cách so sánh bit parity được tạo ra từ bên RX vớibit parity nhận từ TX truyền sang Nếu bit check_parity =1 thì hoạt động chuyển sangtrạng thái stop (next_state=stop), ngược lại, hoạt động chuyển về trạng thái idle(next_state= idle) Nếu giá trị bộ đếm của bộ đếm s chưa đạt đến giá trị 15 thì chưathực hiện tạo bit parity và bit check_parity

• Ở trạng thái stop, bit được truyền tới tx_next = 1 chính là bit stop (luôn ở mức cao).Quá trình đếm lấy mẫu lại bắt bắt đầu hoạt động cho đến khi nó đạt tới giá trị 15 thì

Trang 40

báo hiệu thông báo quá trình truyền 1 byte dũ liệu hoàn tất Trạng thái lúc này chuyển

về trạng thái ban đầu (Idle) để chờ byte dữ liệu tiếp theo được truyền Nếu giá trị bộđếm của bộ đếm s chưa đạt tới giá trị 15 thì giá trị s tăng lên 1 (s_next= s_reg +1) vàchưa thực hiện tạo bit parity và bit check_parity

• Ở trạng thái stop, tín hiệu rx_done_tick được tạo ra để làm input để điều khiển ghi dữliệu vào Buffer Quá trình được thực hiện như sau: Bộ đếm của thanh ghi s bắt đầuhoạt đông, khi đạt đến giá trị 15 (16 ticks) thì quá trình rx_done_tick =1b’1, hoạt độngchuyển sang trạng thái idle

Bảng giá trị tín hiệu

Bảng 2 3 Bảng tín hiệu của khối nhận

Tên tín hiệu Loại tín hiệu Số bit Chức năng

rx input 1 Tín hiệu đầu vào thể hiện cho từng bí

được truyền ra khỏi khối Uart transmitter

s_tick input 1 Tín hiệu điều kiện báo hiệu bộ đếm của

thanh ghi s bắt đầu hoạt động

Rx_done_tic

k

output 1 Tín hiệu báo hiệu hoàn tất quá trình nhận

đủ 8 dữ liệu

dout output 8 Biến dữ liệu 8 bit dữ liệu nhận được để

đẩy vào buffer

State_reg Internal Signal 3 Tín hiệu ở dạng thanh ghi (reg), lưu trữ

giá trị trạng thái hiện tại

State_next Internal Signal 3 Tín hiệu ở dạng thanh ghi (reg), lưu trữ

giá trị trạng thái kế tiếp

Ngày đăng: 25/08/2021, 17:35

HÌNH ẢNH LIÊN QUAN

Hình 1.2 Một số ứng dụng của UART 1.2 Thiết kế hệ thống số bằng verilog - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 1.2 Một số ứng dụng của UART 1.2 Thiết kế hệ thống số bằng verilog (Trang 11)
Hình 1.3 Sơ đồ mạch tổ hợp - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 1.3 Sơ đồ mạch tổ hợp (Trang 12)
Hình 1.4 Sơ đồ mạch dãy - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 1.4 Sơ đồ mạch dãy (Trang 13)
Hình 1.5 Sơ đồ mạch theo sơ đồ chuyển dịch trạng trái Moore và Mealy - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 1.5 Sơ đồ mạch theo sơ đồ chuyển dịch trạng trái Moore và Mealy (Trang 15)
Hình 1 .6 Hoạt động chuyển dịch của một node đơn trong ASM - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 1 6 Hoạt động chuyển dịch của một node đơn trong ASM (Trang 16)
Hình 1. 7 Mô tả một block ASM - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 1. 7 Mô tả một block ASM (Trang 17)
Hình 1 .9 Khối FSMD - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 1 9 Khối FSMD (Trang 22)
Hình 1. 10 Một trạng thái trong FSMD - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 1. 10 Một trạng thái trong FSMD (Trang 23)
Hình 2.2 Sơ đồ khối hệ thống UART sử dụng - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 2.2 Sơ đồ khối hệ thống UART sử dụng (Trang 26)
Bảng 2.1 Bảng tín hiệu của khối Baudrate - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Bảng 2.1 Bảng tín hiệu của khối Baudrate (Trang 27)
Tên tín hiệu  - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
n tín hiệu (Trang 27)
Hình 2.3 Sơ đồ khối của khối phát - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 2.3 Sơ đồ khối của khối phát (Trang 28)
Hình 2.4 State machine khối phát - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 2.4 State machine khối phát (Trang 29)
Hình 2. 7 State machine khối nhận - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 2. 7 State machine khối nhận (Trang 36)
Hình 2. 8 ASMD chart of Uart receiver - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 2. 8 ASMD chart of Uart receiver (Trang 38)
Hình 2 .9 Sơ đồ khối của FIFO Buffer - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 2 9 Sơ đồ khối của FIFO Buffer (Trang 42)
Hình 2. 10 Cơ chế hoạt động của FIFO - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 2. 10 Cơ chế hoạt động của FIFO (Trang 43)
Bảng 2.4 Miêu tả trạng thái con trỏ trong FIFO - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Bảng 2.4 Miêu tả trạng thái con trỏ trong FIFO (Trang 44)
Hình 2. 11 Sơ đồ ghép nối hệ thống - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 2. 11 Sơ đồ ghép nối hệ thống (Trang 47)
2.6.2 Bảng giá trị tín hiệu - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
2.6.2 Bảng giá trị tín hiệu (Trang 47)
Hình 3.1 Kết quả mô phỏng khối baudrate - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3.1 Kết quả mô phỏng khối baudrate (Trang 50)
Hình 3.2 Kết quả mô phỏng khối phát – truyền 1 lần - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3.2 Kết quả mô phỏng khối phát – truyền 1 lần (Trang 51)
Hình 3.4 Kết quả mô phỏng khối phát – truyền 3 lần liên tiếp - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3.4 Kết quả mô phỏng khối phát – truyền 3 lần liên tiếp (Trang 52)
Hình 3.5 Kết quả mô phỏng khối thu – nhận 1 khung - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3.5 Kết quả mô phỏng khối thu – nhận 1 khung (Trang 54)
Hình 3 .6 Kết quả mô phỏng khối thu – nhận 1 khung (zoom) - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3 6 Kết quả mô phỏng khối thu – nhận 1 khung (zoom) (Trang 54)
Hình 3. 8 Kết quả mô phỏng khối buffer - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3. 8 Kết quả mô phỏng khối buffer (Trang 56)
3.2.3 Kết quả kiểm tra đánh giá - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
3.2.3 Kết quả kiểm tra đánh giá (Trang 58)
Hình 3.9 Kết quả mô phỏng các tín hiệu cúa bộ đệm bên phát sau khi khởi tạo đầu vào - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3.9 Kết quả mô phỏng các tín hiệu cúa bộ đệm bên phát sau khi khởi tạo đầu vào (Trang 58)
Hình 3.10 Kết quả mô phỏng toàn bộ quá trình truyền và nhận tín hiệu của cả hệ thống - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3.10 Kết quả mô phỏng toàn bộ quá trình truyền và nhận tín hiệu của cả hệ thống (Trang 59)
Hình 3.11 Kết quả mô phỏng tập trung vào tín hiệu đầu ra - VLSI THIẾT KẾ CHUẨN GIAO TIẾP UART BẰNG VERILOG
Hình 3.11 Kết quả mô phỏng tập trung vào tín hiệu đầu ra (Trang 59)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w