Tải bản đầy đủ (.docx) (31 trang)

Báo cáo Thiết kế bộ đếm 00 đến 99 BẰNG NGÔN NGỮ VHDL

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.82 MB, 31 trang )

BÁO CÁO THIẾT KẾ BỘ ĐẾM 00 ĐẾN 99 BẰNG NGÔN NGỮ
VHDL
Đề bài: Sử dụng VHDL, Thiết kế và mô phòng bộ đếm sản phẩm có 2 đầu vào ( chỉ
đếm tiến) (mỗi đầu vào là 1 sensor, hiển thị trên led 2 đôi 7 thanh). Đếm tối da 99 rồi
reset về 0.
Yêu cầu:
- Trình bày cụ thể, chi tiết các bước thiết kế, các phương án thiết kế có thể. Giải thích
lý do lựa chọn phương án để thực hiện mạch.
- Vẽ sơ đồ FSM, code VHDL, giản đồ wave form.
- Sử dụng phần mềm Altera Quatus mô phỏng (funtion và timming).
- Synthesize ra sơ đồ mạch.
- Tính toán tần số tối đa mạch thiết kế.
- Báo cáo chuyên đề được trình bày, đóng quyển trển khổ A4 ( 25 – 50 trang).
- Báo cáo nội dung thực hiện bằng Slide tối đa 10 phút.
- Trả lời các câu hỏi của giáo viên.

1


MỤC LỤC
Trang

2


MỤC LỤC HÌNH ẢNH
Trang

3



LỜI NÓI ĐẦU
Qua thời gian học tập và nghiên cứu học phần “ THIẾT KẾ VI MẠCH LẬP
TRÌNH ĐƯỢC ” với sự giảng dạy truyền đạt kiến thức một cách chuyên sâu và nhiệt
tình của thầy Nguyễn Xuân Tiến – Giáo viên khoa Điện tử Viễn thông trường Đại học
Kỹ thuật Hậu cần CAND, chúng em đã học tập được nhiều kiến thức bổ ích về thiết kế
vi mạch lập trình được nói chung và sơ lược về ngôn ngữ lập trình VHDL nói riêng.
Ngày nay, ngôn ngữ mô tả phần cứng VHDL được dùng nhiều để thiết kế cho
các thiết bị logic lập trình được PLD từ loại đơn giản đến các loại phức tạp như FPGA.
Việc xử lý tín hiệu trong các thiết bị điện tử hiện đại đều dựa trên cơ sở nguyên lý số.
Bởi vậy việc hiểu sâu sắc về điện tử số là điều không thể thiếu được đối với kỹ sư điện
tử hiện nay. Nhu cầu hiểu biết về kỹ thuật số không phải chỉ riêng đối với các kỹ sư
điện tử mà còn đối với nhiều cán bộ kỹ thuật chuyên ngành khác có sử dụng các thiết
bị điện tử.
Là một trong những học viên lứa đầu của hệ đại học, hơn bao giờ hết chúng em
nhận thức được rỏ ràng nhiệm vụ cũng như trách nhiệm của bản thân phải ra sức học
tập và trau dồi kiến thức mỗi ngày để cố gắng hoàn thiện bản thân.
Để tổng kết môn học, chúng em xin được trình bày báo cáo đề tài:
Sử dụng VHDL, Thiết kế và mô phòng bộ đếm sản phẩm có 2 đầu vào
(chỉ đếm tiến) (mỗi đầu vào là 1 sensor, hiển thị trên led 2 đôi 7 thanh)
Đếm tối da 99 rồi reset về 0
Bài báo cáo của chúng em gồm 3 chương:
- Chương 1: Cơ sở lý thuyết
- Chương 2: Thiết Kế và Mô Phỏng Bộ Đếm 00 đến 99 Reset về 0 bằng Ngôn
Ngữ VHDL
- Chương 3: Thiết Kế và Mô Phỏng Bộ Đếm 00 đến 99 Reset về Bằng Ngôn
Ngữ VHDL Trên Phần Mềm Quartus Prime 16.0 Lite Edition
Trong quá trình thực hiện bài báo cáo, do kiến thức và kinh nghiệm hạn chế,
thời gian đan xen nhiều công việc của nhà trường nên bài báo cáo không thể tránh khỏi
những thiếu sót về mặt nội dung cũng như hình thức trình bày, chúng em rất mong
được sự đóng góp ý kiến của các thầy, cô và các đồng chí đồng đội để bài báo cáo

được hoàn thiện hơn nữa.
Chúng em xin trân thành cảm ơn!

4


