You are on page 1of 26

ĐẠ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
---------------o0o---------------

BÁO CÁO MÔN THỰC HÀNH MÔN


THIẾT KẾ LOGIC KHẢ TRÌNH VÀ VERILOG HDL

Sinh Viên thực hiện: Nguyễn Thanh Hoàng


MSSV: 18200110

TP. HỒ CHÍ MINH, NGÀY 07 THÁNG 01 NĂM 2021


Câu 1/ Thiết kế mạch đếm lên/ xuống theo mã BCD( 0 -> 9) hiển thị ra LED 7
đoạn HEX0 với tần số khoảng 1Hz được chia từ clock 50MHz, chân up/down
được gán cho SW0.

• 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

Phần Hình Mạch :

• Phần Dạng Sóng :

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

always @(*) // Khối lệnh always thực thi chương trình

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

default: HEX0=7'b1111111; // mặc định HEX0 tắt

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;

default: HEX1=7'b1111111; // mặc định HEX1 tắt

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)

Với a = 11 (1011) và b = 5 (0101)

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 :

• Phần mô phỏng Sóng :

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 [25:0] F; //Khai báo biến F 26 bit

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

F = F + 1'b1; //Bộ đếm

if(KEY == 1'b0) LedR = LedR[7:0]; /* Nếu nhấn Key và thả ngay, Led giữ nguyên */

end

always @(posedge dem[24])

//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

n = 4’b0000; // Nhấn và thả ngay.


t = n; //Biến thời gian (t) nhận giá trị của count
end

//Chương trình để chạy board

if(KEY == 1'b0)

begin //Tính thời gian nhấn và thả nút

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 :

Phần mô phỏng sóng :

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

reg [24:0] dem; // khai báo biến đếm 25 bit

always @ (posedge CLOCK_50) // bộ đếm để tạo xung 1 Hz

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

else LEDG <= {LEDG[4],LEDG[7:5],LEDG[2:0],LEDG[3]}; // di chuyển các led từ ngoài vào


giữa

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 */

wire xung; //Khai báo cho biến xung trên wire


reg [24:0] dem; //Khai báo biến dem 25 bit
always @ (posedge CLOCK_50)
//Khối lệnh always điều khiển cạnh lên của xung clock

dem<=dem + 1'b1; // Bộ đếm chia xung CLK

assign xung = (SW==2'b00)? dem[24] :

/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 */

// Gán chữ HELLO

assign HEX0=(xung)? 7'b0000001 : 7'b1111111; //O

assign HEX1=(xung)? 7'b1110001 : 7'b1111111; //L

assign HEX2=(xung)? 7'b1110001 : 7'b1111111; //L

assign HEX3=(xung)? 7'b0110000 : 7'b1111111; //E

assign HEX4=(xung)? 7'b1001000 : 7'b1111111; //H

//Nhấp nháy dựa theo chu kỳ

Endmodule

• Phần Mô phỏng Mạch :

Phần Mô Phỏng Sóng:


- Khi SW = 00:

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 :

module cau7(input [8:0] s, output [0:6] hex0, hex1, hex2);


wire [3:0] tram, chuc, donvi; // khai báo các biến trăm, chục, đơn vị kiểu wire 4 bit
assign tram = s / 8'd100; // lay chu so hang tram cua s, chuyen s tu nhi phan sang
thap phan ( haydang BCD)
assign chuc = (s / 4'd10) % 4'd10 // gán chữ số hàng chục bằng chữ số hàng trăm chia 10
lấy nguyên rồi chia lấy dư

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

Hex0 = 0001111 ( hiển thị số 7 )


Hex1= 0010010 (hiển thị số 2 )
Hex2=1001111 (hiển thị số 1)

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 :

module cau8(input CLK, output reg [0:6] HEX0, HEX1, HEX2);

/* Khai báo tên module là cau8, ngõ vào xung clock là CLK, ngõ ra led 7 đoạn tương ứng */

reg [25:0] tanso; // Khai báo biến tanso 26 bit

reg [20:0] Q = 21'b100100010011111111111;

always @(posedge CLK)

//Khai báo biến S với bit hiện chữ HI và một led tắt lưu vào

tanso = tanso + 1'b1;

always @(posedge tanso[0])

//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 :

• Phần mô phỏng Sóng

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.

module cau9(input CLK, output reg [7:0] LEDG);

/* Khai báo tên module là cau9, ngõ vào xung clock là CLK, ngõ ra Led xanh là LEDG */

reg [25:0] tanso; // Khai báo biến tanso 26 bit


reg flag; // Khai báo biến flag

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ố

always @(posedge tanso[25])


/* Khối lệnh always thực thi tần số khoảng 2Hz, thực hiện theo cạnh lên của xung clock */
if(flag == 0)
LEDG = {1'b1,LEDG[7:1]}; //Nếu flag=0, lấy bit LSB chuyển lên vị trí MSB
else
LEDG = {LEDG[6:0],1'b0}; //Nếu flag=1, lấy bit MSB chuyển về vị trí LSB

always @(posedge tanso[25])

/* 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

else if (LEDG == 8'b11111110)

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 :

• Phần Mô Phỏng Sóng :

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

led u0 ( .in(dv), .HEX(HEX0) );


led u1 ( .in(chuc), .HEX(HEX1) );
led u2 ( .in(tram), .HEX(HEX2) );
// Gọi hàm led để hiển thị các kết quả đã tính được ra led 7 đoạn HEX0 -> HEX2 )
endmodule

• Phần Mô Phỏng Mạch:

• Phần Mô Phỏng Sóng :

SW = 10002( 810 ) bình phương = 64


HEX0 = 1001100( hiển thị số 4 )
HEX1 = 0100000( hiển thị số 6)
HEX2 = 0000001( hiển thị số 0)

25
26

You might also like