一、实验目的
1:熟悉Vivado的开发环境及开发流程,掌握Vivado中Verilog HDL文本输入设计方法,包括仿真、综合、实现与下载。熟悉Minisys开发板的功能和使用方法。
2:学会可配置IP核的设计与封装方法,深入理解与门逻辑。
二、实验环境
软件:Vivado 2015.4;
硬件:MINISYS-1开发板;
三、实验内容
3.1 拨码开关与LED灯(熟悉vivado和实验台)
1:创建项目
使用Vivado创建一个新项目,项目类型选择为RTL,不增加源文件、IP核、约束文件等,选择器件为xc7a100tfgg484-1,最后点击完成Finish。
2:添加源代码
添加设计文件,创建设计文件Ex_1,设置sw和led管脚数目及输入输出。将设计文件Ex_1中的源代码替换为实验指导中的代码,实现将拨码开关sw的内容赋值给led。管脚的相关设置和替换的代码如下图所示:
3:仿真
为了检查电路设计的正确性,添加仿真文件Ex_1_sim,将仿真文件Ex_1_sim中的源代码替换为实验指导中的代码,实现对Ex_1模块的例化,初始化sw=0,每隔10ns将sw加一。替换的代码如下图所示:
之后点击Run Similation,运行仿真文件Ex_1_sim,将仿真时间调整为10ns,仿真后得到波形图。该波形图上下相同,每隔10ns可以使sw的值自动加一。仿真的波形图如下图所示:
4:综合
点击Run Synthesis,运行综合情况。若无问题,则弹出窗口。窗口如下图所示:
5:管脚分配
点击Layout-I/O Planning,打开管脚分配表。将I/O Std这一列全部改为LVCMOS33,并点击site改变管脚分配。管脚分配表如下图所示:
设置完成后,按ctrl+s保存管脚设置,生成约束文件led_lights,完成后关闭综合设计窗口。
6:实现
点击Run Implementation,对设计进行实现,实现完成后弹出窗口。窗口如下图所示:
7:产生比特流文件并下载
在6中弹出的窗口处选择Generate Bitstream并确定,完成后弹出新窗口。新窗口如下图所示:
选择硬件管理界面并确认,点击open target。用USB下载线将电脑主机与Minisys开发板相连,同时将电源线连接开发板。之后选择xc7a100t_0,将比特流文件下载到开发板中。下载完成后,用拨码开关控制Minisys开发板,发现LED灯会随着对应的拨码开关的打开而点亮。
3.2 可配置输入端口数和数据宽度的与门IP核设计
1:创建并仿真andgate项目
创建一个andgate项目,在andgate.v文件中设置andgate模块。模块如下图所示:
建立仿真1位8输入的情况,在andgate_sim.v文件中设置andgate_sim模块。模块如下图所示:
按照3.1的方法进行仿真,获得仿真波形图。仿真波形图如下图所示:
在仿真文件中,我们将c、d、e、f、g、h这6个输入均设置为1,因此q会随着a、b输入的变化而变化。从仿真结果中可以发现,当a、b任意一个输入为0的时候,q的输出也为0,满足与门的逻辑。
2:测试32位与门
在andgate32_sim.v文件中设置andgate32_sim模块。模块如下图所示:
按照3.1的方法进行仿真,获得仿真波形图。仿真波形图如下图所示:
分析仿真结果后可知,实验具备正确性。
3:综合并封装IP核
仿真andgate模块并综合,之后设置IP并封装。IP的设计如下图所示:
添加IP核所支持的芯片家族,除了artix7以外全部选择,Life-circle选择Production。之后设置Port_Num参数、WIDTH参数等。再在端口存在栏中选择Optional,表明端口的存在有条件,在启动表达式编辑框中输入$Port_Num>2,表明当输入端口大于2的时候,c端口被启用。同理,设置d、f、g、h端口的参数。最终的设置结果如下图所示:
最后IP生成到CSE_CSE_andgate_1.0.zip压缩包中,完成IP核的封装。压缩包如下图所示:
四、问题回答
1:总结在可配置输入端口数和数据宽度的“与门”IP 核实验中遇到的问题和解决的方法。
问题:
1:在加入多个模拟文件后并点击run simulation的时候,会发生运行冲突。
2:在观察波形的时候,波形图点击全局观察后仍出现不符合预期的效果。
3:在MINISYS-1开发板上,发现加载比特流后,拨动开关后的LED显示结果与预期不符合。
解决方法:
1:查看.v文件的属性,将其中不需要模拟的文件的使能端Enable处取消勾选,再点击run simulation进行模拟。
2:在波形图处点击ctrl+鼠标中间键,对波形图进行人为的放大和缩小处理,直至符合预期为止。
3:重新对管脚进行分配,原实验指导中的表格有一定问题。
2:约束文件所起作用?
约束文件在Verilog中用于描述设计的物理限制和时序要求。它包含了时钟频率、时序延迟、输入输出时序、时钟分频等信息,以确保设计符合所需的输入输出特性。约束文件可以帮助避免时序冲突等问题,从而提高设计的稳定性和可靠性。
3:请用Verilog HDL实现一个8位全加器,提供源文件和仿真文件。
源文件代码为:
module full_adder_8bit(input [7:0] A, input [7:0] B, input cin, output [7:0] S, output cout);
wire [7:0] c;
assign c[0] = cin;
genvar i;
generate
for(i=0;i<8;i=i+1)
begin: adder
full_adder fa(A[i],B[i],c[i],S[i],c[i+1]);
end
endgenerate
assign cout = c[7];
endmodule
module full_adder(input a, input b, input cin, output s, output cout);
assign s = a ^ b ^ cin;
assign cout = (a & b) | (a & cin) | (b & cin);
endmodule
仿真文件代码为:
`timescale 1ns / 1ps
module full_adder_8bit_tb;
reg [7:0] A, B;
reg cin;
wire [7:0] S;
wire cout;
full_adder_8bit DUT(.A(A), .B(B), .cin(cin), .S(S), .cout(cout));
initial begin
// test case 1
A = 8'b00000000;
B = 8'b00000000;
cin = 0;
#10;
if (S !== 8'b00000000 || cout !== 0)
$error("Test case 1 failed!");
// test case 2
A = 8'b11111111;
B = 8'b00000001;
cin = 0;
#10;
if (S !== 8'b00000000 || cout !== 1)
$error("Test case 2 failed!");
// test case 3
A = 8'b00000000;
B = 8'b00000001;
cin = 1;
#10;
if (S !== 8'b00000001 || cout !== 0)
$error("Test case 3 failed!");
// test case 4
A = 8'b11111111;
B = 8'b11111111;
cin = 1;
#10;
if (S !== 8'b11111111 || cout !== 1)
$error("Test case 4 failed!");
$display("All test cases passed!");
$finish;
end
endmodule
仿真波形图如下所示:
由仿真波形图可知,四个测试案例均仿真正确,符合理论的实验结果。
五、实验总结
- 逻辑组合元件是数字电路中的一类元件,它们的输出仅取决于它们的输入,而与电路的时序状态无关。逻辑组合元件可以执行逻辑运算,例如与、或、非、异或等,用于处理二进制数据信号。逻辑组合元件的输出只有两种状态,通常表示为“0”和“1”,分别代表低电平和高电平。基本的逻辑组合元件有与门、非门、或门、或非门等。
- IP核封装时会显示路径,需要记住,便于后续进行查找。路径如下图所示:
开发板的LED显示情况如下图所示:- IP核(Intellectual Property core,知识产权核)是指在数字电路中常用的可重用的、预先设计好的、经过验证的电路模块,可以用于快速设计和实现数字电路系统。IP核通常由硬件描述语言(如Verilog、VHDL等)编写而成,可以直接在FPGA或ASIC芯片上实现。
- 在Verilog语言中,#100表示延迟100个时钟周期,即表示在当前模拟时钟周期后,延迟100个时钟周期,然后再执行下一条语句。通常用于在仿真过程中模拟延迟,以便更好地测试电路的行为。
- 在本实验中,创建IP核的方式如下:
——对仿真正确的模块进行综合
——弹出窗口后点击cancel
——点击Project Manager中的Project Settings
——对话框中选择IP,并进入Packager选项卡
——设置相关参数后点击Apply和OK
——在菜单栏的Tools中选择Create and Package IP
——在弹出窗口中设置封装选项,设置IP Location等
——依次在Package IP界面中进行封装设置,最后点击Review and Package中的Package IP按钮
——完成封装,点击路径查看