Chương 1.
CƠ SỞ LÝ THUYẾT
1.1. Giới thiệu phần mềm Quartus
Quartus là công cụ phần mềm phát triển của hãng Altera, cung cấp môi trường
thiết kế toàn diện cho các thiết kế SOPC (hệ thống trên 1 chip khả trình - system on a
programmable chip).
Đây là phần mềm đóng gói tích hợp đầy đủ phục vụ cho thiết kế logic với các
linh kiện logic khả trình PLD của Altera, gồm các dòng APEX, Cyclone, FLEX,
MAX, Stratix... Quartus cung cấp các khả năng thiết kế logic sau:
- Môi trường thiết kế gồm các bản vẽ, sơ đồ khối, công cụ soạn thảo các ngôn
ngữ: AHDL, VHDL, và Verilog HDL.
- Thiết kế LogicLock.
- Là công cụ mạnh để tổng hợp logic.
- Khả năng mô phỏng chức năng và thời gian.
- Phân tích thời gian.
- Phân tích logic nhúng với công cụ phân tích SignalTap@ II.
- Cho phép xuất, tạo và kết nối các file nguồn để tạo ra các file chương trình.
- Tự động định vị lỗi.
- Khả năng lập trình và nhận diện linh kiện.
- Phần mềm Quartus sử dụng bộ tích hợp NativeLink@ với các công cụ thiết kế
cung cấp việc truyền thông tin liền mạch giữa Quartus với các công cụ thiết kế phần
cứng EDA khác.
- Quartus cũng có thể đọc các file mạch (netlist) EDIF chuẩn, VHDL và Verilog
HDL cũng như tạo ra các file netlist này.

- Quartus có môi trường thiết kế đồ họa giúp nhà thiết kế dễ dàng viết mã, biên
dịch, soát lỗi, mô phỏng...
Với Quartus có thể kết hợp nhiều kiểu file trong 1 dự án thiết kế phân cấp. Có
thể dùng bộ công cụ tạo sơ đồ khối (Quartus Block Editor) để tạo ra sơ đồ khối mô tả
thiết kế ở mức cao, sau đó dùng các sơ đồ khối khác, các bản vẽ như: AHDL Text
Design Files (.tdf), EDIF Input Files (.edf), VHDL Design Files (.vhd), and Verilog
HDL Design Files (.v) để tạo ra thành phần thiết kế mức thấp.
Quartus cho phép làm việc với nhiều file ở cùng thời điểm, soạn thảo file thiết
kế trong khi vẫn có thể biên dịch hay chạy mô phỏng các dự án khác. Công cụ biên
dịch Quartus nằm ở trung tâm hệ thống, cung cấp quy trình thiết kế mạnh cho phép tùy
biến để đạt được thiết kế tối ưu trong dự án. Công cụ định vị lỗi tự động và các bản tin
cảnh báo khiến việc phát hiện và sửa lỗi trở nên đơn giản hơn.

5


1.2. Các phương pháp thiết kế vi mạch số
Có hai phương pháp cơ bản được sử dụng để mô tả vi mạch số là mô tả bằng sơ
đồ logic (schematic) và mô tả bằng ngôn ngữ mô tả phần cứng HDL (Hardware
Description Language).
1.2.1. Mô tả bằng sơ đồ
Vi mạch được mô tả trực quan bằng cách ghép nối các phần tử logic khác nhau
một cách trực tiếp giống như ví dụ ở hình vẽ dưới đây. Thông thường các phần tử
không đơn thuần là các đối tượng đồ họa mà còn có các đặc tính vật lý gồm chức năng
logic, thông số tải vào ra, thời gian trễ... Những thông tin này được lưu trữ trong thư
viện logic thiết kế. Mạch vẽ ra có thể được mô phỏng để kiểm tra chức năng và phát
hiện và sửa lỗi một cách trực tiếp.

Hình 1 . Mô tả mạch số bằng sơ đồ
Ngày nay, các mạch tích hợp ngày càng thực hiện được nhiều chức năng do đó

mà vấn đề thiết kế mạch càng trở nên phức tạp. Những phương pháp truyền thống như
dùng phương pháp tối thiểu hoá hàm Boolean hay dùng sơ đồ các phần tử không còn
đáp ứng được các yêu cầu đặt ra khi thiết kế. Nhược điểm lớn nhất của các phương
pháp này là chúng chỉ mô tả được hệ thống dưới dạng mạng nối các phần tử với nhau.
Người thiết kế cần phải đi qua hai bước thực hiện hoàn toàn thủ công: đó là chuyển từ
các yêu cầu về chức năng của hệ thống sang biểu diễn theo dạng hàm Boolean, sau các
bước tối thiểu hoá hàm này ta lại phải chuyển từ hàm Boolean sang sơ đồ mạch của hệ
thống. Cũng tương tự khi phân tích một hệ thống người phân tích cần phải phân tích sơ
đồ mạch của hệ thống, rồi chuyển nó thành các hàm Boolean, sau đó mới lập lại các
chức năng, hoạt động của hệ thống. Tất cả các bước nói trên hoàn toàn phải thực hiện
thủ công không có bất kỳ sự trợ giúp nào của máy tính. Người thiết kế chỉ có thể sử
6


