多種基本門(mén)電路的IP核
實(shí)驗(yàn)?zāi)康?/h3>
通過(guò)實(shí)驗(yàn),進(jìn)一步熟悉使用 vivado 進(jìn)行可配置 IP 核設(shè)計(jì)的方法,對(duì)各種門(mén)電路的邏輯 有更加感性的認(rèn)識(shí),同時(shí)也為今后的實(shí)驗(yàn)以及后續(xù)的課程積累基本的門(mén)電路 IP 核。
實(shí)驗(yàn)內(nèi)容
通過(guò)實(shí)驗(yàn),進(jìn)一步熟悉使用 vivado 進(jìn)行可配置 IP 核設(shè)計(jì)的方法,對(duì)各種門(mén)電路的邏輯 有更加感性的認(rèn)識(shí),同時(shí)也為今后的實(shí)驗(yàn)以及后續(xù)的課程積累基本的門(mén)電路 IP 核。
仿照 2.1.2 節(jié)的設(shè)計(jì)方法,使用 Verilog HDL 語(yǔ)言的數(shù)據(jù)流描述法設(shè)計(jì)下列各種 1~32 位 數(shù)據(jù)寬度可變的基本門(mén)電路,出了非門(mén)外,其他門(mén)電路還要求輸入端口了在 2-8 之間變化, 最后將它們分別封裝成IP核。一定要注意不同門(mén)電路的各個(gè)端口在disable時(shí)候的取值Driver value 的設(shè)定,要用一個(gè)合理的值。 需要完成的 IP 核及相關(guān)參數(shù)如表 2-2 所示。
表 2-2 中的各個(gè)門(mén)電路的 IP 核封裝好后,統(tǒng)一拷貝到D:\vivado_pro \orgnization 中,并分別解壓這些.zip 文件,如圖 1-75 所示。
1 或門(mén)
orgate.v文件:
`timescale 1ns / 1ps
module orgate
#(parameter Port_Num = 2, // 指定缺省的輸入是2個(gè)輸入端口
parameter WIDTH = 8) // 指定數(shù)據(jù)寬度參數(shù),缺省值是8
(
input [(WIDTH - 1) : 0] a,
input [(WIDTH - 1) : 0] b,
input [(WIDTH - 1) : 0] c,
input [(WIDTH - 1) : 0] d,
input [(WIDTH - 1) : 0] e,
input [(WIDTH - 1) : 0] f,
input [(WIDTH - 1) : 0] g,
input [(WIDTH - 1) : 0] h,
output [(WIDTH - 1) : 0] q
);
assign q = (a | b | c | d | e | f | g | h);
endmodule
orgate_sim.v文件:
`timescale 1ns / 1ps
module orgate_sim();
// input
reg a = 0;
reg b = 0;
reg c = 0;
reg d = 0;
reg e = 0;
reg f = 0;
reg g = 0;
reg h = 0;
// output
wire q;
// 實(shí)例化或門(mén)的時(shí)候,設(shè)定寬度為1
orgate #(8, 1) u(
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g),
.h(h),
.q(q)
);
initial begin
#100 a = 1;
#100 begin a = 0; b = 1; end
#100 a = 0;
#100 a = 1;
end
endmodule
orgate_sim32.v文件:
module orgate32_sim( );
// input
reg [31:0] a=32'h00000000;
reg [31:0] b=32'h00000000;
reg [31:0] c=32'h00000000;
reg [31:0] d=32'h00000000;
reg [31:0] e=32'h00000000;
reg [31:0] f=32'h00000000;
reg [31:0] g=32'h00000000;
reg [31:0] h=32'h00000000;
//outbut
wire [31:0] q;
orgate #(8,32) u(.a(a),.b(b),.c(c),.d(d),
.e(e),.f(f),.g(g),.h(h),.q(q)); // 實(shí)例化的時(shí)候,設(shè)定寬度為32
initial begin
#100 a=32'hff78dff;
#100 begin a=32'h00000000;b=32'hffff8b0;end
#100 a = 32'h007fa509;
#100 a=32'hffffffff;
end
endmodule
圖 1-59 創(chuàng)建ordgate項(xiàng)目
圖 1-61 32位 8 輸入或門(mén)的仿真波形
2 非門(mén)
notgate.v文件:
`timescale 1ns / 1ps
module notgate
#(parameter WIDTH = 8) // 指定數(shù)據(jù)寬度參數(shù),缺省值是8
(
input [(WIDTH - 1) : 0] a,
output [(WIDTH - 1) : 0] c
);
assign c = ~a;
endmodule
notgate_32sim.v文件:
`timescale 1ns / 1ps
module notgate32_sim();
// input
reg [31:0] a = 32'h00000000;
// output
wire [31:0] c;
// 實(shí)例化非門(mén)的時(shí)候,設(shè)定寬度為32
notgate #(32) u(
.a(a),
.c(c)
);
initial begin
#100 a = 32'hffffffff;
#100 a = 32'h00000000;
#100 a = 32'h007fa509;
#100 a = 32'hffffffff;
end
endmodule
圖 1-62創(chuàng)建notgate項(xiàng)目
圖 1-63 32位 8 輸入非門(mén)的仿真波形
3 與非門(mén)
nandgate.v文件:
`timescale 1ns / 1ps
module nandgate
#(parameter Port_Num = 2, // 指定缺省的輸入是2個(gè)輸入端口
parameter WIDTH = 8) // 指定數(shù)據(jù)寬度參數(shù),缺省值是8
(
input [(WIDTH - 1) : 0] a,
input [(WIDTH - 1) : 0] b,
input [(WIDTH - 1) : 0] c,
input [(WIDTH - 1) : 0] d,
input [(WIDTH - 1) : 0] e,
input [(WIDTH - 1) : 0] f,
input [(WIDTH - 1) : 0] g,
input [(WIDTH - 1) : 0] h,
output [(WIDTH - 1) : 0] q
);
assign q = ~(a & b & c & d & e & f & g & h);
endmodule
nandgate32_sim文件:
`timescale 1ns / 1ps
module nandgate32_sim();
// input
reg [31:0] a = 32'h00000000;
reg [31:0] b = 32'h00000000;
reg [31:0] c = 32'hffffffff;
reg [31:0] d = 32'hffffffff;
reg [31:0] e = 32'hffffffff;
reg [31:0] f = 32'hffffffff;
reg [31:0] h = 32'hffffffff;
reg [31:0] g = 32'hffffffff;
// output
wire [31:0] q;
// 實(shí)例化與非門(mén)的時(shí)候,設(shè)定寬度為32
nandgate #(8, 32) u(
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g),
.h(h),
.q(q)
);
initial begin
#100 a = 32'hffffffff;
#100 begin
a = 32'h00000000;
b = 32'hffffffff;
end
#100 a = 32'h007fa509;
#100 a = 32'hffffffff;
end
endmodule
圖 1-64創(chuàng)建nandgate項(xiàng)目
圖 1-65 1 位 8 輸入與非門(mén)的仿真波形
圖 1-66 32 位 8 輸入與非門(mén)的仿真波形
4 或非門(mén)
norgate.v文件:
`timescale 1ns / 1ps
module norgate
#(parameter Port_Num = 2, // 指定缺省的輸入是2個(gè)輸入端口
parameter WIDTH = 8) // 指定數(shù)據(jù)寬度參數(shù),缺省值是8
(
input [(WIDTH - 1) : 0] a,
input [(WIDTH - 1) : 0] b,
input [(WIDTH - 1) : 0] c,
input [(WIDTH - 1) : 0] d,
input [(WIDTH - 1) : 0] e,
input [(WIDTH - 1) : 0] f,
input [(WIDTH - 1) : 0] g,
input [(WIDTH - 1) : 0] h,
output [(WIDTH - 1) : 0] q
);
assign q = ~(a | b | c | d | e | f | g | h);
endmodule
norgate32_sim.v文件:
`timescale 1ns / 1ps
module norgate32_sim();
// input
reg [31:0] a = 32'h00000000;
reg [31:0] b = 32'h00000000;
reg [31:0] c = 32'h00000000;
reg [31:0] d = 32'h00000000;
reg [31:0] e = 32'h00000000;
reg [31:0] f = 32'h00000000;
reg [31:0] h = 32'h00000000;
reg [31:0] g = 32'h00000000;
// output
wire [31:0] q;
// 實(shí)例化或非門(mén)的時(shí)候,設(shè)定寬度為32
norgate #(8, 32) u(
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g),
.h(h),
.q(q)
);
initial begin
#100 a = 32'hffffffff;
#100 begin
a = 32'h00000000;
b = 32'hffffffff;
end
#100 begin
a = 32'h007fa509;
b = 32'h00000000;
end
#100 a = 32'hffffffff;
end
endmodule
圖 1-67創(chuàng)建norgate項(xiàng)目
圖 1-68 1 位 8 輸入或非門(mén)的仿真波形
圖 1-69 32位 8 輸入或非門(mén)的仿真波
5 異或門(mén)
xorgate.v文件:
`timescale 1ns / 1ps
module xorgate
#(parameter Port_Num = 2, // 指定缺省的輸入是2個(gè)輸入端口
parameter WIDTH = 8) // 指定數(shù)據(jù)寬度參數(shù),缺省值是8
(
input [(WIDTH - 1) : 0] a,
input [(WIDTH - 1) : 0] b,
input [(WIDTH - 1) : 0] c,
input [(WIDTH - 1) : 0] d,
input [(WIDTH - 1) : 0] e,
input [(WIDTH - 1) : 0] f,
input [(WIDTH - 1) : 0] g,
input [(WIDTH - 1) : 0] h,
output [(WIDTH - 1) : 0] q
);
assign q = (a ^ b ^ c ^ d ^ e ^ f ^ g ^ h);
endmodule
xorgate32_sim.v文件:
`timescale 1ns / 1ps
module xorgate32_sim();
// input
reg [31:0] a = 32'h00000000;
reg [31:0] b = 32'h00000000;
reg [31:0] c = 32'h00000000;
reg [31:0] d = 32'h00000000;
reg [31:0] e = 32'h00000000;
reg [31:0] f = 32'h00000000;
reg [31:0] h = 32'h00000000;
reg [31:0] g = 32'h00000000;
// output
wire [31:0] q;
// 實(shí)例化異或門(mén)的時(shí)候,設(shè)定寬度為32
xorgate #(8, 32) u(
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g),
.h(h),
.q(q)
);
initial begin
#100 a = 32'hffffffff;
#100 begin
a = 32'h00000000;
b = 32'hffffffff;
end
#100 a = 32'h007fa509;
#100 a = 32'hffffffff;
end
endmodule
圖 1-70創(chuàng)建xorgate項(xiàng)目
圖 1-71 1 位 8 輸入異或門(mén)的仿真波形
圖 1-72 32 位 8 輸入異或門(mén)的仿真波形
6 異或非門(mén)
nxorgate.v文件:
`timescale 1ns / 1ps
module nxorgate
#(parameter Port_Num = 2, // 指定缺省的輸入是2個(gè)輸入端口
parameter WIDTH = 8) // 指定數(shù)據(jù)寬度參數(shù),缺省值是8
(
input [(WIDTH - 1) : 0] a,
input [(WIDTH - 1) : 0] b,
input [(WIDTH - 1) : 0] c,
input [(WIDTH - 1) : 0] d,
input [(WIDTH - 1) : 0] e,
input [(WIDTH - 1) : 0] f,
input [(WIDTH - 1) : 0] g,
input [(WIDTH - 1) : 0] h,
output [(WIDTH - 1) : 0] q
);
assign q = ~(a ^ b ^ c ^ d ^ e ^ f ^ g ^ h);
endmodule
nxorgate32_sim.v文件:
`timescale 1ns / 1ps
module nxorgate32_sim();
// input
reg [31:0] a = 32'h00000000;
reg [31:0] b = 32'h00000000;
reg [31:0] c = 32'h00000000;
reg [31:0] d = 32'h00000000;
reg [31:0] e = 32'h00000000;
reg [31:0] f = 32'h00000000;
reg [31:0] h = 32'h00000000;
reg [31:0] g = 32'h00000000;
// output
wire [31:0] q;
// 實(shí)例化異或非門(mén)的時(shí)候,設(shè)定寬度為32
nxorgate #(8, 32) u(
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g),
.h(h),
.q(q)
);
initial begin
#100 a = 32'hffffffff;
#100 begin
a = 32'h00000000;
b = 32'hffffffff;
end
#100 a = 32'h007fa509;
#100 a = 32'hffffffff;
end
endmodule
圖 1-73創(chuàng)建nxorgate項(xiàng)目
圖 1-74 32 位 8 輸入異或非門(mén)的仿真波形
7 完成結(jié)果
圖 1-75封裝好的 IP 核
五、實(shí)驗(yàn)數(shù)據(jù)記錄和處理
1. LED燈仿真代碼:
`timescale 1ns / 1ps
module Ex_1_sim(
);
// input
reg [23:0] sw = 24'h000000;
// output
wire [23:0] led;
// instantiate the Unit under test
Ex_1 uut(
.sw(sw),
.led(led)
);
always #10 sw = sw + 1;
endmodule
2. 1位與門(mén)仿真代碼:
`timescale 1ns / 1ps
module andgate_sim();
// input
reg a = 0;
reg b = 0;
reg c = 1;
reg d = 1;
reg e = 1;
reg f = 1;
reg g = 1;
reg h = 1;
// output
wire q;
// 實(shí)例化與門(mén)的時(shí)候,設(shè)定寬度為1
andgate #(8, 1) u(
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g),
.h(g),
.q(q)
);
initial begin
#100 a = 1;
#100 begin a = 0; b = 1; end
#100 a = 1;
end
endmodule
3. 32位與門(mén)仿真代碼:
`timescale 1ns / 1ps
module andgate32_sim();
// input
reg [31:0] a = 32'h00000000;
reg [31:0] b = 32'h00000000;
reg [31:0] c = 32'hffffffff;
reg [31:0] d = 32'hffffffff;
reg [31:0] e = 32'hffffffff;
reg [31:0] f = 32'hffffffff;
reg [31:0] h = 32'hffffffff;
reg [31:0] g = 32'hffffffff;
// output
wire [31:0] q;
// 實(shí)例化與門(mén)的時(shí)候,設(shè)定寬度為32
andgate #(8, 32) u(
.a(a),
.b(b),
.c(c),
.d(d),
.e(e),
.f(f),
.g(g),
.h(h),
.q(q)
);
initial begin
#100 a = 32'hffffffff;
#100 begin
a = 32'h00000000;
b = 32'hffffffff;
end
#100 a = 32'h007fa509;
#100 a = 32'hffffffff;
end
endmodule
六、實(shí)驗(yàn)結(jié)果與分析
-
LED燈仿真波形:
圖 1-76 LED燈仿真波形
-
1位與門(mén)仿真波形:
圖 1-77 1位與門(mén)仿真波形文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-764083.html
-
32位與門(mén)仿真波形:
圖 1-78 32位與門(mén)仿真波形文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-764083.html
七、討論、心得
- 通過(guò)這個(gè)實(shí)驗(yàn),學(xué)習(xí)了vivado軟件和verilog硬件描述語(yǔ)言的使用,了解到了硬件程序的設(shè)計(jì)方法,鞏固了設(shè)計(jì)流程。
- 封裝IP核的操作其實(shí)和程序設(shè)計(jì)中的“函數(shù)”類(lèi)似,通過(guò)封裝IP核,我們可以在其他的工程中直接調(diào)用封裝好的IP核,這樣做可以大大降低我們的工作量。
- 在調(diào)用IP核時(shí),需要注意有的沒(méi)有接上的端口的值應(yīng)該如何設(shè)置。這時(shí)候就要考慮我們所設(shè)計(jì)的器件的邏輯特性,例如設(shè)計(jì)andgate時(shí),通過(guò)1 & A = A的布爾表達(dá)式得出,懸空端口設(shè)置值為1對(duì)結(jié)果不受影響,因此我們?cè)O(shè)置值為1。
- 通過(guò)本次實(shí)驗(yàn),了解到封裝 IP 核作用就是將一定的功能(例如加法,減法,邏輯運(yùn)算等)封裝起來(lái),之后可以直接運(yùn)用而不需要每次重新設(shè)計(jì)。
- 在封裝的時(shí)候發(fā)現(xiàn)不同的 IP 核在設(shè)置端口參數(shù)時(shí)驅(qū)動(dòng)值并不相同,注意到不同門(mén)電路的各個(gè)端口在 disable 時(shí)候的取值 Drivervalue 的設(shè)定,要用一個(gè)合理的值.
- vivado軟件本身的學(xué)習(xí)
開(kāi)發(fā)的基本流程:仿真、綜合、布線、生成比特流、導(dǎo)出到SDK、SDK導(dǎo)出到開(kāi)發(fā)板。想要一個(gè)程序在板子上運(yùn)行,需要硬件(因?yàn)槭莊pga)和軟件兩部分。
在硬件上,如何讓板子知道自己的電路被編成什么樣了呢?用的就是vivado導(dǎo)出的比特流。比特流是根據(jù)verliog代碼綜合、布線得出的。其中,綜合時(shí)把verliog代碼轉(zhuǎn)成硬件。布線,是把綜合出來(lái)的電路映射到開(kāi)發(fā)板上,想一下燒板子的思路。最后根據(jù)布線的結(jié)果生成比特流,硬件看見(jiàn)簡(jiǎn)單粗暴的比特流就知道自己應(yīng)該怎么燒了。
在軟件上,用到的是SDK軟件編程?;旧鲜蔷帉?xiě)c代碼的程序,然后SDK軟件給你編譯成mips,導(dǎo)出到板子上的arm的代碼區(qū)。就是往內(nèi)存里寫(xiě)匯編指令。
硬件部分稱(chēng)為PL部分,軟件部分稱(chēng)為PS部分。
vivado除了verliog文件外,還有一個(gè)叫約束的東西。約束就是指定你自定義的信號(hào)對(duì)應(yīng)到物理的哪個(gè)部分。比如有個(gè)信號(hào)a想控制led等亮,如何讓vivado知道a控制的是led呢?就要用約束文件,將led與a信號(hào)連接起來(lái)。這部分比較偏硬件,實(shí)驗(yàn)中基本用不上,可以跳過(guò)去。
vivado中編寫(xiě)verliog的方法除了徒手編程外,還有一個(gè)拖拽連線的方法,diagram。畫(huà)板就是把已經(jīng)編好的模塊擺到一起,然后將模塊間的線連好。加入system的過(guò)程也是在畫(huà)板上完成的。然后verliog可以自動(dòng)根據(jù)連線生成verliog代碼。
到了這里,關(guān)于VIVADO 工具與 Verilog 語(yǔ)言之與門(mén)IP核設(shè)計(jì)之多種基本門(mén)電路的IP核的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!