Professional Documents
Culture Documents
Báo Cáo Gi A Kì PDF
Báo Cáo Gi A Kì PDF
HỒ CHÍ MINH
KHOA ĐIỆN - ĐIỆN TỬ
BÁO CÁO
THỰC TẬP THIẾT KẾ HỆ THỐNG VÀ
VI MẠCH TÍCH HỢP
2
CHƯƠNG I . THIẾT KẾ HỆ THỐNG TẠO SỐ NGẪU NHIÊN
ĐỀ BÀI: Thiết kế hệ thống tạo ra số ngẫu nhiên có giá trị từ 0 đến 99 hiển thị
trên 2 led 7 đoạn Anode chung. Hệ thống sử dụng nguồn xung có tần số 50 Mhz
- Nhấn nút Start, hệ thống sẽ tạo ra một số ngẫu nhiên hiển thị trên 2 led 7 đoạn
sau khi nút nhấn
Start được thả ra.
- Nhấn nút Reset, xoá bộ đếm hiển thị trên 2 led 7 đoạn về 00.
1. MÔ TẢ ĐỀ TÀI
1.1 Yêu cầu đề bài
Để thiết kế hệ thống hiển số ngẫu nhiên từ 0 đến 99 hiển thị trên 2 led 7 đoạn
Anode chung ta cần quan tâm.
Hệ thống có 2 nút nhấn là Start để khởi tạo quá trình hiển thị ngẫu nhiên và
Reset để khởi tạo lại giá trị 00. Khi nhấn Start thì hiện ngẫu nhiên 1 số bất kì từ
0 đến 99. Nhấn Reset thì 2 led bảy đoạn sẽ hiện số 00, quay lại giá trị ban đầu.
Ta sử dụng ngôn ngữ lập trình phần cứng Verilog để thiết kế hệ thống điều
khiển và mô phỏng hoạt động của mạch.
Để thiết kế mạch ta sử dụng một Linear Feedback Shift Register (LFSR) để tạo
số ngẫu nhiên trong Verilog.
Trong một LFSR 32 – bit, số ngẫu nhiên được sử dụng bằng một seed( tương tự
như một giá trị ban đầu) để khởi tạo được chuỗi giá trị mới. Sau đó, mỗi giá trị
được tạo sẽ được lấy giá trị của seed và thực hiện một phép toán bất kì nào đó.
Các giá trị số ngẫu nhiên được tạo ra bằng cách lấy 8 bit thấp của seed ở thời
điểm hiện tại, sau đó các giá trị này được hiển thị trên led 7 đoạn Anode chung.
Chúng ta sử dụng một bộ đếm để chờ thời gian ngắn từ lúc nhấn nút Start đến
lúc hiển thị số trên led 7 đoạn. Khi nút Reset được nhấn, chúng ta đặt bộ đếm và
led 7 đoạn được trả về giá trị ban đầu.
3
2. MÔ PHỎNG MẠCH TRÊN ISE XILINX
2.1Code thiết kế
module NGUYENDUCTHINH( // Khai báo module tên NGUYENDUCTHINH
reg [7:0] rand_num; // Khai báo biến lưu giá trị số ngẫu nhiên
reg [3:0] state; // Khai báo biến lưu trạng thái của Mô-đun
reg [3:0] count; // Biến đếm để tạo delay khi nhấn nút
reg [31:0] seed; // Biến lưu giá trị để sinh số ngẫu nhiên
initial begin // Khởi tạo giá trị ban đầu ngẫu nhiên cho sedd
seed = 32'h4D59535F; // Gán giá trị ban đầu cho seed
4
end
always @(posedge clk) begin // Bắt đầu khối, kích cạnh lên xung clock
if (rst) begin // Nếu tín hiệu Reset được kích hoạt
seg_dp <= 4'b0000; // Giá trị về 0
seg_A <= 7'b0000000; // Giá trị led 1 là 0
seg_B <= 7'b0000000; // Giá trị led 2 là 0
rand_num <= 8'b00000000; // Giá trị số ngẫu nhiên được trả về 0
state <= 4'b0000; // Giá trị 0
count <= 4'b0000; // Biến đếm mang giá trị 0
end
else begin // Trường hợp không nhấn nút Reset
case(state) // Gán các giá trị trạng thái cho Mô – đun
4'b0000: begin // Giá trị ban đầu là 0
if (start) begin // Nếu nút Start được kích hoạt
state <= 4'b0001; // Trạng thái chuyển sang giá trị 1
// Giá trị ngẫu nhiên được tạo và được lưu trong biến rand_num
end
end
4'b0001: begin
count <= count + 1; // Biến count ghi lại dòng lập mỗi lần
chuyển trạng thái
if (count == 4'hF) begin // Biến đếm đạt đến giá trị 15
count <= 4'h0;
seed = lfsr(seed);
// Seed được đưa vào lfsr tạo giá trị random mới
rand_num <= seed[7:0]; // Biến ran_num được gán cho giá
trị ngẫu nhiên vừa được tạo ở biến seed phía trên
end
5
if (start == 0) begin // Tín hiệu Start bị vô hiệu hóa
seg_A <= rand_num & 7; // 3 bit cao được lưu trong đèn 1
seg_B <= rand_num >> 3; // 3 bit thấp lưu trong đèn 2
state <= 4'b0010; // Biến trạng thái ở 0010
end // Kết thúc
end
4'b0010: begin // Bắt đầu trạng thái 0010
if (start == 0) begin // Nếu Start bị vô hiệu hóa
seg_A <= {7{1'b1}} ^ (1 << seg_A); // Lưu trữ 4 bit thấp
seg_B <= {7{1'b1}} ^ (1 << seg_B); // Lưu trữ 4 bit cao
seg_dp <= 4'b0000;
state <= 4'b0001;
// Quay lại trạng thái ban đầu và chờ được start
end
end
default: begin
state <= 4'b0000;
end
endcase
end
end
endmodule
6
2.2Sơ đồ hệ thống của mạch
7
# Code của khối COUNTER
begin
count <= count + 1; // Biến count ghi lại dòng lập mỗi lần
chuyển trạng thái
if (count == 4'hF) begin // Biến đếm đạt đến giá trị 15
count <= 4'h0;
seed = lfsr(seed);
8
Hình 5. Khối tạo số ngẫu nhiên Seed
# Code khối tạo số ngẫu nhiên
seed = lfsr(seed); // Shift seed
rand_num <= seed[7:0]; // Generate random number
Biến seed nhận giá trí của biến seed sau khi thực hiện phép tính lfsr rồi được
gán vào biến ran_num để xuất ra số ngẫu nhiên ra led 7 đoạn.
9
end
end
4'b0010: begin // Display number
if (start == 0) begin
seg_A <= {7{1'b1}} ^ (1 << seg_A);
seg_B <= {7{1'b1}} ^ (1 << seg_B);
Khi start chưa được kích hoạt, led 1 và 2 ( A và B) lần lượt xuất 3 bit cao của
led 1 và 3 bit thấp của led 2. Khi strart được kích hoạt, khối seed sẽ thực hiện
phép tính lfsr rồi trả kết quả ra cho khối xuất số ngẫu nhiên.
2.3 Testbench kiểm tra hoạt động của hệ thống
# Code testbench
module NGUYENDUCTHINH_tb;
NGUYENDUCTHINH dut (
.clk(clk),
.rst(rst),
.start(start),
.seg_dp(seg_dp),
.seg_A(seg_A),
.seg_B(seg_B)
);
10
initial begin // Bắt đầu việc cấp nguồng cho hệ thống
clk = 0; // Xung clock khởi tạo bằng 0
rst = 1; // Cho reset bằng 1 để hệ thống ở trạng thái ban đầu (0)
start = 0; // Start bằng 0 hệ thống bị vô hiệu hóa
#10 rst = 0; // Sau 10ns rst được trả về 0
#10 start = 1; // Sau 10ns nữa start mang giá trị 1 sau khi nhấn
#100 start = 0; // 100ns sau khi nhấn và thả start ra , ta được tín hiệu ngẫu
nhiên
#100 $finish;
end
always #5 clk = ~clk; // Sau 5s xung clock kích cạnh lên khởi tạo tín hiệu
endmodule
Mô phỏng dạng sóng
11
Start = 1 sau khi
Reset = 1 nhấn nút
12
Hình 10. Tín hiệu ngõ ra
Ở thời điểm 135ns với sự tác động khi thả nút nhấn và và cạnh lênh xung
clock kích thích tạo nên tín hiệu ngõ ra ở hai led 7 đoạn.
13
Hiển thị trên 2 led là 111111 chuyển qua hệ DEC là 63. Sau đó ở chu kì tới với
tác dụng xung clock 2 tín hiệu ngõ ra là 00. Cuối cùng chạy hết chu kì và kết
thúc quá trình làm việc.
3. KẾT LUẬN
Hệ thống hoạt động đúng với yêu cầu lí thuyết, tạo ra tín hiệu ngõ ra ở hai
led 7 đoạn với việc kích thích tín hiệu đầu vào start và reset để điều khiển tín
hiệu dựa trên xung cạnh lên của tín hiệu clock. Tạo được số ngẫu nhiên từ 0
đến 99.
14
CHƯƠNG 2. THIẾT KẾ MẠCH ĐIỀU KHIỂN ĐỘNG CƠ
ĐỀ BÀI: Thiết kế mạch điều khiển động cơ như sau:
- Động cơ được điều khiển thông qua mạch cầu H với 2 tín hiệu điều khiển M1,
M0 (00: dừng, 01chạy thuận, 10 chạy nghịch)
- 1 Led 7 đoạn anode chung hiển thị giá trị 0 khi động cơ dừng, 1 khi chạy
thuận và 2 khi chạy nghịch.
- 1 nút nhấn được đặt tên Run: khi nhấn thì lần lượt chuyển trạng thái của động
cơ từ dừng, chạy thuận, chạy nghịch, dừng …
- Sử dụng máy trạng thái (FSM) để thiết kế, không cần thiết kế mạch chống dội
phím nhấn, giả sử mỗi lần nhấn phím sẽ tạo được xung vuông có độ rộng 10 ms.
1. MÔ TẢ ĐỀ TÀI
Tạo một hệ thống điều khiển với một nút nhấn được đặt tên là Run, mỗi lần
nhấn sẽ tạo ra một trạng thái khác nhau là dừng, chạy thuận và chạy nghịch. Các
trạng thái được điều khiển bằng 2 tín hiệu thông qua mạch cầu H là M1 và M2
với các trạng thái 00 là mạch dừng, 01 mạch sẽ chạy thuận và 10 mạch sẽ chạy
nghịch.
Hệ thống còn có thêm 1 led 7 đoạn hiển thị mỗi lần thay đổi trạng thái của bộ
điều khiển. Khi led hiện số 0 thì hệ thống dừng không hoạt động, khi hiện số 1
hệ thống chạy thuận và khi hiện số 2 hệ thống vẫn hoạt động nhưng chạy
nghịch.
2. MÔ PHỎNG HỆ THỐNG TRÊN MÁY
2.1 Code Verilog trên xilinx
module NGUYENDUCTHINH( // Khai báo module làm việc
input clk, // Tín hiệu ngõ vào clk (clock)
input reset, // Tín hiệu ngõ vào reset
input run, // Tín hiệu vào điều khiển run
output reg [6:0] seg, // Tín hiệu ra
output reg enA, // Tín hiệu ngõ ra enA (trường hợp 1)
output reg enB // Tín hiệu ngõ ra enB (trường hợp 2)
15
);
reg [1:0] motor_state = 2'b00; // Biến điều khiển 2bit với giá trị ban đầu là 0
reg [3:0] debounce_count = 4'b0000; // Biến đếm 4bit với giá trị đầu là 0
reg [3:0] debounce_limit = 4'b1010; // Biến giới hạn 4bit giá trị đầu là 0
always @(posedge clk) begin // Bắt đầu chương trình với kích thích xung clock
if (reset) begin // Nếu reset được kích hoạt
seg <= STOP_VAL; // Gán giá trị ban đầu cho tín hiệu dừng lại
enA <= 0; // Trạng thái tín hiệu 1 là 0
enB <= 0; // Trạng thái tín hiệu 2 là 0
motor_state <= 2'b00; // Led hiển thị 00 trên màn hình
debounce_count <= 4'b0000; // Biến đếm trạng thái 00
end else begin
if (run) begin // Khi nút run được kích hoạt
if (debounce_count == debounce_limit) // Biến đếm khi đạt giới hạn
begin
if (motor_state == 2'b00) begin // Đèn hiện giá trị 00
motor_state <= 2'b01; // Đèn chuyển trạng thái hiện 01
seg <= STOP_VAL + 1'b1; // Giá trị dừng 0 cộng lên 1
enA <= 1; // seg được cộng 1bit làm giá trị thay đổi lên 1 bit
enB <= 0; // Giá trị B vẫn được giữ nguyên, tạo lên tín hiệu 01
(chạy thuận)
end else if (motor_state == 2'b01) begin
motor_state <= 2'b10; // Tín hiệu được gán cho 10
16
seg <= STOP_VAL + 2'b10; // Stop 00 cộng 2bit 10
enA <= 0; // Giá trị A giữ nguyên
enB <= 1; // Giá trị B lên 1, tạo tín hiệu 10 ( Chạy nghịch)
end else if (motor_state == 2'b10) begin
motor_state <= 2'b01;
seg <= STOP_VAL + 1'b1;
enA <= 1;
enB <= 0;
end
debounce_count <= 4'b0000;
end else begin
debounce_count <= debounce_count + 1; // Mỗi lần thay đổi trạng
thái, biến đếm được cộng lên 1 để tạo delay tín hiệu
end
end else begin
seg <= STOP_VAL;// Ngược lại thì dừng tín hiệu và quay lại trạng thái
dừng
enA <= 0;
enB <= 0;
motor_state <= 2'b00; // Tín hiệu được gán lại là 00
debounce_count <= 4'b0000;
end
end
end
endmodule
17
2.2 Sơ đồ của mạch
18
# Code của khối đếm
debounce_count <= 4'b0000; // Biến đếm trạng thái 00
Biến đếm được khởi tạo với giá trị ban đầu là 00.
19
enA <= 1; // seg được cộng 1bit làm giá trị thay đổi lên 1 bit
enB <= 0; // Giá trị B vẫn được giữ nguyên, tạo lên tín hiệu 01
(chạy thuận)
end else if (motor_state == 2'b01) begin
motor_state <= 2'b10; // Tín hiệu được gán cho 10
seg <= STOP_VAL + 2'b10; // Stop 00 cộng 2bit 10
enA <= 0; // Giá trị A giữ nguyên
enB <= 1; // Giá trị B lên 1, tạo tín hiệu 10 ( Chạy nghịch)
end else if (motor_state == 2'b10) begin
motor_state <= 2'b01;
seg <= STOP_VAL + 1'b1;
enA <= 1;
enB <= 0;
end
Led 7 đoạn với hai tín hiệu enA và enB với đại diện cho 2bit hiển thị 0 và 1 với
các giá trị 00, 01 và 10.
Hình 15. Khối làm việc tổng quan của bộ điều khiển
20
2.3 Testbench kiểm tra hệ thống
* Code testbench
module NGUYENDUCTHINH_tb; // Tên module
NGUYENDUCTHINH dut (
.clk(clk),
.reset(reset),
.run(run),
.seg(seg),
.enA(enA),
.enB(enB)
);
initial begin
clk = 0;
reset = 0;
run = 0;
// Khởi tạo trạng thái đầu của clk, reset và run đều có giá trị 0
21
#10 reset = 1; // Kích hoạt reset sau 10ns
#10 reset = 0; // Tắt reset sau 10ns
#10 run = 1; // Nhấn run sau 10ns
#20 run =0; // Nhấn run lần nửa để tắt sau 20ns
#40 run =1; // Run kích hoạt sau 40ns
#220 run =0 ; // Run tắt sau 220ns
#300 run = 1; // Run bật sau 300ns
end
always #5 clk = ~clk; // Xung cloclk đảo cứ sau mỗi 5ns
endmodule
22
Hình 17. Dạng sóng ngõ ra tín hiệu
Khi nhấn nút Run lần nữa (Nút nhận mức 1) và hệ thống ở trạng thái đầu tiên là
trạng thái chạy thuận, enA nhận mức 1 và enB nhận mức 0, tín hiệu 1 được xác
lập, 7b’0000001 . Trên led 7 đoạn hiện số 1.
enA=1
enB=0
Run=1
23
Hình 19. Dạng sóng enA=enB=0
Khi Run=0, enA=enB = 0, giá trị ngõ ra 00, led hiện 00 và hệ thống dừng
7’0000000
enA
enB
24