Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

LAB3: Mô hình hành vi

Phần 1. Mạch tổ hợp


Mạch tổ hợp có thể được hiện thực bằng mô hình hành vi theo 2 cách: dùng phép gán liên
tục (assign) và dùng mô hình hành vi vòng (always). Trong đó, phép gán liên tục đã được
thực hành trong buổi học trước. Trong phần này, chúng ta sẽ thực hành thiết kế mạch tổ
hợp bằng mô hình hành vi vòng. Dưới đây là một ví dụ thiết kế một bộ giải mã 3-to-8
(74LS138)
module my74bk138(input en, input [2:0] din, output reg
[7:0] dout);
//reg [7:0] dout;//Có thể khai báo kiểu rời
always @(din or en)
begin
if(en == 1’b0) dout = 8’h00;
else begin
case(din)
3’h0: dout = 8’h01;
3’h1: dout = 8’h02;
3’h2: dout = 8’h04;
3’h3: dout = 8’h08;
3’h4: dout = 8’h10;
3’h5: dout = 8’h20;
3’h6: dout = 8’h40;
3’h7: dout = 8’h80;
default: dout = 8’h00;
endcase
end
end
endmodule
Hãy gán chân các chân en,din vào các SW và dout vào các LEDR, sau đó dịch và nạp
xuống board DE2 để kiểm chứng. Gạt các SW tương ứng lên xuống và quan sát LEDR
Bài tập: Thiết kế mạch giải mã LED 7 đoạn có tín hiệu cho phép (enable), khi tín hiệu
cho phép bằng 0 thì LED 7 đoạn tắt. Các LED 7 đoạn trên board DE2 là loại cực dương
chung vì vậy mỗi đoạn sẽ sang nếu chân tương ứng có giá trị bằng 0; có thể dùng các mã
sau: {7’h40, 7’h79,7’h24,7’h30,7’h19, 7’h12, 7’h02, 7’h78,7’h00,7’h10}
Code Verilog cho module giải mã LED 7 đoạn:

