实例八 带符号位小数的加法设计

4.2.1. 本章导读

设计目的
设计一个带符号位的小数加法器,该加数和被加数的总位数为32位,其中小数15位,整数占16位,剩下一位符号位。设计该加法器模块以及设计testbench,最后在Robei可视化仿真软件进行功能实现和仿真验证。
设计原理
输入数据的最高位是符号位,其余的位数是数值位。首先通过比较两个输入数据的符号位判断输出数据的符号位:比如输入都是正数则结果一定是正数,输入都是负数则结果一定是负数,输入一正一负的话则比较两个数据的数值大小进行判定。
然后对两个数据的数值位进行计算,得到输出数据的数值位,最后给输出数据添加符号位完成全部运算。
模型格式:sum = addend + addend
输入格式:
|1| <- N-Q-1 bits -> | <— Q bits --> |
|S| IIIIIIIIIIIIIIII |FFFFFFFFFFFFFFF|
输入数据:
a - addend 1 b - addend 2
输出格式:
|1| <- N-Q-1 bits -> | <— Q bits --> |
|S| IIIIIIIIIIIIIIII |FFFFFFFFFFFFFFF|
输出数据:
c - result
实例八— 带符号位小数的加法设计

4.2.2. 设计流程

1. qadd模型设计

(1)新建一个模型命名为qadd,类型为module,同时具备2个输入和1个输出,每个引脚的属性和名称参照下图4-2-2进行对应的修改。
实例八— 带符号位小数的加法设计
实例八— 带符号位小数的加法设计
(2)添加代码。点击模型下方的 Code添加代码。
代码如下:
parameter N = 4;
reg [N-1:0] res;
assign c = res;
always @(a or b)
begin
if(a[N-1] == b[N-1])
begin
res[N-2:0] = a[N-2:0] + b[N-2:0];
res[N-1] = a[N-1];
end
else if(a[N-1] == 0 && b[N-1] == 1)
begin
if( a[N-2:0] > b[N-2:0] )
begin
res[N-2:0] = a[N-2:0] - b[N-2:0];
res[N-1] = 0;
end
else
begin
res[N-2:0] = b[N-2:0] - a[N-2:0];
if (res[N-2:0] == 0)
res[N-1] = 0;
else
res[N-1] = 1;
end
end
else
begin
if( a[N-2:0] > b[N-2:0] )
begin
res[N-2:0] = a[N-2:0] - b[N-2:0];
if (res[N-2:0] == 0)
res[N-1] = 0;
else
res[N-1] = 1;
end
else
begin
res[N-2:0] = b[N-2:0] - a[N-2:0];
res[N-1] = 0;
end
end
end

2. qadd_test测试文件的设计

(1)新建一个2输入1输出的qadd_test测试文件,记得将Module Type设置为 “testbench”,各个引脚配置如图4-2-4所示。
实例八— 带符号位小数的加法设计
(2)另存为测试文件。将测试文件保存到上面创建的模型所在的文件夹下。
(3)加入模型。在Toolbox工具箱的Current栏里,会出现模型,单击该模型并在 qadd _test上添加,并连接引脚,如下图4-2-5所示:
实例八— 带符号位小数的加法设计
(4)输入激励代码。点击测试模块下方的“Code”,输入激励算法。激励代码在结束的时候要用$finish结束。(由于在验证功能的时候,有无小数点并没有本质上的区别,故在验证时使用了两个4位二进制数,最高位为符号位)
激励代码:
initial begin
a = 4’b0001;
b = 4’b0011;
#10
a = 4’b1011;
b = 4’b1011;
#10
a = 4’b0001;
b = 4’b1101;
#10
a = 4’b1110;
b = 4’b0011;
#10
$finish;
end

(5)执行仿真并查看波形。查看输出信息。检查没有错误之后查看波形。
点击右侧 Workspace 中的信号,进行添加并查看分析仿真结果。如图4-2-6所示:
实例八— 带符号位小数的加法设计

3. 约束模块和约束文件设计

