THÍ NGHIỆM 1
Mục tiêu: Nắm được các thức mô tả mạch tính giá trị tuyệt đối của một số 4 bit sử dụng ngôn ngữ systemverilog và thực hiện kiểm tra hoạt động trên kit FPGA.
Yêu cầu: Sinh viên thực hiện mô tả mạch tính giá trị tuyệt đối của một số 4 bit (số ngõ vào lần lượt là A, ngõ ra là S).
Kiểm tra:
Lập bảng chân trị cho yêu cầu:
INPUT OUTPUT
A[3] A[2] A[1] A[0] S[3] S[2] S[1] S[0]
0 A[2] A[1] A[0] 0 A[2] A[1] A[0]
1 0 0 0 0 0 0 0
1 0 0 1 0 1 1 1
1 0 1 0 0 1 1 0
1 0 1 1 0 1 0 1
1 1 0 0 0 1 0 0
1 1 0 1 0 0 1 1
1 1 1 0 0 0 1 0
1 1 1 1 0 0 0 1
MSB là bit dấu, số sẽ được biểu diễn dưới dạng BCD bù 2. Sử dụng case để xét cho từng trường hợp trong bảng chân trị. Ở đây input 1000 không thể biểu diễn trị tuyệt đối ở dạng 4bit nên sẽ cho output là 0000.
Chương trình mô tả hoạt động của thiết kế.
module abs(
input logic [3:0] A, output logic [3:0] S );
always_comb begin: proc_sample case (A)
4'b1000: S = 4'b0000;
4'b1001: S = 4'b0111;
4'b1010: S = 4'b0110;
4'b1011: S = 4'b0101;
4'b1100: S = 4'b0100;
4'b1101: S = 4'b0011;
4'b1110: S = 4'b0010;
4'b1111: S = 4'b0001;
default: S = A;
endcase
end
endmodule : abs
Kết quả mô phỏng dạng sóng.
Kết quả RTL viewer.
Sinh viên thực hiện gán chân theo yêu cầu và sau đó đổ lên kit FPGA DE2. Sau đó ghi nhận kết quả.
Gán chân theo mẫu sau:
Chân A[3:0] được nối với SW0-SW3 Chân S[3:0] được nối với LEDR[3:0]
THÍ NGHIỆM 2
Mục tiêu: Nắm được các thức mô tả khối ALU (bộ tính toán) có chức năng đơn giản sử dụng systemverilog và thực hiện kiểm tra hoạt động trên kit FPGA.
Yêu cầu: Sinh viên thực hiện mô tả mạch cho mạch thực hiện bộ ALU tính toán 2 số 4 bit (hai số ngõ vào lần lượt là A và B, ngõ ra là S, cờ nhớ Ci và Co) thông qua ngõ vào điều khiển 2 bit Sel.
- Nếu Sel=00: S=A+B - Nếu Sel=01: S=A-B - Nếu Sel=10: S=A AND B - Nếu Sel=11: S=A OR B Kiểm tra:
Tạo các input, output theo đúng yêu cầu cà kích thước. Riêng ngõ ra S sẽ khai báo dạng 5bit để lấy bit tràn. Với mỗi tổ hợp của cổng vào Sel, dùng case xét các trường hợp tương ứng:
- Sel = 00: S = A + B - Sel = 01: S = A - B - Sel = 10: S = A AND B - Sel = 11: S=A OR B
Chương trình mô tả hoạt động của thiết kế.
module bai2(
input logic [4:0] A, B, input logic [1:0] Sel, input logic Ci, output logic [5:0] S, output logic [4:0] Ao, Bo, output logic [1:0] Selo, output logic Co
);
always_comb begin : proc_sample case(Sel)
2'b00: S = A + B + Ci;
2'b01: S = A - B;
2'b10: S = A & B;
2'b11: S = A | B;
endcase end
assign Co = S[5];
assign Ao = A;
assign Bo = B;
assign Selo = Sel;
endmodule : bai2
Kết quả mô phỏng dạng sóng.
Kết quả RTL viewer.
Sinh viên thực hiện gán chân theo yêu cầu và sau đó đổ lên kit FPGA DE2. Sau đó ghi nhận kết quả.
Gán chân theo mẫu sau:
Chân A[3:0] được nối với SW0-SW3 Chân B[3:0] được nối với SW4-SW7
Chân Ci được nối với SW8
Chân S[3:0] được nối với LEDR[3:0]
Chân Co được nối với LEDR[4]
THÍ NGHIỆM 3
Mục tiêu: Nắm được các thức mô tả mạch đếm đầy đủ sử dụng ngôn ngữ systemverilog và thực hiện kiểm tra hoạt động trên kit FPGA.
Yêu cầu: Sinh viên thực hiện thiết kế mô tả mạch đếm xuống 3 bit đầy đủ sử dụng ngôn ngữ system verilog. Giá trị đếm thay đổi sau mỗi 1s. Ngõ ra được kết nối với LED 7 đoạn loại anode chung. Ngoài ra, bộ đếm còn có chân RST (tích cực cao) dùng để reset trạng thái bộ đếm về 0.
Gợi ý:
- Tín hiệu clock được tạo từ bộ chia tần số từ 50MHz sang 1s.
- Sinh viên sử dụng chương trình chuyển từ mã BCD sang LED 7 đoạn trong PRELAB, kết nối ngõ ra của bộ đếm với ngõ vào của bộ chuyển đổi.
Kiểm tra:
Xây dựng 4 khối module:
- Module chia tần:
Theo ý tưởng của prelab để làm.
- Module đếm xuống:
Input: tạo ngõ vào ứng với các chức năng: nhận xung clock, reset về 1.
Output: tạo gõ ra dạng 3 bit để làm input cho led 7 đoạn.
- Module led:
Theo ý tưởng của prelab để làm. Lập bảng chân trị và dùng case để xét từng trường hợp - Module tổng:
Dùng để kết nối các module trên thành một mạch thiết kế đầy đủ.
Chương trình mô tả hoạt động của thiết kế.
//mach chia tan so module chiatanso(
input logic clk, output logic out );
integer i=0;
always_ff@(posedge clk) begin
i=i+1;
if (i==25000000) begin out = ~out;
i = 0;
end end
endmodule
//mach dem xuong module down_counter(
input logic Clk, input logic rst, output [2:0]counter );
reg [2:0] counter_down;
always @(posedge Clk or posedge rst) begin
if(rst)
counter_down <= 3'b000;
else
counter_down <= counter_down - 1;
end
assign counter = counter_down;
endmodule //mach led 7 doan module BCD_LED(
input logic[2:0]I, output logic[6:0]O );
always@(I)begin case(I)
3'b000: O = 7'b1000000;
3'b001: O = 7'b1111001;
3'b010: O = 7'b0100100;
3'b011: O = 7'b0110000;
3'b100: O = 7'b0011001;
3'b101: O = 7'b0010010;
3'b110: O = 7'b0000010;
3'b111: O = 7'b1111000;
Default O = '1;
endcase end
endmodule module bai3(
input logic clk_i, input logic rst_i, output logic [6:0]o );
reg temp1;
reg [2:0]temp2;
chiatanso (
.clk(clk_i), .out(temp1) );
down_counter ( .rst(rst_i), .Clk(temp1), .counter(temp2) );
BCD_LED ( .I(temp2), .O(o) );
endmodule
Kết quả mô phỏng dạng sóng.
Kết quả RTL viewer.
Sinh viên thực hiện gán chân theo yêu cầu và sau đó đổ lên kit FPGA DE2. Sau đó ghi nhận kết quả.
Gán chân theo mẫu sau:
LED 7 đoạn là HEX0.
Chân RST là SW0.
https://drive.google.com/drive/folders/1CaiBufZMLV9CmY0sZKdmVjA6nGSgX0xg?
usp=drive_link
THÍ NGHIỆM 4
Mục tiêu: Nắm được các thức mô tả mạch đếm đầy đủ sử dụng ngôn ngữ systemverilog và thực hiện kiểm tra hoạt động trên kit FPGA.
Yêu cầu: Sinh viên thực hiện thiết kế mô tả mạch đếm lên 4 bit từ 5 đến 14 sử dụng ngôn ngữ system verilog. Giá trị đếm thay đổi sau mỗi 1s. Ngõ ra 4 bit được kết nối với 2 LED 7 đoạn loại anode chung. Ngoài ra, bộ đếm còn có chân RST (tích cực cao) dùng để reset trạng thái bộ đếm về 0.
Gợi ý:
- Tín hiệu clock được tạo từ bộ chia tần số từ 50MHz sang 1s.
- Sinh viên sử dụng chương trình chuyển từ mã BCD sang LED 7 đoạn trong PRELAB, kết nối ngõ ra của bộ đếm với ngõ vào của bộ chuyển đổi.
- Sinh viên cần viết thêm bộ chuyển đổi từ số 4 bit sang số BCD.
Kiểm tra:
Ý tưởng thí nghiệm 4 tương tự như thí nghiệm 3. Thay vì xây một khối module đếm xuống thì ta xây khối module đếm lên. Ngoài ra khối led bây giờ sẽ tương ứng với 2 led 7 đoạn hàng chục và hàng đơn vị. Các trường hợp đếm 0 đến 3 và 15 sẽ dùng case để cho led tắt đèn.
Chương trình mô tả hoạt động của thiết kế.
module giamtanso(
input logic clk, output logic out );
int i=0;
always_ff@(posedge clk) begin i=i+1;
if(i==25000000) begin out=~out;
i=0;
end end
endmodule : giamtanso
module bai4 ( input logic clki, input logic rst,
input logic [3:0] count_in, output logic [6:0] seg1, output logic [6:0] seg2 );
logic outra;
giamtanso(
.clk(clki), .out(outra), );
reg [3:0] count;
always @(posedge outra or posedge rst) begin if (rst)
begin
count <= 4'b0000; // Reset trạng thái bộ đếm về 0 end
else if (count < 4'b1111) begin
count <= count + 1; // Đếm lên 1 end
end
// Mô phỏng ngõ ra LED 7 đoạn always_comb begin : proc_donvi case (count)
4'b0101: seg1 <= 7'b0010010; // Số 5 4'b0110: seg1 <= 7'b0000010; // Số 6 4'b0111: seg1 <= 7'b1111000; // Số 7 4'b1000: seg1 <= 7'b0000000; // Số 8 4'b1001: seg1 <= 7'b0010000; // Số 9 4'b1010: seg1 <= 7'b1000000; // Số 10 4'b1011: seg1 <= 7'b1111001; // Số 11 4'b1100: seg1 <= 7'b0100100; // Số 12 4'b1101: seg1 <= 7'b0110000; // Số 13 4'b1110: seg1 <= 7'b0011001; // Số 14
default: seg1 <= 7'b1111111; // Ngõ ra mặc định endcase
end
always_comb begin : proc_hangchuc case (count)
4'b1010: seg2 <= 7'b1111001; // Số 10 4'b1011: seg2 <= 7'b1111001; // Số 11 4'b1100: seg2 <= 7'b1111001; // Số 12 4'b1101: seg2 <= 7'b1111001; // Số 13 4'b1110: seg2 <= 7'b1111001; // Số 14
default: seg2 <= 7'b1111111; // Ngõ ra mặc định endcase
end endmodule : bai4
Kết quả mô phỏng dạng sóng.
Kết quả RTL viewer.
Sinh viên thực hiện gán chân theo yêu cầu và sau đó đổ lên kit FPGA DE2. Sau đó ghi nhận kết quả.
Gán chân theo mẫu sau:
Hai LED 7 đoạn là HEX1 (trọng số cao) và HEX0 (trọng số thấp).
Chân RST là SW0.
https://drive.google.com/drive/folders/1CaiBufZMLV9CmY0sZKdmVjA6nGSgX0xg?
usp=drive_link
THÍ NGHIỆM 5
Mục tiêu : Nắm được các thức mô tả máy trạng thái sử dụng ngôn ngữ systemverilog và thực hiện kiểm tra hoạt động trên kit FPGA.
Yêu cầu : Sinh viên tiến hành mô tả hệ tuần tự sau bằng VHDL sau đó nạp chương trình xuống kit DE2 để kiểm tra hoạt động :
Hệ tuần tự có 1 ngõ vào (X) và 1 ngõ ra (Z). Ngõ ra Z = 1 nếu tổng số bit 1 nhận được chia hết cho 3 (quy ước 0, 3, 6, 9, … là các số chia hết cho 3) và tổng số bit 0 nhận được là 1 số chẵn (lớn hơn 0).
Ghi chú : Sinh viên có thể lựa chọn thiết kế theo máy trạng thái kiểu Mealy hoặc Moore.
Gán chân theo mẫu sau:
Ngõ vào X được nối với SW0.
Tín hiệu CLK được nối với xung clock 1Hz (Trong bài PRELAB).
Ngõ ra Z được nối với LED0.
Kiểm tra:
Gọi các trạng thái có 5bit nhận được gần nhất lần lượt là:
- S0: bit khởi tạo ở trạng thái reset, tương tương với nhận 1 bit 0 - S1: 01
- S2: 011
- S3: 0111 (tương đương với S0) - S4: 01110
- S5: 001 - S6: 0011
Trong các trạng thái chỉ có S4 cho z = 1, các trạng thái còn lại cho z = 0 Đồ hình trạng thái:
Chương trình mô tả hoạt động của thiết kế.
//mach giam tan so module clk(
input logic clk,rst, output logic out );
int i=0;
always_ff @(posedge clk,posedge rst) begin if (rst) begin
out<=0;
end else begin
i = i + 1;
if (i == 25000000)
begin
out <= ~out;
i = 0;
end end
end
endmodule
module testbai5lab4(
input x, rst,
output logic z, c, b, a, out, output logic [2:0] W );
clk testbai5lab4(
.rst (rst), .out (out) );
// Dinh nghia trang thai
parameter S0 = 3'b000, S1 = 3'b001, S2 = 3'b010, S3 = 3'b011, S4 = 3'b100 ,S5 = 3'b101, S6 = 3'b110;
reg [2:0] pre_state,next_state;
always_ff@(posedge out, posedge rst) begin if(rst)
begin
pre_state <= S0;
end
else begin
pre_state <= next_state;
end end
//mach chuyen trang thai always@(pre_state or x) begin case(pre_state)
S0:
begin
if(x) next_state =S1;
else next_state = S4;
end S1:
begin
if(x) next_state = S2;
else next_state = S5;
end S2:
begin
if(x) next_state = S3;
else next_state = S6;
end S3:
begin
if(x) next_state = S1;
else next_state = S4;
end S4:
begin
if(x) next_state = S5;
else next_state = S3;
end S5:
begin
if(x) next_state = S6;
else next_state = S1;
end S6:
begin
if(x) next_state = S4;
else next_state = S2;
end endcase end //ngo ra
always_comb begin
if(pre_state == 3'b100) z = 1;
else z = 0;
end
assign c = pre_state[2];
assign b = pre_state[1];
assign a = pre_state[0];
assign W[0] = x;
assign W[1] = rst;
endmodule
Kết quả mô phỏng dạng sóng.
Kết quả RTL viewer.
Sinh viên thực hiện gán chân theo yêu cầu và sau đó đổ lên kit FPGA DE2. Sau đó ghi nhận kết quả.
Lưu ý: Sinh viên nên nối clock 1Hz ra 1 LED để dễ quan sát tín hiệu clock.
https://drive.google.com/drive/folders/1CaiBufZMLV9CmY0sZKdmVjA6nGSgX0xg?
usp=drive_link
THÍ NGHIỆM 6
Mục tiêu: Nắm được các thức mô tả máy trạng thái sử dụng ngôn ngữ systemverilog và thực hiện kiểm tra hoạt động trên kit FPGA.
Yêu cầu: Sinh viên tiến hành mô tả hệ tuần tự sau bằng VHDL sau đó nạp chương trình xuống kit DE2 để kiểm tra hoạt động:
Một hệ thống cung cấp thức ăn và nước uống tự động cho thú cưng gồm 2 ngõ vào là 2 nút nhấn RED, BLUE; và 2 ngõ ra là tín hiệu FOOD, WATER để kích hoạt máy cung cấp thức ăn và nước uống
- Nút RED (tín hiệu R; khi nhấn nút R=1, ngược lại R=0): khi con vật đói muốn ăn thì cần nhấn nút RED 3 lần liến tiếp. Khi đó tín hiệu F (FOOD) = 1 để kích hoạt máy cung cấp thức ăn.
- Nút BLUE (tín hiệu B; khí nhấn nút B=1, ngược lại B=0): khi con vật khát muốn uống thì cần nhấn nút BLUE 2 lần liên tiếp. Khi đó tín hiệu W (WATER) = 1 để kích hoạt máy cung cấp nước uống.
Chú ý:
- Khi tín hiệu kích hoạt F hay W bằng 1, nếu nhấn 1 nút bất kỳ hệ thống sẽ trở lại trạng thái reset.
- Ở mỗi thời điểm, chỉ có 1 nút nhấn.
- Các nút nhấn cần phải được tác động liên tiếp, nếu có 1 nút sai trình tự, máy trạng thái sẽ quay trở về trạng thái ban đầu. (ví dụ: khi các nút nhấn được tác động theo trình tự (RED, RED, BLUE), máy trạng thái quay về trạng thái đầu reset).
Ghi chú: Sinh viên có thể lựa chọn thiết kế theo máy trạng thái kiểu Mealy hoặc Moore.
Gán chân theo mẫu sau:
Ngõ vào RED và BLUE lần lượt được nối với SW0 và SW1.
Tín hiệu CLK được nối với xung clok 1Hz (Trong bài PRELAB).
Ngõ ra FOOD và WATER lần lượt được nối với LED0 và LED1.
Kiểm tra:
Gọi lần lượt các trạng thái riêng biệt cho RED và BLUE là Sxy. Với x là số lần nút được bấm, y là quy định RED (y = 1) hoặc BLUE (y = 2) .
Xây dựng hai khới chuyển trạng thái riêng biệt cho 2 loại RED và BLUE. Với mỗi trạng thái nến như nhận bit khác 1 sẽ tự động quay về trạng thái S01. Nếu đúng thì S(x+1)y.
Xây dựng thêm một khối để cấm khi ngõ vào của cả 2 RED và BLUE đều bằng 1.
Chương trình mô tả hoạt động của thiết kế.
module giamtanso(
input logic clk, output logic out );
int i=0;
always_ff@(posedge clk) begin i=i+1;
if(i==25000000) begin out=~out;
i=0;
end end
endmodule : giamtanso module bai6(
input R,B,clki, output Ro,Bo,rsto, input logic rst, output logic OUT, output reg F, W );
parameter s01=3'b000, s11=3'b001, s21=3'b011, s31=3'b111;
parameter s02=2'b00, s12=2'b01, s22=2'b11;
reg [2:0] pre1, next1;
reg [1:0] pre2, next2;
logic outra;
giamtanso(
.clk(clki),
.out(outra), );
// khoi chuyen trang thai
always@(posedge outra) begin if (rst)
begin pre1 <= s01;
pre2 <= s02;
end else
begin
pre1 <= next1;
pre2 <= next2;
end end
// khoi chuyen trang thai cho F always@(pre1 or R) begin
case(pre1)
s01: if(R) next1 <= s11;
else next1 <= s01;
s11: if(R) next1 <= s21;
else next1 <= s01;
s21: if(R) next1 <= s31;
else next1 <=s01;
s31: if(1) next1 <= s01;
endcase end
// khoi chuyen trang thai cho W always@(pre2 or B) begin
case(pre2)
s02: if(B) next2 <= s12;
else next2 <= s02;
s12: if(B) next2 <= s22;
else next2 <= s02;
s22: if(1) next2 <= s02;
endcase end
// tao ngo ra //ngo ra cam always@(*) begin
if(R&B) begin F <= 1'b0;
W <= 1'b0;
end case(pre1)
s31: F <= 1'b1;
default: F <= 1'b0;
endcase case(pre2)
s22: W <= 1'b1;
default: W <= 1'b0;
endcase