dụng máy tính làm công cụ hỗ trợ trong việc vẽ sơ đồ mạch của hệ thống và chuyển từ
sơ đồ mạch sang công cụ tổng hợp mạch vật lý dùng công cụ Synthesis. Một nhược
điểm khác nữa của phương pháp thiết kế truyền thống là sự giới hạn về độ phức tạp
của hệ thống được thiết kế .Phương pháp dùng hàm Boolean chỉ có thể dùng để thiết
kế hệ thống lớn nhất biểu diễn bởi vài trăm hàm. Còn phương pháp dựa trên sơ đồ chỉ
có thể dùng để thiết kế hệ thống lớn nhất chứa khoảng vài nghìn phần tử.
1.2.2. Mô tả bằng HDL
Sự ra đời của ngôn ngữ mô phỏng phần cứng (HDL) đã giải quyết được rất
nhiều nhược điểm lớn của các phương pháp thiết kế trước đây: Nếu các phương pháp
cũ đòi hỏi phải chuyển đổi từ mô tả hệ thống (các chỉ tiêu về chức năng) sang tập hợp
các hàm logic bằng tay thì bước chuyển đó hoàn toàn không cần thiết khi dùng HDL.
Hầu hết các công cụ thiết kế dùng ngôn ngữ mô phỏng phần cứng đều cho phép sử
dụng biểu đồ trạng thái cho các hệ thống tuần tự cũng như cho phép sử dụng bảng
chân lý cho hệ thống tổng hợp. Việc chuyển đổi từ các biểu đồ trạng thái và bảng chân
lý sang mã ngôn ngữ mô phỏng phần cứng được thực hiện hoàn toàn tự động.
Nhờ tính dễ kiểm tra thử nghiệm hệ thống trong suốt quá trình thiết kế mà

người thiết kế có thể dễ dàng phát hiện các lỗi thiết kế ngay từ những giai đoạn đầu,
giai đoạn chưa đưa vào sản xuất thử, do đó tiết kiệm được lượng chi phí đáng kể bởi từ
ý thiết kế đến tạo ra sản phẩm đúng như mong muốn là một việc rất khó tránh khỏi
những khó khăn, thất bại. Khi mọi lĩnh vực của khoa học đều phát triển không ngừng
thì sự phức tạp của hệ thống điện tử cũng ngày một tăng theo và gần như không thể
tiến hành thiết kế thủ công mà không có sự trợ giúp cuả các loại máy tính hiện đại.
Ngày nay, ngôn ngữ mô tả phần cứng HDL được dùng nhiều để thiết kế cho các thiết
bị logic lập trình được PLD từ loại đơn giản đến các loại phức tạp như ma trận cổng
lập trình được FPGA. Có ba ngôn ngữ mô tả phần cứng phổ biến hiện nay là:
1.2.2.1. Verilog HDL
Ra đời năm 1983, do hai kỹ sư Phil Moorby và Prabhu Goel làm việc tại
Automated Integrated Design Systems (sau này thuộc sở hữu của Cadence). Verilog
được IEEE chính thức tiêu chuẩn hóa vào năm 1995 và sau đó là các phiên bản năm
2001, 2005. Đây là một ngôn ngữ mô tả phần cứng có cấu trúc và cú pháp gần
giống với ngôn ngữ lập trình C, ngoài khả năng hỗ trợ thiết kế logic thì Verilog rất
mạnh trong việc hỗ trợ cho quá trình kiểm tra thiết kế. Một số đặc điểm của Verilog:
- Verilog là một trong những phương thức thiết bị có thể xử lý nhiều mức thiết
kế khác nhau. Nó có thể chuẩn hóa dữ liệu chuyển đến giữa các giai đoạn thiết bị và
làm đơn giản hóa lập tài liệu.
- Nền tảng mạnh: Chuẩn hóa 1995 bởi IEEE, hỗ trợ công nghiệp, phổ biến
cho các nhà ASIC vì dễ học cho phép mô phỏng nhanh và tổng hợp hiệu quả.
- Tính đa năng: Cho phép quá trình thiết kế thực thể thực hiện trong môi
trường thiết kế cả phân tích và kiểm tra. Tuy nhiên Verilog không thích hợp lắm cho
các thiết kế mức hệ thống phức tạp, đây là trở ngại chính của Verilog.
- Hỗ trợ công nghiệp: Phổ biến cho các nhà thiết kế ASIC vì dễ học , cho
phép mô phỏng nhanh và tổng hợp hiệu quả.
- Có khả năng mở rộng IEEE Std 1364 chứa định nghĩa của PLI Verilog
(Programming Language Interface) cho phép mở rộng khả năng của Verilog. Nó là
7