(1)新建一个模块,模块类型选择为constrain,具有8个输入和4个输出。(因为设计的模块有两个4位的输入端和一个4位的输出端)
实例八— 带符号位小数的加法设计
(2)连线。将4个输入与输入a相连,再将另外4个输入与b相连。4个输出则全部与模块的输出c相连。
(3)修改约束模块端口和连接线的名称。由于本设计需要使用的硬件资源较多,因此使用了一些外接的开关和LED灯。这些硬件在开发板上对应的引脚如下:
a[0],a[1],a[2],a[3]分别对应的引脚为V12,W16,J15,H15;
b[0],b[1],b[2],b[3]分别对应的引脚为V13,U17,T17,Y17;
c[0],c[1],c[2],c[3]分别对应的引脚为T14,T15,P14,R14;
修改完端口名称后记得把对应的连接线名称修改为0,1,2,3。修改后的约束模块如图4-2-8所示:
实例八— 带符号位小数的加法设计
(4)保存并运行,如果没有错误,即可在目录下的constrain文件夹里找到生成的xdc约束文件。可以通过View->CodeView查看约束文件的代码。

4.2.3. 板级验证

1. VIVADO设计平台进行后端设计
1.1启动Vivado软件并选择设备XC7Z010CLG400-1作为硬件对象,设计语言选用Verilog,建立新的工程,添加通过Robei设计的文件qadd.v。
(1)打开Vivado,选择开始>所有程序>Xilinx Design Tools> Vivado2013.4> Vivado2013.4;
(2)单击创建新项目Create New Project启动向导。
(3)在弹出的对话框中输入工程名qadd及工程保存的位置,并确保Create project subdirectory复选框被选中,单击Next;
实例八— 带符号位小数的加法设计
(4)选择项目类型表单的RTL Project选项,不要勾选Do not specify sources at this time复选框以便添加源文件,然后单击Next;
(5)使用下拉按钮,选中Verilog作为目标文件和仿真语言;
(6)点击添加Add Files按钮,浏览到刚刚我们Robei项目的目录下打开Verilog文件夹,选择qadd.v,单击Open,然后单击Next去添加现有的IP模型;
(7)由于我们没有任何的IP添加,单击Next去添加约束形成;
(8)在添加约束文件界面,点击Add Files,找到并选择刚才生成的constrain文件夹下的qadd_constrain.xdc文件,并点击确定;
(9)在器件选择窗口中,按照图4-2-14所示设置Filer中的选项,然后在Parts 中选择XC7Z010CLG400-1,单击Next;
(10)单击Finish,本Vivado项目创建成功。
实例八— 带符号位小数的加法设计
实例八— 带符号位小数的加法设计

1.2打开qadd_constrain.xdc文件,查看引脚约束源代码。

(1)在资源窗口sources中,展开约束文件夹,然后双击打开qadd_constrain.xdc进入文本编辑模式;
实例八— 带符号位小数的加法设计
(2)这个设计中的xdc文件是Robei软件自动生成的,我们以编辑的方式打开这个约束文件后,可以检查一下这里的代码是否和我们希望的约束文件一致。
qadd_constrain.xdc约束文件代码如下:

#This file is generated by Robei!
#Pin Assignment for Xilinx FPGA with Software Vivado.
set_property PACKAGE_PIN V12 [get_ports a[0]]
set_property IOSTANDARD LVCMOS33 [get_ports a[0]]
set_property PACKAGE_PIN W16 [get_ports a[1]]
set_property IOSTANDARD LVCMOS33 [get_ports a[1]]
set_property PACKAGE_PIN J15 [get_ports a[2]]
set_property IOSTANDARD LVCMOS33 [get_ports a[2]]
set_property PACKAGE_PIN H15 [get_ports a[3]]
set_property IOSTANDARD LVCMOS33 [get_ports a[3]]
set_property PACKAGE_PIN V13 [get_ports b[0]]
set_property IOSTANDARD LVCMOS33 [get_ports b[0]]
set_property PACKAGE_PIN U17 [get_ports b[1]]
set_property IOSTANDARD LVCMOS33 [get_ports b[1]]
set_property PACKAGE_PIN T17 [get_ports b[2]]
set_property IOSTANDARD LVCMOS33 [get_ports b[2]]
set_property PACKAGE_PIN Y17 [get_ports b[3]]
set_property IOSTANDARD LVCMOS33 [get_ports b[3]]
set_property PACKAGE_PIN T14 [get_ports c[0]]
set_property IOSTANDARD LVCMOS33 [get_ports c[0]]
set_property PACKAGE_PIN T15 [get_ports c[1]]
set_property IOSTANDARD LVCMOS33 [get_ports c[1]]
set_property PACKAGE_PIN P14 [get_ports c[2]]
set_property IOSTANDARD LVCMOS33 [get_ports c[2]]
set_property PACKAGE_PIN R14 [get_ports c[3]]
set_property IOSTANDARD LVCMOS33 [get_ports c[3]]

