Professional Documents
Culture Documents
Đại Học Quốc Gia Tp.Hồ Chí Minh: Trường Đại Học Khoa Học Tự Nhiên Khoa Điện Tử - Viễn Thông
Đại Học Quốc Gia Tp.Hồ Chí Minh: Trường Đại Học Khoa Học Tự Nhiên Khoa Điện Tử - Viễn Thông
HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA ĐIỆN TỬ – VIỄN THÔNG
---------------o0o---------------
• Phần Code :
module led (in,HEX); // module led
input [3:0] in; // Khai báo đầu vào là SW (ở đây chúng ta sử dụng SW0) tăng hoặc giảm
output [0:6] HEX; // khai báo đầu ra là HEX0[0] -> HEX0[6]
/* ở đây là led 7 đoạn anot chung, sáng = 0, tối = 1
sử dụng ngõ vào là thập phân 4 bit ngõ ra là thập lục 7 bit
module này thiết lập để hiển thị các số từ 0 ->9 ra led 7 đoạn
assign HEX = (in==4'd0) ? 7'h01 : với ngõ vào là 0 thì led sẽ hiển thị số 0 tương đương
dãy bit 0000001
(in==4'd1) ? 7'h4f : // 1 // 1001111
(in==4'd2) ? 7'h12 : // 2 // 0010010
(in==4'd3) ? 7'h06 : // 3 // 0000110
(in==4'd4) ? 7'h4c : // 4 // 1001100
(in==4'd5) ? 7'h24 : // 5 // 0100100
(in==4'd6) ? 7'h20 : // 6 // 0100000
(in==4'd7) ? 7'h0f : // 7 // 0001111
(in==4'd8) ? 7'h00 : // 8 // 0000000
(in==4'd9) ? 7'h04 : 7'h7f ; // 9 (0000100) và reset về số 0
endmodule
module cau1 (input CLOCK_50, input SW, output [0:6] HEX0); // tên module
reg [25:0] dem; // khai báo thanh ghi đếm có 26 bit với bit cao nhất là 25
reg [3:0] Q; // khai báo thanh ghi Q có ô bit với bit cao nhất là 3
2
always @(posedge CLOCK_50) // khối lệnh always điều khiển theo sự kiện cạnh lên của xung
CLOCk_50
dem<= dem +1'b1; // bộ đếm xung clk 50Mhz
always @(posedge dem[0])
if(SW == 1'b1) Q <= Q + 1'b1; // nếu Up/Down = 1 thi đếm lên ngược lại thì đếm
xuống
else Q <= Q - 1'b1;
led u0 (.in(Q), .HEX(HEX0)); // Goi module led7 đoạn để hiện thị ra led 7 đoạn
endmodule
3
Khi SW = 0
Khi SW = 1
4
Câu 2/ Thiết kế mạch cộng 2 số bit ( sử dụng các Switch làm ngõ vào ) hiển thị ra
LED 7 đoạn HEX0, HEX1 dưới dạng số thập phân
• Phần Code :
module bai2(input [7:0] SW,output reg [0:6] HEX0,HEX1); // khai báo module với các ngõ vào, ra
reg [4:0] donvi,chuc; // khai báo 2 biến đơn vị và chục, mỗi biến có độ dài 5 bit
begin
donvi=(SW[7:4] + SW[3:0]) % 4'd10; // biểu thức để tính chữ số hàng đơn vị ( chia lấy dư )
chuc=(SW[7:4] + SW[3:0]) / 4'd10; // biểu thức để tín chữ số hàng đơn chục (chia lấy nguyên)
case(donvi) // thiết lập hiển thị các số từ 0-> 9 của hàng đơn vị
0: HEX0=7'b0000001;
1: HEX0=7'b1001111;
2: HEX0=7'b0010010;
3: HEX0=7'b0000110;
4: HEX0=7'b1001100;
5: HEX0=7'b0100100;
6: HEX0=7'b0100000;
7: HEX0=7'b0001111;
8: HEX0=7'b0000000;
9: HEX0=7'b00001
endcase
case(chuc) // thiết lập hiển thị các số từ 0 -> 3 của hàng chục
0: HEX1=7'b0000001;
1: HEX1=7'b1001111;
2: HEX1=7'b0010010;
3: HEX1=7'b0000110;
5
endmodule
• Phần Mạch :
6
• Phần Sóng :
Với a = 8 ( 1000) và b = 2(0010)
HEXO = 0000001(số 0)
HEX1 =1001111(số 1)
HEXO = 0100000(số 6)
HEX1 =1001111(số 1)
7
Câu 3/ Thiết kế mạch dịch led sử dụng 8 led xanh, led sẽ chạy từ trái qua phaỉ
và dội lại từ phải qua trái với xung clk khoảng 1 Hz chia từ clk 50 MHz.
• Phần Code :
module cau_3(input CLK, output reg [7:0] LEDG); // module với đầu vào là xung CLK, ra là
LEDG
reg [25:0] tanso; // Khai báo biến tần số
reg flag; // tạo cờ để trạng thái
always @(posedge CLK) // bộ đếm để tạo xung 1 Hz
tanso <= tanso + 1'b1; // 50MHz/225 ~=1Hz
always @(posedge tanso[0])
/* ở thời gian đầu tiên nếu LEDG = 0 thì dịch trái và dịch phải khi LEDG = 1 và cờ ở đây có chức
năng là đổi trạng thái */
if(LEDG == 8'b0)
LEDG = 8'b10000000;
else if(flag == 0) // ngược lại nếu flag = 0 thì lấy bit LSB chuyển l
LEDG = {LEDG[0], LEDG[7:1]}; // điều khiển LED dịch trái
else
LEDG = {LEDG[6:0], LEDG[7]}; // điều khiển LED dịch trái
always @(posedge tanso[0])
if(LEDG == 8'b01000000)
flag = 0;
else if (LEDG == 8'b00000010)
flag = 1; // Nếu led cuối cùng sáng, flag=1, led sáng từ phải sang trái
endmodule
8
• Phần mô phỏng Mạch :
9
Câu 4/ Thiết kế mạch dịch Led sử dụng 8 LED đỏ với xung clock khoảng 1 Hz
được chia từ clock 50MHz mỗi lần bấm và thả ngay Key thì LED sẽ đứng yên,
bấm và thả trong 3s led sẽ dịch trái, bấm và thả trong 5s led sẽ dịch phải.
• Phần Code:
module bai4 (input CLOCK, KEY, output reg [7:0] LedR);
/* Khai báo tên module là cau4, ngõ vào KEY, ngõ ra led đỏ là LedR */
reg [4:0] n, t; //Khai báo biến đếm n và biến thời gian t 5 bit
always @(posedge CLOCK) //Khối lệnh always thực thi điều khiển cạnh lên của xung clock
begin
if(KEY == 1'b0) LedR = LedR[7:0]; /* Nếu nhấn Key và thả ngay, Led giữ nguyên */
end
//Khối lệnh thực thi tần số 2Hz thực hiện theo cạnh lên xung clock
//Chương trình để mô phỏng
begin
//Chọn 1 trong 3:
n = 4'b0011; // Gán thời gian 3 giây vào biến count
n = 4'b0101; // Gán thời gian 5 giây vào biến count
if(KEY == 1'b0)
10
n = n + 1'b1;
t = n;
end
else n = 5'b00000;
always @(posedgeF[25])
//Khối lệnh thực thi tần số 1Hz thực hiện theo cạnh lên xung clock
if(LedR == 8'h0)
LedR = 8'h1; //Nếu 8 led đều tắt, bật 1 led bên ngoài
elseif(KEY == 1'b1 && t > 5'd2 && t < 5'd4)
LedR = {LedR[6:0], LedR[7]};
/* Nếu bấm nút nhấn và thả ra trong thời gian 2<t<4 thì led chạy từ trái sang phải, lấy bit LSB
chuyển lên vị trí MSB */
elseif(KEY == 1'b1 && t > 5'd4 && t < 5'd6) LedR = {LedR[0], LedR[7:1]};
/* Nếu bấm nút nhấn và thả ra trong thời gian 4<t<6 thì led chạy từ phải sang trái, lấy bit MSB
chuyển lên vị trí LSB */
endmodule
11
Phần mô phỏng mạch :
12
• Khi t ~= 3 giây, Led dịch sang trái:
Khi t ~= 5 giây, Led dịch sang phải :Khi nhấn và thả ngay Led đứng yên
13
Câu 5/ Thiết kế mạch dịch led sử dụng 8 LED xanh với khoảng 1Hz được chia từ
clock 50MHz sao cho 2 led chạy từ ngoài vào giữa
Phần Code :
module cau_5 (input CLOCK_50, output reg [7:0] LEDG); // tên module với các biến vào ra
dem<=dem + 1'b1;
always @ (posedge dem[24]) //Khối lệnh always thực thi tần số khoảng 1Hz, thực hiện
theo cạnh lên của xung clock
if (LEDG== 8'b0) LEDG <= 8'b10000001; // nếu 8 led đều tắt 2 led ngoài cùng bật
endmodule
Phần Mạch :
14
• Phần Sóng :
Câu 6/ Thiết kế mạch hiển thị chữ “HELLO” lên 5 LED 7 đoạn với 2 ngõ vào được
gán với Switch, sao cho nếu switch = 2’b00 thì chữ “HELLO” nhấp nháy với tần
số khoảng 1Hz, switch = 2’b01 thì khoảng 2Hz, switch = 2’b10 thì khoảng 4hz và
switch = 2’b11 thì khoảng 8Hz. Clock này được lấy từ xung clock 50MHz.
• Phần Code:
module cau6 (input CLOCK_50, input [1:0] SW, output [0:6] HEX0,HEX1,HEX2,HEX3,HEX4);
/* Khai báo tên module là cau6, ngõ vào xung clock là CLOCK_50,
ngõ vào switch gồm 2 bit gán cho SW, ngõ ra là led 7 đoạn */
/Nếu switch = 0 thì chữ HELLO nhấp nháy với tần số khoảng 1Hz
(SW==2'b01)? dem[23] :
//Nếu switch = 1 thì chữ HELLO nhấp nháy với tần số khoảng 2Hz
15
(SW==2'b10)? dem[22] : dem[21];
/* Nếu switch = 2 thì chữ HELLO nhấp nháy với tần số khoảng 4Hz
Còn lại, switch = 3 thì chữ HELLO nhấp nháy với tần số khoảng 8Hz */
Endmodule
16
- Khi SW = 01:
- Khi SW = 10
- Khi SW = 11:
17
Câu 7/ Thiết kế mạch đổi từ số nhị phân 9 bit ( lấy từ Switch) thành số thập phân hiển thị lên HEX2,
HEX1, HEX0
• Phần Code :
assign donvi = s % 4'd10; // tìm chữ số hàng đơn vị bằng SW chia lấy dư
led7doan U0(.in(tram), .hex(hex2));
led7doan U1(.in(chuc), .hex(hex1));
led7doan U2(.in(donvi), .hex(hex0));
// gọi hàm led7doan và hiển thị số thập phân ra led 7 đoạn
endmodule
module led7doan(input [3:0] in, output [0:6] hex); // module led7doan, thiet lap de hien thi cac
so tu 0-->9 ra led 7 doan
assign hex = (in == 4'b0000) ? 7'b0000001 :
(in == 4'b0001) ? 7'b1001111 :
(in == 4'b0010) ? 7'b0010010 :
(in == 4'b0011) ? 7'b0000110 :
(in == 4'b0100) ? 7'b1001100 :
(in == 4'b0101) ? 7'b0100100 :
(in == 4'b0110) ? 7'b0100000 :
(in == 4'b0111) ? 7'b0001111 :
(in == 4'b1000) ? 7'b0000000 : 7'b0000100;
endmodule
18
• Phần mô phỏng Mạch :
• Phần mô phỏng sóng : mô phỏng với đầu vào là số 9 bit có giá trị là 0011111112 = 127
19
Câu 8/ Thiết Kế mạch hiển thị chữ “Hi” dịch từ trái qua phải ở 4 LED 7 đoạn ( từ
HEX0 đến HEX3 ), xung clock khoảng 1Hz được chia từ clock 50Mhz
• Phần Code :
/* Khai báo tên module là cau8, ngõ vào xung clock là CLK, ngõ ra led 7 đoạn tương ứng */
//Khai báo biến S với bit hiện chữ HI và một led tắt lưu vào
//Khối lệnh always thực thi điều khiển cạnh lên của xung CLOCK
begin
Q = {Q[6:0], Q[20:7]};
HEX0 = Q[6:0];
HEX1 = Q[13:7];
HEX2 = Q[20:14];
/* Led cuối cùng sẽ di chuyển lên vị trí đầu tiên, chữ HI được dịch từ trái qua phải */
end
endmodule
20
• Phần mô phỏng Mạch :
21
Câu 9/ Thiết kế mạch 8 led bit sáng dần từ trái qua phải và tắt dần từ phải qua
trái.
/* Khai báo tên module là cau9, ngõ vào xung clock là CLK, ngõ ra Led xanh là LEDG */
always @(posedge CLK) //Khối lệnh always điều khiển cạnh lên của xung CLOCK
tanso <= tanso + 1'b1; // Bộ đếm chia tần số
/* Khối lệnh always thực thi tần số khoảng 1Hz, thực hiện theo cạnh lên của xung clock */
if (LEDG == 8'b10000000)
flag = 0;
//Nếu led cuối cùng tắt, flag=1, led sẽ tắt từ phải sang trái
flag = 1;
//Nếu led đầu tiên sáng, flag=0, led sẽ sáng từ trái sang phải
Endmodule
22
• Phần Mô Phỏng Mạch :
23
Câu 10/ Thiết kế mạch bình phương 4 bit ( sử dụng các switch làm ngõ vào )
hiển thị ra led 7 đoạn HEX2, HEX1, HEX0 dưới dạng số thập phân.
• Phần Code :
module led (in,HEX); // khai báo hàm led
input [3:0] in; // khai báo ngõ vào 4 bit
output [0:6] HEX;// khai báo ngõ ra HEX 7 bit
/* phần assign là gán các số hiển thị tương ứng với ngõ vào lên led 7 đoạn và nếu không thỏa
điều kiện nào thì Led tắt
assign HEX = (in==4'd0) ? 7'h01 :
(in==4'd1) ? 7'h4f :
(in==4'd2) ? 7'h12 :
(in==4'd3) ? 7'h06 :
(in==4'd4) ? 7'h4c :
(in==4'd5) ? 7'h24 :
(in==4'd6) ? 7'h20 :
(in==4'd7) ? 7'h0f :
(in==4'd8) ? 7'h00 :
(in==4'd9) ? 7'h04 : 7'h7f ;
Endmodule
module cau10 (SW,HEX0,HEX1,HEX2); // khai báo module với các thông số SW,HEX0 -> HEX2
input [3:0] SW;//khai báo ngõ vào SW 4 bit
output [0:6] HEX0,HEX1,HEX2; // khai báo 3 ngõ ra led 7 đoạn 7 bit
wire [7:0] s; // khai báo biến s,dv và chuc kiểu wire
wire [3:0] dv, chuc;
assign s= SW*SW ;
// Tính bình phương lấy giá trị từ SW, lưu kết quả vào biên s
assign dv= s%4'd10; // Nhận giá trị từ SW, tìm chữ số hàng đơn vị theo biểu thức đã gán
24
assign chuc= (s/4'd10)%4'd10; // Nhận giá trị từ SW, tìm chữ số hàng chục theo biểu
thức gán
assign tram= s/8'd100; // Nhận giá trị từ SW, tìm chữ số hàng trăm theo biểu thức gán
25
26