một tập hợp các bộ định tuyến cho phép các chức năng bên ngoài truy nhập thông tin
chức năng thiết kế Verilog.
- Một module Verilog có thể thể hiện được cả giao diện và thân chương
trình của một hệ thống.
1.2.2.2. VHDL
VHDL viết tắt của Very-high-speed intergrated circuits Hardware Description
Language, hay ngôn ngữ mô tả cho các mạch tích hợp tốc độ cao. VHDL lần đầu
tiên được phát triển bởi Bộ Quốc Phòng Mỹ nhằm hỗ trợ cho việc thiết kế những
vi mạch tích hợp chuyên dụng (ASICs). VHDL cũng được IEEE chuẩn hóa vào các
năm 1987, 1991, 2002, và 2006 và mới nhâts 2009. VHDL được phát triển dựa trên
cấu trúc của ngôn ngữ lập trình Ada. Cấu trúc của mô tả VHDL tuy phức tạp hơn
Verilog nhưng mang tính logic chặt chẽ và gần với phần cứng hơn.
VHDL được phát triển như một ngôn ngữ độc lập không gắn với bất kỳ một
phương pháp thiết kế, một bộ mô tả hay công nghệ phần cứng nào. Người thiết kế có
thể tự do lựa chọn công nghệ, phương pháp thiết kế trong khi chỉ sử dụng một ngôn
ngữ duy nhất. Và khi đem so sánh với các ngôn ngữ mô phỏng phần cứng khác ta
thấy VHDL có một số ưu điểm hơn hẳn các ngôn ngữ khác:
- Thứ nhất là tính công cộng: VHDL được phát triển dưới sự bảo trợ của
chính phủ Mỹ và hiện nay là một tiêu chuẩn của IEEE. VHDL được sự hỗ trợ của
nhiều nhà sản xuất thiết bị cũng như nhiều nhà cung cấp công cụ thiết kế mô phỏng
hệ thống.
- Thứ hai là khả năng hỗ trợ nhiều công nghệ và phương pháp thiết kế. VHDL
cho phép thiết kế bằng nhiều phương pháp ví dụ phương pháp thiết kế từ trên xuống,
hay từ dưới lên dựa vào các thư viện sẵn có. VHDL cũng hỗ trợ cho nhiều loại công
cụ xây dựng mạch như sử dụng công nghệ đồng bộ hay không đồng bộ, sử dụng ma
trận lập trình được hay sử dụng mảng ngẫu nhiên.
- Thứ ba là tính độc lập với công nghệ: VHDL hoàn toàn độc lập với công
nghệ chế tạo phần cứng. Một mô tả hệ thống dùng VHDL thiết kế ở mức cổng có
thể được chuyển thành các bản tổng hợp mạch khác nhau tuỳ thuộc công nghệ

chế tạo phần cứng mới ra đời nó có thể được áp dụng ngay cho các hệ thống đã
thiết kế.
- Thứ tư là khả năng mô tả mở rộng: VHDL cho phép mô tả hoạt động của
phần cứng từ mức hệ thống số cho đến mức cổng. VHDL có khả năng mô tả hoạt
động của hệ thống trên nhiều mức nhưng chỉ sử dụng một cú pháp chặt chẽ thống
nhất cho mọi mức. Như thế ta có thể mô phỏng một bản thiết kế bao gồm cả các hệ
con được mô tả chi tiết.
- Thứ năm là khả năng trao đổi kết quả: Vì VHDL là một tiêu chuẩn được chấp
nhận, nên một mô hình VHDL có thể chạy trên mọi bộ mô tả đáp ứng được tiêu
chuẩn VHDL. Các kết quả mô tả hệ thống có thể được trao đổi giữa các nhà thiết
kế sử dụng công cụ thiết kế khác nhau nhưng cùng tuân theo tiêu chuẩn VHDL. Cũng
như một nhóm thiết kế có thể trao đổi mô tả mức cao của các hệ thống con trong
một hệ thống lớn (trong đó các hệ con đó được thiết kế độc lập).
- Thứ sáu là khả năng hỗ trợ thiết kế mức lớn và khả năng sử dụng lại các
thiết kế: VHDL được phát triển như một ngôn ngữ lập trình bậc cao, vì vậy nó có thể
8