(3)点击File—>Save File保存文件。
1.3使用Vivado综合工具来综合设计,并进行Implementation任务实现。
(1)单击综合任务下拉菜单中的Run Synthesis,综合过程会分析qadd.v文件并生成网表文件。当综合过程完成了,且没有错误信息,将会弹出带有三个选项的完成对话框;
(2)如果有错误,根据错误信息提示修改,直至综合没有错误。然后选择Run Implementation选项,执行任务实现,然后单击OK;
(3)任务实现过程将在综合后的设计上运行。当这个过程完成,且没有错误信息,将会弹出带有三个选项的任务实现完成对话框;
(4)如果有错误,根据错误信息提示修改,直至综合没有错误。
1.4将开发板上的电源开关拨到ON,生成比特流并打开硬件会话,对FPGA进行编程。
(1)确保微型USB电缆连接到PROG UART接口;
(2)确保JP7设置为USB提供电源;
(3)接通电源板上的开关;
(4)点击任务实现完成弹出的对话框中Generate Bitstream或者点击导航窗口中编程和调试任务中的Generate Bitstream。比特流生成过程将在任务实现设计后运行。当完成比特流生成后会弹出有三个选项的完成对话框;
(5)这一过程将已经生成的qadd.bit文件放在qadd.runs目录下的impl_1目录下;
(6)选择打开硬件管理器Open Hardware Manager选项,然后单击确定。硬件管理器窗口将打开并显示“未连接”状态;
(7)点击Open a new hardware target。如果之前已经配置过开发板你也可以点击最近打开目标链接Open recent target;
实例八— 带符号位小数的加法设计
(8)单击Next看Vivado自定义搜索引擎服务器名称的形式;
(9)单击Next以选择本地主机端口;
实例八— 带符号位小数的加法设计
(10)单击两次Next,然后单击Finish。未连接硬件会话状态更改为服务器名称并且器件被高亮显示,如图4-2-20所示。还要注意,该状态表明它还没有被编程;
实例八— 带符号位小数的加法设计
(11)选择器件,并验证qadd.bit被选为常规选项卡中的程序文件;
实例八— 带符号位小数的加法设计
(12)在器件上单击鼠标右键,选择Program device或单击窗口上方弹出的Program device-> XC7z010_1链接到目标FPGA器件进行编程;
实例八— 带符号位小数的加法设计
(13)单击确定对FPGA进行编程。 开发板上Done指示灯亮时,器件编程结束;
(14)通过控制拨动和按键开关的开闭来观察LED(请参考前面的逻辑图)验证输出结果。

2. 开发板验证

如图4-2-23所示,这里使用了一个焊接着开关和LED灯的开关板电路提供额外的硬件资源,通过杜邦线将开关板电路上的资源和开发板相连。
本次验证中,使用下排后两个四刀开关分别作为a和b的值,这里和Xilinx Z7010开发板上开关不同之处在于此处的开关拨上为0,拨下为1。紧贴开关的那一排LED灯的右边四位作为输出c,点亮表示输出1,不亮即输出0。
实例八— 带符号位小数的加法设计
分别将a,b设置为
a = 0001,b = 0011;
a = 0001,b = 0011;
a = 0001,b = 0011;
a = 0001,b = 0011;
然后将得到的结果c与预期的结果相比较,经验证,该带符号位加法器运算无误。
实例八— 带符号位小数的加法设计

4.2.4. 问题与思考

1.该模型最大可以计算的位数在十进制下是多少位?
2.如何改进模型,使之有溢出的检测?

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-12
  • 2021-06-03
  • 2021-08-31
猜你喜欢
  • 2022-12-23
  • 2022-02-08
  • 2021-06-13
  • 2021-12-18
  • 2022-12-23
  • 2021-12-23
  • 2022-12-23
相关资源
相似解决方案