Bài làm: Ta dùng một bộ đếm lpm_counter0, với xung clock là xung CLK1us, 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 x
Trang 1ĐẠ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
TP HCM, ngày 22 tháng 9 năm 2021
Trang 2Mụ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
Trang 3Bà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
Trang 4Kế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)
Trang 5Cụ 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
Trang 6Bà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…
Trang 7Kế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
Trang 8Bà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
Trang 9Kết quả mô phỏng:
Khi Ton = 0:
Khi Ton = 1:
Khi Ton = 2:
7
Trang 10Khi 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ừ
→
Trang 11Bà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
Trang 12• 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
Trang 132 Module DAC
3 Module PWM
11
Trang 144 Module Encoder
5 Module DI
Trang 15• 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
13
Trang 16Bài 5 Mạch giải mã ở Slide19 trên Quartus/ Block Diagram
Bài làm:
Sơ đồ thiết kết
Module_ADC:
Trang 17Module_PWM:
15
Trang 18Module_DI:
Trang 19Module_CAP:
Module_SPI:
17
Trang 20Nhậ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