được sử dụng để thiết kế một hệ thống lớn với sự tham gia của một nhóm nhiều
người. Bên trong ngôn ngữ VHDL có nhiều tính năng hỗ trợ việc quản lý, thử
nghiệm và chia sẻ thiết kế. Và nó cũng cho phép dùng lại các phần đã có sẵn.
Ngoài hai ngôn ngữ kể trên còn có ngôn ngữ Altera HDL được phát triển bởi
công ty bán dẫn Altera với mục đích dùng thiết kế cho các sản phẩm FPGA và CPLD
của Altera. AHDL có cấu trúc hết sức chặt chẽ và là ngôn ngữ rất khó sử dụng nhất
so với 2 ngôn ngữ trên. Bù lại AHDL cho phép mô tả thực thể logic chi tiết và
chính xác hơn. Ngôn ngữ này ít phổ biến tuy vậy nó cũng được rất nhiều chương trình
phần mềm hỗ trợ mô phỏng biên dịch.
1.3. Giới thiệu về phương pháp máy trạng thái
1.3.1. Giới thiệu


Một thiết kế mạch số có thể được chia làm 2 thành phần: bộ xử lý dữ liệu
và bộ điều khiển. Mối quan hệ giữa bộ điều khiển và bộ xử lý dữ liệu trong
mạch được biểu diễn.
Máy trạng thái hữu hạn (FSM) là một công nghệ mô hình hoá đặc biệt cho
các mạch logic tuần tự. Mô hình đó có thể được giúp đỡ trong thiết kế của
những loại hệ thống nào đó, đặc biệt là các thao tác của những hệ thống đó theo
khuôn dạng tuần tự hoàn toàn xác định.
Hình sau đây chỉ ra sơ đồ khối của một máy trạng thái một
pha. Trong hình này, phần mạch dãy chứa các mạch dãy (flipflops), phần cao chứa mạch logic tổ hợp.

Hình 2. Sơ đồ máy trạng thai

Phần mạch tổ hợp có 2 đầu vào và 2 đầu ra:
- Đầu vào thứ nhất: là đầu vào trạng thái hiện tại của máy.
- Đầu vào thứ 2: là đầu vào từ bên ngoài.
9


- Đầu ra thứ nhất: là đầu ra phía ngoài
- Đầu ra thứ 2: là trạng thái tiếp theo của máy.
Phần mạch dãy có:
- 3 đầu vào: clock, reset, và trạng thái tiếp theo
- 1 đầu ra: trạng thái hiện tại.
Tất cả các flip-flop đều nằm trong phần này, các tín hiệu clock và reset
phải được kết nối với các flip – flop để thực hiện việc điều khiển.
Như vậy, một máy ôtômát hữu hạn là một bộ 6 thông số <X, Y, S, s0, d,l>,
trong đó:
X - Tập hợp các tín hiệu vào của ôtômat:
X = { x1(t),…,xn(t)}
Tập các tín hiệu ra của ôtômat:

Y = {y1(t),…,ym(t)}
Tập hợp các trạng thái của ôtômat:
S = {s1(t),…,ss(t)}
Hàm d(s, x) – hàm chuyển trạng thái của ôtômat
Hàm l(s,x) – hàm đầu ra của ôtômat.
Tương ứng với các phương pháp tính toán hàm chuyển trạng thái và hàm
ra, chúng ta có các loại ôtômat khác nhau. Hai dạng ôtômat hữu hạn chuyên
dụng là: ôtômat Moore và ôtômat Mealy.
Quay lại với hình vẽ trên, mạch cần thiết kế được chia làm hai đoạn.
Việc chia đoạn như thế này sẽ giúp chúng ta thiết kế tốt hơn. Chúng ta sẽ
thiết kế 2 phần theo những cách khác nhau. Cụ thể trong môi trường VHDL,
phần mạch dãychúng ta sẽ thực hiện trong PROCESS và phần mạch tổ hợp
chúng ta có thể thực hiện theo cấu trúc hoặc tuần tự hoặc kết hợp cả cấu trúc lẫn
tuần tự.
Tuy nhiên mã tuần tự có thể áp dụng cho cả 2 loại logic: tổ hợp và tuần tự.
Thông thường các tín hiệu clock và các tín hiệu reset trong phần mạch
dãy sẽ xuất hiện trong PROCESS (trừ khi tín hiệu reset là đồng bộ hoặc không
được sử dụng, tín hiệu WAIT được sử dụng thay cho lệnh IF). Khi tín hiệu reset
được xác nhận, trạng thái hiện tại sẽ được thiết lập cho trạng thái khởi tạo của hệ
thống. Mặt khác, tại sườn đồng hồ thực tế, các flip-flop sẽ lưu trữ trạng thái tiếp
theo, do đó sẽ chuyển nó tới đầu ra của phần mạch dãy(trạng thái hiện tại).
Một điều quan trọng liên quan tới phương pháp FSM là : về nguyên tắc
chung là bất kỳ một mạch dãynào cũng có thể được mô hìnhhoá thành 1 máy
trạng thái, nhưng điều này không phải luôn luôn thuận lợi. Vì có nhiều trường
hợp (đặc biệt là các mạch thanh ghi như: bộ đếm,…) nếu thiết kế theo phương
10


