Professional Documents
Culture Documents
Thiet-Ke-Vi-Mach-Voi-Hdl - Pham-Quoc-Cuong - Lab3 - Mo-Hinh-Hanh-Vi - (Cuuduongthancong - Com)
Thiet-Ke-Vi-Mach-Voi-Hdl - Pham-Quoc-Cuong - Lab3 - Mo-Hinh-Hanh-Vi - (Cuuduongthancong - Com)
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
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 @(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;
CuuDuongThanCong.com https://fb.com/tailieudientucntt
end
end
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;
CuuDuongThanCong.com https://fb.com/tailieudientucntt