CuuDuongThanCong.com https://fb.com/tailieudientucntt
module Led7(input en, input [3:0] din, output reg [6:0] dout);
//reg [7:0] dout;//Có thể khai báo kiểu rời
always @(din or en)
begin
if(en == 1'b0) dout = 7'hFF;
else begin
case(din)
4'h0: dout = 7'h40;
4'h1: dout = 7'h79;
4'h2: dout = 7'h24;
4'h3: dout = 7'h30;
4'h4: dout = 7'h19;
4'h5: dout = 7'h12;
4'h6: dout = 7'h02;
4'h7: dout = 7'h78;
4'h8: dout = 7'h00;
4'h9: dout = 7'h10;
4'ha: dout = 7'h08;
4'hb: dout = 7'h03;
4'hc: dout = 7'h27;
4'hd: dout = 7'h21;
4'he: dout = 7'h06;
4'hf: dout = 7'h0e;
default: dout = 7'hff;
endcase
end
end
endmodule

Mạch tuần tự
Mạch tuần tự tích cực mức (latch) có thể được thiết kế bằng phép gán liên tục và toán tử
điều kiện hoặc bằng mô hình hành vi vòng. Chúng ta sẽ thực hành thiết kế bộ đếm với
mô hình hành vi vòng (sinh viên tham khảo tài liệu lý thuyết cho cách dùng phép gán)
module mycount(input clk, input reset, input mode,
output reg [2:0] count);
//reg [2:0] count; //Có thể khai báo kiểu và chiều
in/out rời nhau
always @(posedge clk)
begin
if(reset) count = 3’h0;
else begin

CuuDuongThanCong.com https://fb.com/tailieudientucntt
if(mode) count <= count + 1;
else count <= count – 1;
end
end
endmodule
Hãy gán chân clk vào KEY[0], reset, mode vào các SW và count vào LEDR, sau đó dịch
và nạp xuống board DE2 để kiểm tra. Gạt chân reset (SW tương ứng) về 0, rồi nhấn
KEY[0] để tạo xung clock để kiểm tra.
Có thể viết nhiều khối always trong 1 module, mỗi khối được xem như 1 mạch riêng. Ví
dụ ta sẽ viết thêm một khối always để tạo xung 2Hz từ xung 50MHz (PIN_N2) để cấp
cho bộ đếm.
module mycount50(input clk50, input reset, input mode,
output reg [2:0] count);
//reg [2:0] count; //Có thể khai báo kiểu và chiều
in/out rời nhau
reg clk2;
reg [26:0] half_period;
always @(posedge clk2)
begin
if(reset) count = 3’h0;
else begin
if(mode) count <= count + 1;
else count <= count – 1;
end
end

always @(posedge clk50)


begin
if(reset) begin
clk2 <= 0;
half_period <= 0;
end
else begin
if(half_period == (12500000 – 1)) begin
half_period <= 0;
clk2 <= ~clk2;
end
else begin
half_period <= half_period + 1;
end
end

CuuDuongThanCong.com https://fb.com/tailieudientucntt
end
endmodule
Trong mạch trên, cứ sau 12500000 xung clock (50MHz) thì tín hiệu clk2 đảo 1 lần, như
vậy chu kỳ clk2 bằng 25000000 (12500000 x 2) lần chu kỳ xung 50MHz, như vậy ta
được xung clk2 có tần số 2Hz, duty cycle 50%. Hãy gán chân clk50 vào chân PIN_N2
(nguồn xung 50MHz trên board), chân reset, mode vào các SW và count vào các LEDR.
Gạt chân reset về 0, thử thay đổi chân mode và quan sát LEDR
Bài tập: Thiết kế bộ đếm BCD 1 chữ số (đếm lên) và testbench mô phỏng để kiểm tra
mạch BCD vừa thiết kế
a. Code Verilog của bộ đếm:
module Led7(input clk2, output reg [6:0] dout);
reg [3:0]din;
always @(posedge clk2)
begin
din <= din + 1;
if (din == 4'h9) din <= 4'h0;
end

always @(din )
begin
case(din)
4'h0: dout = 7'h40;
4'h1: dout = 7'h79;
4'h2: dout = 7'h24;
4'h3: dout = 7'h30;
4'h4: dout = 7'h19;
4'h5: dout = 7'h12;
4'h6: dout = 7'h02;
4'h7: dout = 7'h78;
4'h8: dout = 7'h00;
4'h9: dout = 7'h10;
default: dout = 7'hff;
endcase
end
endmodule
b. Hình ảnh mô phỏng (phải thấy được bộ đếm chuyển từ 9 sang 10):

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Phần 2. Kết hợp mạch tổ hợp và mạch tuần tự
module mypizza(input clk, input reset, input mode, output
reg [7:0] dout);
reg [2:0] count;

always @(posedge clk)


begin
if(reset) count = 3’h0;
else begin
if(mode) count <= count + 1;
else count <= count – 1;
end
end

always @(count)
begin
case(count)
3’h0: dout = 8’h01;
3’h1: dout = 8’h02;
3’h2: dout = 8’h04;
3’h3: dout = 8’h08;
3’h4: dout = 8’h10;
3’h5: dout = 8’h20;
3’h6: dout = 8’h40;
3’h7: dout = 8’h80;
default: dout = 8’h00;
endcase
end
endmodule
Có thể kết hợp mô hình cấu trúc và hành vi với nhau, chú ý phần khai báo khác nhau như
thế nào:
module myhamburger(input clk, input reset, input mode,
output [7:0] dout);
reg [2:0] count;

always @(posedge clk)


begin
if(reset) count = 3’h0;
else begin
if(mode) count <= count + 1;
else count <= count – 1;

CuuDuongThanCong.com https://fb.com/tailieudientucntt
end
end

my74bk138 u0(.en(1), .din(count), .dout(dout));


endmodule
Hãy gán chân clk vào KEY[0], reset, mode vào các SW và dout vào LEDR, sau đó dịch
và nạp xuống board DE2 để kiểm tra. Gạt chân reset (SW tương ứng) về 0, rồi nhấn
KEY[0] để tạo xung clock để kiểm tra

Bài tập: Thiết kế bộ đếm BCD 1 chữ số và hiển thị ra LED 7 đoạn với xung clock 2Hz.
Code verilog của bộ đếm BCD trên:

module myhamburger(input clk, input reset, input mode, output [7:0] dout);
reg [2:0] count;

module mycount50(clk, reset, mode, count);

my74bk138 u0(.en(1), .din(count), .dout(dout));


endmodule

Bài tập (* không bắt buộc):


- Thiết kế bộ đếm BCD 2 chữ số và hiển thị LED 7 đoạn
- Tính năng mở rộng: không hiển thị số 0 vô nghĩa
Bài tập (* không bắt buộc):
- Thiết kế đồng hồ hiển thị giờ, phút, giây ra LED 7 đoạn
- Tính năng mở rộng: cho phép chỉnh giờ, phút

CuuDuongThanCong.com https://fb.com/tailieudientucntt

You might also like