pháp FSM thì mã nguồn có thể trở nên dài hơn, phức tạp hơn, mắc nhiều lỗi hơn
so với phương pháp thông thường.

Như thành một quy tắc nhỏ, phương pháp FSM thì thích hợp với các hệ
thống mà thao tác của nó là một dãyhoàn toàn được cấu trúc, ví dụ: các mạch
điều khiển số. Vì đối với các hệ thống loại này thì tất cả các trạng thái của nó có
thể dễ dàng được liệt kê. Khi soạn thảo mã VHDL, thì các trạng thái này sẽ được
khai báo trong phần đầu của phần ARCHITECTURE dưới dạng kiểu dữ liệu liệt
kê được định nghĩa bởi người sử dụng.
1.3.2. Thiết kế theo kiểu 1 (thiết kế theo mô hình
moore)

Có vài phương pháp có thể được hình thành để thiết kế một FSM. Trong
đó phần mạch dãy của máy trạng thái sẽ tách biệt với phần mạch tổ hợp của nó
(hình vẽ 1.3.1). Tất cả các trạng thái của máy luôn luôn được khai báo rõ ràng
bằng cách sử dụng kiểu dữ liệu liệt kê.
Thiết kế theo mô hình moore chúng ta thiết kế theo 2 bước:
- Thiết kế mạch dãy.
- Thiết kế phần mạch tổ hợp.
1.3.3. Thiết kế theo kiểu 2

Ta thấy trong kiểu thiết kế 1 thì chỉ có trạng thái hiện tại được lưu trữ. Tất
cả các mạch.
Trong trường hợp này nếu mạch là máy Mealy (đầu ra của nó phụ thuộc
vào đầu vào hiện tại), đầu ra có thể thay đổi khi đầu vào thay đổi (đầu ra không
đồng bộ).
Trong nhiều ứng dụng, tín hiệu được yêu cầu là đồng bộ, thì đầu ra sẽ chỉ
cập nhật khi thay đổi sườn clock. Để tạo ra máy đồng bộ Mealy, đầu ra phải
được lưu trữ tốt, như:





nh 3a. Sơ đồ mạch kiểu 1

nh 3b. Sơ đồ mạch kiểu 2

Cấu trúc như trong hình 3b sẽ là đối tượng của thiết kế kiểu 2.
11


12


CHƯƠNG 2
THIẾT KẾ BỘ ĐẾM 00 ĐẾN 99 RESET VỀ 0
2.1. Vẽ sơ đồ FSM
FSM là viết tắt của cụm từ Finite State Machine có nghĩa là Máy trạng thái hữu
hạn, FSM có 2 loại đó là:
- FSM loại Moore (phụ thuộc vào trạng thái)
- FSM loại Mealy (phụ thuộc vào trạng thái - tín hiệu vào)
Trong bài báo cáo này chúng em sẽ sử dụng FSM loại Moore để
vẽ sơ đồ FSM. Với đề bài là thiết kế một bộ đếm từ 00 đến 99 có
reset thì đầu ra chỉ phụ thuộc vào kết quả của trạng thái hiện tại.
Nhìn một cách tổng thể, chúng ta sẽ cần có 2 máy có 10 trạng thái.
Các trạng thái ở đây được gọi là zero, một,…, chín. Đồ hình trạng thái
của máy được cho là như sau:

Hình 4. Sơ đồ FSM biểu thị ra BCD-to-7 segment
13


14



2.2. Phương án thiết kế
Điều kiện để một mạch trở thành mạch đếm là nó phải có các trạng thái khác
nhau mỗi lần có xung clock vào và số trạng thái tối đa đếm được gọi là dung lượng
mạch đếm 2n.
Khi đã đạt đến trạng thái tối đa nếu tiếp tục kích thích mạch thì mạch sẽ trở về
trạng thái ban đầu ta nói mạch đếm có tinh tuần hoàn.
Có nhiều cách kết hợp các FF, nên cũng có nhiều loại mạch đếm, ta chỉ đưa ra
làm 2 loại mạch cơ bản là mạch đếm nhị phân và mạch đếm Modulo M và trong mỗi
loại ta có 2 phương pháp kích thích đồng bộ và không đồng bộ.
Với 10 trạng thái của máy này thì số lượng Flip-Flop được yêu cầu ứng với các
kiểu mã hóa sẽ bằng:
- Ứng với kiểu mã hóa nhị phân, số Fip-Flop = 4 ()

