module RegAndWire(clk, reset, inA, inB, wireOut1, wireOut2, regOut1, regOut2);
input clk, reset;
input [3:0] inA, inB;
output [3:0] wireOut1, wireOut2, regOut1, regOut2;
reg [3:0] regOut1, regOut2;
wire [3:0] testWire;
reg [3:0] testReg;
assign wireOut1 = inA + inB;
assign testWire = inA;
assign wireOut2 = testWire + inB;
always @(posedge clk) begin
regOut1 <= inA + inB;
testReg <= inA;
regOut2 <= testReg + inB;
end
endmodule
27 trang |
Chia sẻ: oanh_nt | Lượt xem: 1221 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Thiết kế ICtrên FPGA(final) (Field-Programmable Gate Array ), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
7KLӃW NӃ IC trên FPGA (final)
(Field-Programmable Gate Array )
ĈһQJBá .KҳF 7ULӅX
*LҧQJ viên Khoa CNTT
7UѭӡQJ Ĉ+%.Ĉj 1ҹQJ
1
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Reg khác YӟLWire QKѭ WKӃ nào?
module RegAndWire(clk, reset, inA, inB, wireOut1, wireOut2, regOut1, regOut2);
input clk, reset;
input [3:0] inA, inB;
output [3:0] wireOut1, wireOut2, regOut1, regOut2;
reg [3:0] regOut1, regOut2;
wire [3:0] testWire;
reg [3:0] testReg;
assign wireOut1 = inA + inB;
assign testWire = inA;
assign wireOut2 = testWire + inB;
always @(posedge clk) begin
regOut1 <= inA + inB;
testReg <= inA;
regOut2 <= testReg + inB;
end
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Reg khác YӟLWire QKѭ WKӃ nào?
module RegAndWire(clk, reset, inA, inB, wireOut1,
wireOut2, regOut1, regOut2);
input clk, reset;
input [3:0] inA, inB;
output [3:0] wireOut1, wireOut2, regOut1,
regOut2;
reg [3:0] regOut1, regOut2;
wire [3:0] testWire;
reg [3:0] testReg;
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Reg khác YӟLWire QKѭ WKӃ nào?
module RegAndWire(clk, reset, inA, inB, wireOut1, wireOut2,
regOut1, regOut2);
assign wireOut1 = inA + inB;
assign testWire = inA;
assign wireOut2 = testWire + inB;
always @(posedge clk) begin
regOut1 <= inA + inB;
testReg <= inA;
regOut2 <= testReg + inB;
end
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
wireOut1 và wireOut2 cho NӃW TXҧ JLӕQJ nhau
regOut1 và regOut2 cho NӃW TXҧ khác nhau
Reg khác YӟLWire QKѭ WKӃ nào?
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
wireOut1 và wireOut2 có input JLӕQJ nhau,
output JLӕQJ nhau
Reg khác YӟLWire QKѭ WKӃ nào?
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Reg khác YӟLWire QKѭ WKӃ nào?
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Phân chia nhóm:
0ӛL nhóm WӕL ÿD 4 QJѭӡL
0ӑL QJѭӡL có WKӇ Wӵ do OұS nhóm, nhóm 1
QJѭӡL FNJQJ ÿѭӧF.
/ұS nhóm có các thành viên khác OӟS FNJQJ
ÿѭӧF
1ӝS bài WұS
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
%ҧQ báo cáo YLӃW EҵQJ Word, JӱL theo email
và in ra PӝW EҧQ QӝS WUӵF WLӃS
7KӡL gian: WҩW Fҧ QӝS vào FKLӅX WKӭ 4 ngày
6/5/2009 (QӃX có gì thay ÿәL VӁ thông báo sau)
ĈӏD ÿLӇP: YăQ phòng khoa
Ghi rõ:
+ӑ tên sv trong nhóm, mã Vӕ sinh viên, OӟS.
Ai ÿm làm YLӋF gì
9ҩQ ÿӅ ÿm làm, KѭӟQJ JLҧL TX\ӃW
9LӃW FKѭѫQJ trình
&KөS OҥL NӃW TXҧ FKҥ\ simulation và WKX\ӃW minh
NӃW TXҧ ÿy là ÿ~QJ
Nêu FҧP WѭӣQJ
1ӝS bài WұS (2)
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
1. 7KLӃW NӃ PҥFK nhân ÿѭӧF FҩX WҥR EӣL ít FәQJ
logic QKҩW. %LӃW UҵQJ khi Vӱ GөQJ phép nhân trong
Verilog thì 8b x 8b KӃW 368 FәQJ, 16b x 16b KӃW
1632 FәQJ. (Nhóm 1 QJѭӡL)
2. 7KLӃW NӃ PӝW thanh RAM (có WKӇ ÿӑF, ghi Gӳ OLӋX)
YӟL dung OѭӧQJ tùy FKӑQ. (Nhóm 1 QJѭӡL)
3. 7KLӃW NӃ PӝW CPU ÿѫQ JLҧQ, Vӱ GөQJ RAM làm
Eӝ QKӟ FKӭD OӋQK và NӃW TXҧ.
4. 7ӵ do. 7KLӃW NӃ GӵD trên tài OLӋX tham NKҧR KRһF
Wӵ suy QJKƭ. 1Kӟ ghi rõ tên tài OLӋX tham NKҧR,
[XҩW [ӭ và PҥFK ÿy không trùng OһS YӟL QKӳQJ
PҥFK ÿѫQ JLҧQ ÿm trình bày trong bài JLҧQJ
ĈӅ bài
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Sau PӛL clock giá WUӏ WăQJ lên 1
=> 0ҥFK ÿӃP ÿѫQ JLҧQ QKҩW bao JӗP PӝW
D Flip-flop và PҥFK FӝQJ 1.
Counter (PҥFK ÿӃP)
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
&KѭѫQJ trình
module counter1(clk, reset, counter);
input clk, reset;
output [3:0] counter;
reg [3:0] counter;
always @(posedge clk or posedge reset) begin
if(reset)
counter <= 0;
else
counter <= counter + 1;
end
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Là counter FKӍ WKӵF KLӋQ YLӋF ÿӃP khi có tín
KLӋX cho phép (enable)
Counter có tín KLӋX Enable
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
&KѭѫQJ trình
module counter2(clk, reset, enable, counter);
input clk, reset, enable;
output [3:0] counter;
reg [3:0] counter;
always @(posedge clk or posedge reset) begin
if(reset)
counter <= 0;
else if(enable)
counter <= counter + 1;
else
counter <= counter;
end
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Là PҥFK ÿӃP GӵD vào tín KLӋX up/down mà
ÿӃP xuôi hay QJѭӧF trong SKҥP vi Wӯ 0
ÿӃQ 9
.ӃW KӧS YӟL module KLӋQ WKӏ ÿqQ LED ÿӇ
ELӇX GLӉQ Vӕ WKұS phân
=> Bài WұS 5: WKLӃW NӃ PҥFK ÿӃP KLӋQ WKӏ 2 ô
Vӕ 7 ÿRҥQ ÿѭӧF ELӇX GLӉQ EҵQJ ÿqQ LED.
Counter up/down 0~9
SG7
SG1
SG4
S
G
2
S
G
3
S
G
6
S
G
5
SG7
SG1
SG4
S
G
2
S
G
3
S
G
6
S
G
5
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
&ҩX WҥR JӗP:
PC: program counter
ROM: FKӭD OӋQK
ALU: JLҧL mã OӋQK + WKӵF KLӋQ phép toán ÿѫQ
JLҧQ
Simple CPU
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
1. 7ҥR PC (program counter), YӟL ÿӏD FKӍ cao
QKҩW là ¶K)
2. 7ҥR ROM có FKӭD 16 Gӳ OLӋX, PӛL Gӳ OLӋX
32 bits
3. ALU ÿѫQ JLҧQ có FKӭD SKҫQ JLҧL mã OӋQK
4. .ӃW KӧS 3 module trên
Các EѭӟF WKӵF KLӋQ
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
*LӕQJ QKѭ PӝW PҥFK ÿӃP.
1. 7ҥR PC
module PC(clk, reset, proCounter);
input clk, reset;
output [3:0] proCounter;
reg [3:0] proCounter;
always @(posedge clk or posedge reset) begin
if(reset) begin
proCounter <= 0;
end else begin
proCounter <= proCounter + 1;
end
end
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
/ӋQK có FҩX trúc ÿѫQ JLҧQ QKѭ sau:
8 bits ÿҫX là Opcode, FKӭD thông tin là phép
FӝQJ, hay WUӯ«
8 bits + 8 bits WLӃS theo là 2 giá WUӏ FӫD phép
toán
8bits FXӕL ÿӇ WUӕQJ
2. 7ҥR ROM
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
2. 7ҥR ROM (2)
module ROM(addr, data);
input [3:0] addr;
output [31:0] data;
assign data = dataOut(addr);
function [31:0] dataOut;
input [3:0] addr;
begin
case(addr)
4'h0: dataOut = 32'h01_02_04_00; // add
4'h1: dataOut = 32'h02_1f_03_00; // sub
default dataOut = 32'h00000000;
endcase
end
endfunction
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
3. ALU ÿѫQ JLҧQ
module SimpleALU(clk, reset, instruction, result);
input clk, reset;
input [31:0] instruction;
output [15:0] result;
reg [15:0] result;
always @(posedge clk or posedge reset) begin
if(reset) begin
result <= 0;
end else begin
case(instruction[31:24])
8'h01: result <= instruction[23:16] + instruction[15:8]; // add
8'h02: result <= instruction[23:16] - instruction[15:8]; // sub
endcase
end
end
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
4. .ӃW KӧS
module SimpleCPU(clk, reset, dataOut);
input clk, reset;
output [15:0] dataOut;
wire [3:0] addr;
wire [31:0] instData;
PC pc1(.clk(clk), .reset(reset), .proCounter(addr));
//PC pc2(.clk(clk), .proCounter(addr), .reset(reset));
ROM rom1(.addr(addr), .data(instData));
SimpleALU
ALU1(.clk(clk), .reset(reset), .instruction(instData), .result(data
Out));
endmodule
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
.ӃW TXҧ
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Khi NKӣL ÿӝQJ FKѭѫQJ trình simulation ta
FKӍ WKҩ\ tín KLӋX input và output FӫD module
ngoài cùng
3KѭѫQJpháp xem tín KLӋX bên trong
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Click FKXӝW trái vào FKӳ 887ӣPHQXbên
trái ta VӁ WKҩ\ ÿѭӧF 2 tín KLӋX WҥP là addr
và instData
3KѭѫQJpháp xem tín KLӋX bên trong
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
1KҩS FKXӝW trái vào tín KLӋX ӣ{Name và
kéo WKҧ vào ô Messages; UӗL EҩP nút
restart; ÿһW giá WUӏ WKӡL gian phù KӧS; UӗL
EҩP nút run ta VӁ xem ÿѭӧF tín KLӋX ÿy.
3KѭѫQJpháp xem tín KLӋX bên trong
2009 ĈɴQJBá .KɬF 7ULɾX, GV khoa CNTT, WUɉ͝QJ Ĉ+%.Ĉ1
Click FKXӝW vào GҩX + bên FҥQK UUT VӁ
KLӋQ ra các module QKӓ; ta có WKӇ xem giá
WUӏ các tín KLӋX này QKѭ SKѭѫQJ pháp trên
3KѭѫQJpháp xem tín KLӋX bên trong
Các file đính kèm theo tài liệu này:
- vietstudy_net_thietkemachlogicbangverilog.pdf