Download as pdf or txt
Download as pdf or txt
You are on page 1of 20

ĐẠI HỌC QUỐC GIA

ĐẠI HỌC BÁCH KHOA TP.HCM


--------------------

BÁO CÁO BÀI TẬP NHÓM


Môn: Hệ thống điều khiển nhúng
Chương 1: THIẾT KẾ PHẦN CỨNG DÙNG FPGA
GVHD: TS. Nguyễn Vĩnh Hảo

Nhóm 1 - Lớp L02


STT Tên MSSV
1 Nguyễn Nguyên Chương 1810057
2 Nguyễn Sinh Dũng 1810090
3 Võ Quang Thắng 1810534
4 Phan Văn Đức 1811981

TP HCM, ngày 22 tháng 9 năm 2021


Mục lục
Bài 1. Đo độ rộng xung ………………………………………………………...……. 1

Bài 2. Hiển thị led 7 đoạn …………………………………………………………… 4

Bài 3. Điều rộng xung ……………………………………………………………… 6

Bài 4. Vẽ lại mạch giải mã ở Slide15 trên Quartus/Block Diagram ………………9

Bài 5. Vẽ lại mạch giải mã ở và Slide19 trên Quartus/ Block Diagram …………..14

i
Bài tập nhóm chương 1
Bài 1: Đo độ rộng xung
- Đầu vào xung PulseIn, clk (1us).
- Đầu ra D[15:0] chỉ độ rộng xung PulseIn (đơn vị us).
- Sử dụng Khối lpm_counter trong Megafunctions\Arithmetic.
Bài làm:
Ta dùng một bộ đếm lpm_counter0, với xung clock là xung CLK(1us), xung PulseIn
đóng vai trò Reset bộ đếm (xung đi qua cổng NOT đảo giá trị tín hiệu cung cấp cho
chân aclr).
- Khi xung PulseIn bằng 1 thì bộ đếm sẽ đếm lên, cứ sau khi ngõ vào CLK là cạnh
lên thì ngõ ra sẽ tăng lên một giá trị.
- Khi xung PulseIn bằng 0 thì chân aclr nhận mức 1 Reset bộ đếm (ngõ ra giữ giá
trị 0).
Sơ đồ thiết kế:

Mô phỏng:
Đặt giá trị ngõ vào CLK, PulseIn: CLK là xung clock có độ rộng 1us, PulseIn là xung
ta muốn đo chiều dài.

1
Kết quả mô phỏng:

Nhận xét:
➢ Nhìn vào kết quả mô phỏng chúng ta có thể thấy được kết quả tương đối chính
xác. Tại các cạnh xuống của xung PulseIn ngõ ra D[15..0] của bộ đếm được Reset
về 0 và tiếp tục đếm lên nếu có cạnh lên của xung PulseIn ( trong khi bộ đếm
được Reset thì ngõ ra Q các IC chốt sẽ giữ giá trị đếm được của ngõ ra D của bộ
đếm).
➢ Trong một số trường hợp độ dài xung đếm được sẽ có sai số. Độ dài xung thực tế
có thể lớn hơn hoặc nhỏ hơn, độ chênh lệch lớn nhất là 1us. Nguyên nhân là vì
giá trị đếm sẽ thay đổi khi có cạnh lên của xung CLK vì vậy trong một số trường
hợp điểm bắt đầu và kết thúc của xung PulseIn nằm trước hay nằm sau các cạnh
lên của xung CLK sẽ cho sai số khác nhau (độ chênh lệch lớn nhất xấp xỉ 1us).

2
Cụ thể như 2 kết quả dưới đây:

Độ dài xung PulseIn khoảng 2,6us nhưng đọc được chỉ là 2us.

Độ dài xung PulseIn khoảng 2,2us nhưng đọc được là 3us.


Kết luận: Độ rộng thực tế của một xung dao động xung quanh giá trị đọc được với biên
độ xấp xỉ bằng một chu kì xung CLK, vì vậy chúng ta chỉ biết được độ rộng xung một
cách tương đối. Để độ chính xác càng cao thì ta nên đưa xung CLK với chu kì nhỏ.

3
Bài 2: Hiển thị LED 7 đoạn
- Đầu vào xung clk (1us).
- Đầu ra D[6:0]: dữ liệu LED 7 đoạn (cực âm chung).
- Số LED hiển thị: 1
- Hiển thị từ 0ms – 9ms, sau đó lặp lại.
- Giải mã LED bằng IC 7447
Bài làm:
Ta dùng bộ đếm lpm_counter0 đầu vào xung clock CLK(1us) đếm lên giá trị 999
để tạo xung 1ms cấp cho lpm_counter1. Bộ đếm lpm_counter0 và lpm_counter1 tự
Reset về 0 khi đạt ngưỡng giá trị ta đã cài đặt (Modulus = 1000 và Modulus = 10).
Ngõ ra của bộ đếm lpm_counter1 (giá trị đếm từ 0 - 9) được kết nối đến các chân
A, B, C, D của IC 7447 để thực hiện giải mã sang tín hiệu LED. Các tín hiệu ở ngõ ra
IC 7447 đi qua cổng NOT cung cấp cho các chân LED có cực âm chung.
Sơ đồ thiết kế:

