Thiết kế mạch ghép kênh/mạch giải ghép kênh từ 4 sang 1/1 sang 4 với các yêu cầu sau: - Có E\ tác động mức thấp, khi không tác động ngõ ra được đặt ở mức cao.. - Có 1 ngõ vào S được dùn
Trang 1TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH
KHOA ĐIỆN- ĐIỆN TỬ
-BÁO CÁO CUỐI KỲ MÔN: THỰC TẬP THIẾT KẾ HỆ THỐNG
VÀ VI MẠCH TÍCH HỢP
GVHD: Th.S Lê Minh Thành
Họ và tên: Ngô Minh Nhật MSSV: 20161346 Lớp: Thứ 7 - Tiết 1 – 5
THÀNH PHỐ HỒ CHÍ MINH – Tháng 12 năm 202
Trang 2BÀI BÁO CÁO CUỐI KỲ
1 Thiết kế mạch ghép kênh/mạch giải ghép kênh từ 4 sang 1/1 sang 4 với các yêu cầu sau:
- Có E\ tác động mức thấp, khi không tác động ngõ ra được đặt ở mức cao
- Có 1 ngõ vào S được dùng để lựa chọn chế độ ghép kênh hoặc giải ghép kênh
Sơ đồ khối:
Hình 1.1: Sơ đồ khối của mạch ghép kênh/mạch giải ghép kênh từ 4 sang 1/1 sang 4
Trong đó:
In: ngõ vào của mạch
S2: ngõ vào lựa chọn kênh
S1: ngõ vào lựa chọn ghép kênh/giải ghép kênh
En: ngõ vào cho phép
y: ngõ ra của mạch
Trang 3Sơ đồ RTL:
Hình 1.2: Sơ đồ RTL của mạch ghép kênh/mạch giải ghép kênh từ 4 sang 1/1 sang 4
Chương trình mô tả phần cứng bằng ngôn ngữ Verilog:
module Demux14(
input in,
input en,
input [1:0] s,
output [0:3] y);
assign y[0]=(en==0)?~(in&~s[1]&~s[0]):1;
assign y[1]=(en==0)?~(in&~s[1]&s[0]):1;
assign y[2]=(en==0)?~(in&s[1]&~s[0]):1;
assign y[3]=(en==0)?~(in&s[1]&s[0]):1;
endmodule
module Mux41(
input [3:0] in,
Trang 4input en,
input [1:0] s,
output y);
assign y=(en==0)?~((in[0]&~s[1]&~s[0])+ (in[1]&~s[1]&s[0])+(in[2]&s[1]&~s[0])+
(in[3]&s[1]&s[0])):1;
endmodule
module Bai1_CuoiKy(
input [0:4] in,
input en,
input s1,
input [1:0] s2,
output [4:0] y);
wire [4:0] tam;
wire [4:0] c;
assign tam=(s1==0)?16:15;
and(c[4],in[4],tam[4]);
and(c[3],in[3],tam[3]);
and(c[2],in[2],tam[2]);
and(c[1],in[1],tam[1]);
and(c[0],in[0],tam[0]);
Demux14 A (c[4], en, s2[1:0], y[3:0]);
Mux41 B (c[3:0], en, s2[1:0], y[4]);
endmodule
Test bench:
module Test_Bai1;
reg [0:4] in;
Trang 5reg en;
reg s1;
reg [1:0] s2;
wire [4:0] y;
Bai1_CuoiKy uut (
.in(in), .en(en), .s1(s1), .s2(s2), .y(y));
initial begin
in = 0;
en = 0;
#10;
en = 1;
#50;
en = 0;
#10;
s1 = 0; s2 = 0; #100; s1 = 0; s2 = 1; #100; s1 = 0; s2 = 2; #100; s1 = 0; s2 = 3; #100; s1 = 1; s2 = 0; #100; s1 = 1; s2 = 1; #100; s1 = 1; s2 = 2; #100; s1 = 1; s2 = 3; #100;
$stop;
Trang 6always
begin
in[4]=~in[4];#10; end
always
begin
in[3]=~in[3];#20; end
always
begin
in[2]=~in[2];#30; end
always
begin
in[1]=~in[1];#40; end
always
begin
in[0]=~in[0];#50; end
endmodule
Trang 7Hình 1.3: Kết quả mô phỏng mạch ghép kênh/mạch giải ghép kênh từ 4 sang 1/1 sang 4
Nhận xét:
Từ 10ms đến 60ms: en = 1 nên ngõ ra được đặt ở mức cao
Từ 60ms trở đi: ngõ vào cho phép en = 0 nên mạch bắt đầu hoạt động
Từ 70ms đến 470ms:
+ Ngõ vào s1 = 0 nên mạch hoạt động ở chế độ giải ghép kênh
+ Ngõ vào chọn kênh s2 lần lượt có các giá trị là 00, 01, 10, 11 tương ứng với các ngõ ra y[3], y[2], y[1], y[0]
+ Ngõ ra của mạch giải ghép kênh có giá trị giống với giá trị của ngõ vào tại thời điểm giải ghép
Từ 470ms đến 870ms:
+ Ngõ vào s1 = 1 nên mạch hoạt động ở chế độ ghép kênh
+ Ngõ vào chọn kênh s2 lần lượt có các giá trị là 00, 01, 10, 11 tương ứng với các ngõ ra y[3], y[2], y[1], y[0]
+ Ngõ ra của mạch ghép kênh sẽ có giá trị giống với giá trị của kênh được chọn tại thời điểm ghép kênh
Vậy mạch hoạt động đúng với yêu cầu của đề bài
2 Thiết kế mạch quang báo 8 led rời L0-L7 với các yêu cầu sau:
- Mode 1: các led chớp tắt như sau: L0-L3 sáng thì L4-L7 tắt
- Mode 2: 4 led L0-L3 đếm lên (L0 đại diện cho bit có trọng số thấp), các led L4 cho đến L7
Trang 8cũng đếm lên (L7 đại điện cho bit có trọng số thấp)
- Mode 3: 5 led L0-L4 sáng dần lên và tắt, 3 led L5-L7 hiển thị số lần sáng dần rồi tắt của nhóm
L0-L4
- Mode 4: 8 led tắt dần
- Xung clk có 2 tần số, 4 Hz và 10 Hz, được chia xung từ xung clock nội 4 MHz
- Nút nhấn EAST được dùng để reset
Sơ đồ RTL:
Hình 2.1: Sơ đồ RTL của mạch quang báo 8 led rời L0-L7
Chương trình mô tả phần cứng bằng ngôn ngữ Verilog:
module Mux21(
input wire [1:0] clk,
input wire sw0,
output reg clk_o);
always @(clk,sw0)
case (sw0)
Trang 90: clk_o = clk[0];
1: clk_o = clk[1];
endcase
endmodule
module Div
#(parameter N= 22, M = 4000000)
( input wire clk, reset,
output wire [1:0]q);
reg [N-1:0] r_reg4H, r_reg10H;
wire [N-1:0] r_next4H,r_next10H;
always @(posedge clk, posedge reset)
begin
if (reset)
begin
r_reg4H<= 0;
r_reg10H<= 0;
end
else
begin
r_reg4H<=r_next4H;
r_reg10H<=r_next10H;
end
end
assign r_next4H = (r_reg4H==M/4)?0:r_reg4H + 1;
assign r_next10H = (r_reg10H==M/10)?0:r_reg10H + 1; assign q[0]=(r_reg4H<M/8)?0:1;
assign q[1]=(r_reg10H<M/20)?0:1;
Trang 10module MODE1(
input wire clk,reset,
output reg [7:0] q);
reg [3:0] tam2, tam3;
initial begin tam2=0; tam3=0; end always @(posedge clk, posedge reset)
if(reset)
q=8'b0000000;
else
begin
tam2=~tam2;
tam3=~tam2;
q={tam3,tam2};
end
endmodule
module MODE2(
input clk,reset,
output reg [7:0] led);
reg [3:0] tam;
initial tam = 0;
always @( posedge clk)
begin
if ( reset == 1)
led =0;
else
tam = tam+1;
Trang 11led = {tam[0],tam[1],tam[2],tam[3],tam};
end
endmodule
module MODE3(
input wire clk,reset,
output reg [7:0] led);
reg [5:0] tam1;
reg [2:0] tt,a;
initial begin tam1=0; tt=0; a=0; end
always @(posedge clk, posedge reset)
begin
if(reset) begin tam1=0;
a=0;
end else begin tam1=(tam1[5]==0)?{tam1[4:0],~tam1[5]}:0; tt=tt+1;
if(tt==7)
begin a=a+1;
tt=0;
end else a=a;
Trang 12led[7:5] = a;
led[4:0] = tam1;
end end
endmodule
module MODE4(
input wire clk,reset,
output wire [7:0] s_out );
reg [7:0] r_reg;
wire [7:0] r_next;
always @(posedge clk,posedge reset)
if(reset)
r_reg<=8'b11111111;
else
r_reg<=r_next;
{~r_reg[0],r_reg[7:1]};
assign s_out= r_reg;
endmodule
module Bai2_CuoiKy(
input clk, reset,sw0,
input [3:0] sw,
output reg [7:0] led );
wire [7:0] c,d,e,f;
Mux21 B (q, sw0, clko);
Div A (clk, reset, q);
MODE1 C (clko, reset, c );
Trang 13MODE2 D (clko, reset, d);
MODE3 E (clko, reset, e);
MODE4 F (clko, reset, f);
always @(posedge clk)
led=(sw==00)?c:(sw==01)?d:(sw==10)?e:f; endmodule
Test bench:
module Test_Bai2;
reg clk;
reg reset;
reg sw0;
reg [3:0] sw;
wire [7:0] led;
Bai2_CuoiKy uut (
.clk(clk), .reset(reset), .sw0(sw0), .sw(sw), .led(led));
initial begin
clk = 0;
reset = 0;
sw0 = 0;
sw = 0;
#100;
reset = 1; #10;
reset = 0; #10;
Trang 14sw = 3; #100;
end always begin
#125; clk=~clk;
end endmodule
3 Thiết kế máy trạng thái có sơ đồ trạng thái sau:
Trang 15Sơ đồ khối:
Hình 3.1: Sơ đồ khối của máy trạng thái
Sơ đồ RTL:
Hình 3.2: Sơ đồ RTL của máy trạng thái
Chương trình mô tả phần cứng bằng ngôn ngữ Verilog: module Bai3_CuoiKy(clk, reset, w,z); input clk, reset, w;
output reg z;
Trang 16reg[2:1] y,Y;
parameter [2:1] S0 = 2'b00, S1 = 2'b01, S2 = 2'b10; always@(w,y)
case (y)
S0: if(w) begin Y=S2; z=1'b1;end
S1: if(w) begin Y=S1; z=1'b1;end
S2: if(w) begin Y=S1; z=1'b1;end
default: Y=S0;
endcase
always @(negedge reset, posedge clk)
if (reset == 0) y = S0;
else y = Y;
endmodule
Test bench:
module Test_Bai3;
reg clk;
reg reset;
reg w;
wire z;
Bai3_CuoiKy uut (
.clk(clk), .reset(reset), .w(w),
initial begin
clk = 0;
reset = 0;
w = 0;
#100;
Trang 17clk = 0;
reset = 1;
w = 0;
#100;
clk = 0;
reset = 1;
w = 1;
#100;
end
always
begin
#10;
clk=~clk;
end
endmodule
Hình 3.3: Kết quả mô phỏng của máy trạng thái