Hình 5. Bộ đếm hai chữ số thập phân 0 → 99 → 0, đầu ra là 2
LED 7 thanh
Chúng em sẻ sử dụng hai bộ đếm với 2 ngõ ra digit1 và digit 2 hiển thị giải mã
nhị phân trên 2 LED 7 thanh.
Nguyên lý hoạt động như sau: Mạch đếm đầu tiên nơi có xung đếm vào là hàng
đơn vị, mạch đếm tiếp theo là hàng chục. Ta cũng có thể nói mạch đếm có nhiều số, số
có giá trị thấp nhất là LSD và số có giá trị cao nhất là MSD. Ví dụ để đếm từ 0 lên đến
99 thì cần 2 mạch đếm mắc nối tiếp. Với số đếm tối đa là 99 thì tuỳ theo dấu thập phân
nằm ở đâu mà có các trị số 9, 9.9, .. Số đếm ở các mạch đếm được đưa vào khối hiển
thị gồm mạch giải mã và các đèn hiển thị. Ở mạch hình khi ngõ digit1 đã đếm đầy tức
đạt đến số đếm 9 = 1001, thì nếu có thêm một xung vào nữa mạch đếm sẽ tự động
reset về 0. Số đếm lúc bây giờ của digit2 mạch đếm là 1=0001. Tiếp tục như thế mạch
đếm lên 11 … 19 rồi 20 , 21 ….29, 30, 31…

15



2.3. Bộ giải mã BCD-to-7 segment

16


2.4. Code VHDL

LIBRARY ieee;
USE ieee.std_logic_1164.all;
-------------------------------------------------ENTITY bcd_counter IS
PORT (

clk, reset : IN STD_LOGIC;
digit1, digit2, digit3 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0));