Mô phỏng:
Đặt giá trị ngõ vào CLK là xung clock có độ rộng 1us. Các ngõ ra LED_A, LED_B…

4
Kết quả mô phỏng:

Nhận xét:
➢ Kết quả mô phỏng chính xác, tín hiệu 7 đoạn LED có giá trị thể hiện đúng các
con số muốn hiển thị trên LED 7 đoạn.
➢ Thời gian hiển thị của các giá trị từ 0 đến 9 đúng với yêu cầu 1ms, ngoại trừ giá
trị hiển thị 0 đầu tiên khi chương trình khởi động có thời gian chưa chính xác
(thực tế chỉ được 998,5us).

➔ Nguyên nhân là vì cạnh lên đầu tiên của xung CLK bộ đếm có giá trị là 1, nên thời
gian từ khi chương trình hoạt động đến khi bộ đếm nhảy lên giá trị 999 (lpm_counter1
nhảy lên 1) thì tổng thời gian chỉ là 998,5us.

5
Bài 3: Điều rộng xung
- Đầu vào T (8bit), Ton (8bit), clk (1us)
- Đầu ra PwmOut - Độ phân giải 8 bit (255 mức)
- Ton, T chỉ thay đổi 1 lần đầu lúc khởi động, T =10 hoặc 1 giá trị bất kỳ. Ton = 0 – T.
- Sử dụng Khối lpm_counter và lpm_compare trong Megafunctions\Arithmetic
Bài làm:
Ta dùng bộ đếm lpm_counter0 chế độ up counter đầu vào xung clock CLK(1us) và
ngõ ra cấp cho lpm_campare1 và lpm_campare0.
lpm_campare1 so sánh cho T (ngõ ra chế động agb- “>”) và lpm_campare0 lần lượt là
lpm so sánh cho Ton (chế độ aleb – “< hoặc =”). lpm_campare2 so sánh giữa Ton và số 0,
và cổng and2 để and ngõ ra giữa lpm_campare2 và lpm_campare0 và đầu ra là Output
PWMout. Ta thêm vào ngõ ra của lpm_counter output Val[7..0] để kiểm tra xem giá trị
của lpm_counter.
Sơ đồ thiết kế:

Mô phỏng dạng sóng: set clk với chu kì 1us, T=10 và Ton= 0- 10.

6
Kết quả mô phỏng:
Khi Ton = 0:

Khi Ton = 1:

Khi Ton = 2:

7
Khi Ton = 5:

Khi Ton = 9:

Khi Ton = 10:

Nhận xét:
➢ Khi Ton = 0 thì giá trị PWMout = 0 toàn bộ (Do ta đã dùng bộ lpm_campare
để so sánh với 0 kết hợp and để giá trị ra luôn luôn = 0 khi Ton bằng 0)
➢ Khi Ton =1 đến 9. Độ rộng xung sẽ tăng dần (như hình).
➢ Khi Ton =10. Ngõ ra =1 toàn bộ quá trình, vẫn có gai tại điểm 10→0 (Clear
từ 10→0)

8
Bài 4: Vẽ lại mạch giải mã ở slide15 trên Quartus/Block Diagram
• Yêu cầu thiết kế

Bài làm:
• Dựa trên giải mã địa chỉ trên slide

9
• Sơ đồ kết nối trên Quartus (giải mã đến module)

Sơ đồ chốt dữ liệu và chọn chip /CS trong từng module


1. Module ADC

10
2. Module DAC

3. Module PWM

11
4. Module Encoder

5. Module DI

12
• Kết quả khi build chương trình thiết kế

Nhận xét:
➢ Đã hoàn thành nhiệm vụ của bài tập là giải mã đến module
➢ Chương trình khi build không xảy ra lỗi
Địa chỉ của từng module:
CS_ADC: 0x00 – 0x03
CS_DAC: 0x10 – 0x11
CS_PWM: 0x20 – 0x25
CS_ENC: 0x30 – 0x35
CS_DI: 0x40 – 0x41

13
Bài 5. Mạch giải mã ở Slide19 trên Quartus/ Block Diagram
Bài làm:
Sơ đồ thiết kết

Module_ADC:

14
Module_DAC:

Module_PWM:

15
Module_ENC:

Module_DI:

16
Module_DO:

Module_CAP:

Module_SPI:

17
Module_I2C:

Nhận xét: Biên dịch thành công!

Địa chỉ từng module:


CS_ADC: 0x00 - 0x0F
CS_DAC: 0x10 - 0x11
CS_PWM: 0x20 - 0x23
CS_ENC: 0x30 - 0x33
CS_DI: 0x40 - 0x43
CS_DO: 0x50 - 0x51
CS_CAP: 0x60 - 0x65
CS_SPI: 0x70
CS_I2C: 0x80

18

You might also like