END bcd_counter;
-------------------------------------------------ARCHITECTURE counter OF bcd_counter IS
--------FSM------------type state is (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9);
signal s:state;
signal q: bit;
begin
next_state: process(reset,clk)
begin
if (reset='1') then s<=s0; else
if (clk'EVENT AND clk='1') then
Case s is
--neu clk=1 thi chuyen toi s1, nguoc lai thi quay lai s0
when s0 => digit3 <= "1111011";if clk='1' then s <=s1; else s<=s0;end if;

when s1 => digit3 <= "1111110";if clk='1' then s <=s2; else s<=s1;end if;
when s2 => digit3 <= "0110000";if clk='1' then s <=s3; else s<=s2;end if;
when s3 => digit3 <= "1101101";if clk='1' then s <=s4; else s<=s3;end if;
when s4 => digit3 <= "1111001";if clk='1' then s <=s5; else s<=s4;end if;
when s5 => digit3 <= "0110011";if clk='1' then s <=s6; else s<=s5;end if;
when s6 => digit3 <= "1011011";if clk='1' then s <=s7; else s<=s6;end if;
when s7 => digit3 <= "1011111";if clk='1' then s <=s8; else s<=s7;end if;
when s8 => digit3 <= "1110000";if clk='1' then s <=s9; else s<=s8;end if;
when s9 => digit3 <= "1111111";if clk='1' then s <=s0; else s<=s9;end if;
end case;
end if;
17


end if;
end process;
PROCESS(clk, reset)
VARIABLE temp1: INTEGER RANGE 0 TO 10;
VARIABLE temp2: INTEGER RANGE 0 TO 10;
BEGIN
---- counter: ---------------------IF (reset='1') THEN
temp1 := 0;
temp2 := 0;
ELSIF (clk'EVENT AND clk='1') THEN
temp1 := temp1 + 1;
IF (temp1=10) THEN
temp1 := 0;
temp2 := temp2 + 1;
IF (temp2=10) THEN
temp2 := 0;

END IF;
END IF;
END IF;
---- BCD to SSD conversion: -------CASE temp1 IS
WHEN 0 => digit1 <= "1111110"; --7E, the seven-segment displays 0
WHEN 1 => digit1 <= "0110000"; --30, the seven-segment displays 1
WHEN 2 => digit1 <= "1101101"; --6D, the seven-segment displays 2
WHEN 3 => digit1 <= "1111001"; --79, the seven-segment displays 3
WHEN 4 => digit1 <= "0110011"; --33, the seven-segment displays 4
WHEN 5 => digit1 <= "1011011"; --5B, the seven-segment displays 5
WHEN 6 => digit1 <= "1011111"; --5F, the seven-segment displays 6
WHEN 7 => digit1 <= "1110000"; --70, the seven-segment displays 7
WHEN 8 => digit1 <= "1111111"; --7F, the seven-segment displays 8
WHEN OTHERS => digit1 <= "1111011"; --7B, the seven-segment displays 9
END CASE;
CASE temp2 IS
18


WHEN 0 => digit2 <= "1111110"; --7E
WHEN 1 => digit2 <= "0110000"; --30
WHEN 2 => digit2 <= "1101101"; --6D
WHEN 3 => digit2 <= "1111001"; --79
WHEN 4 => digit2 <= "0110011"; --33
WHEN 5 => digit2 <= "1011011"; --5B
WHEN 6 => digit2 <= "1011111"; --5F
WHEN 7 => digit2 <= "1110000"; --70
WHEN 8 => digit2 <= "1111111"; --7F
WHEN OTHERS => digit2 <= "1111011"; --7B
END CASE;

END PROCESS;
END counter;

19


Chương 3.
THIẾT KẾ VÀ MÔ PHỎNG
BỘ ĐẾM 00 ĐẾN 99 BẰNG NGÔN NGỮ VHDL
TRÊN PHẦN MỀM QUARTUS PRIME 16.0 LITE EDITION
3.1. Tạo project cho mạch
Bước 1: Khởi động giao diện phần mềm Quatus
Bước 2: Tạo Project mới

Hình 6. Cửa sổ khởi tạo Project mới
Đầu tiên để tạo Project mới chọn trên thanh công cụ File->New Project Wizard,
sau đó một cửa sổ hiện ra để chọn thư mục lưu Project, tên Project và tên Top-module.
Điền tên Project và top-module là bcd_counter
Tiếp theo, bấm Next để chuyển sang cửa sổ chọn họ và tên linh kiện.

Hình 7. Cửa sổ chọn họ và tên linh kiện
Tiếp theo, bấm Next để chuyển sang cửa sổ chọn ngôn ngữ lập trình.
20


Hình 8. Cửa sổ chọn ngôn ngữ lập trình
Cuối cùng ấn Finish hoàn thành việc lập New Project Winzard.

Hình 9. Cửa sổ hoàn thành việc lập New Project Winzard


21


3.2. Tạo file chương trình VHDL
Để tạo một File VHDL, trên thanh công cụ chọn File->New, khi này cửa sổ
New sẽ hiện ra và ta chọn VHDL File rồi bấm OK để tạo.

Hình 10. Cửa sổ khởi tạo File VHDL
Sau khi tạo được File VHDL ta thực hiện nạp code chương trình cho mạch hoạt
động.

Hình 11. Cửa sổ nạp code File VHDL
Sau khi nạp code xong bấm Ctrl-S để lưu file và thực hiện biên dịch, trên thanh
công cụ chọn Processing -> Start Compilation.

22


Hình 12. Cửa sổ biên dịch chương trình
Sau khi biên dịch thành công không có lỗi thì chương trình sẽ báo successful,
bấm Ok file VHDL được tạo ra.

Hình 13. Cửa sổ biên dịch thành công

23


3.3. Mô phỏng Function và Timing
3.3.1. Giản đồ Waveform
Để mô phỏng chức năng của mạch ta cần tạo một File dạng sóng của mạch.

Trên thanh công cụ chọn File->New->University Program VWF->OK. Một cửa sổ
dạng sóng sẽ xuất hiện.

Hình 14. Cửa sổ tạo File Waveform

Hình 15. Cửa sổ University Program VWF
Sau khi tạo thành công một File Waveform, ta lưu lại rồi thực hiện mô phỏng
như sau. Trong cửa sổ Waveform, click chuột phải vào khung Name, chọn Insert>Insert node or Bus để chọn các cổng cần mô phỏng. Khi đó xuất hiện cửa sổ Insert
Node or Bus, chọn Node Finder, trong cửa sổ Node Finder chọn Pins: all, sau đó bấm
List rồi chọn các cổng cần mô phỏng.
24


Tiếp theo trong cửa sổ Waveform, cài đặt cổng clk là tín hiệu xung clock.

Hình 16. Cửa sổ xung Clock
3.3.2. Mô phỏng Function
Sau đó mô phỏng hoạt động của mạch như sau, trên thanh công cụ chọn
Simulator->Run Function Simulator

Hình 17. Cửa sổ chọn Run Function Simulator

25


×