4.3 实例九 除法器设计(Robei工具)

4.3.1. 本章导读
要求掌握除法器原理,并根据原理设计除法器模块以及设计对应的测试模块,最后在 Robei可视化仿真软件经行功能实现和仿真验证。
设计原理
这个除法器的设计为传统除法器,因此十分简单,易懂:
(1)先取除数和被除数的正负关系,然后正值化被除数,由于需要递减的除数,所以除数应取负值和补码形式。
(2)被除数每一次递减,商数递增。
(3)直到被除数小于除数,递减过程剩下的是余数。
(4)输出的结果根据除数和被除数的正负关系。
下图4-3-1显示除法器模块的设计:

4.3.2. 设计流程

1. divider模型设计

(1)新建一个模型命名为divider,类型为module,同时具备5输入3输出,每个引脚的属性和名称参照下图4-3-2经行对应的修改。


(2)添加代码。点击模型下方的 Code添加代码。
代码:
reg[3:0] i;
reg[7:0] dsor;
reg[7:0] rd;
reg[7:0] dend;
reg[7:0] qent;
reg isneg;
reg isdone;

always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
i<=4’d0;
dend<=8’d0;
dsor<=8’d0;
rd<=8’d0;
qent<=8’d0;
isneg<=1’b0;
isdone<=1’b0;
end
else if(start_sig)
case(i)
0: begin
dend<=dividend[7]?~dividend+1:dividend;
dsor<=divisor[7]?~divisor+1:divisor;
rd<=divisor[7]?divisor:(~divisor+1);
isneg<=dividend[7]^divisor[7];
qent<=8’d0;
i<=i+1;
end
1: begin
if(dend<dsor)
begin
qent<=isneg?(~qent+1):qent;
i<=i+1;
end
else
begin
dend<=dend+rd;
qent<=qent+1;
end
end
2:begin
isdone<=1’b1;
i<=i+1;
end
3:begin
isdone<=1’b0;
i<=4’d0;
end
endcase

assign done_sig=isdone;
assign quotient=qent;
assign remainder=dend;

(3)保存模型到一个文件夹(文件夹路径不能有空格和中文)中,运行并检查有无错误。

2. divider_test测试文件的设计

(1)新建一个5输入3输出的divider_test测试文件,将Module Type设置为“testbench”,各个引脚配置如图4-3-4所示。

(2)另存为测试文件。将测试文件保存到上面创建的模型所在的文件夹下。
(3)加入模型。在Toolbox工具箱的Current栏里,会出现模型,单击该模型并在divider _test上添加,并连接引脚,如下图4-3-5所示:

(4)输入激励。点击测试模块下方的“Code”,输入激励算法。激励代码在结束的时候要用$finish 结束。
测试代码:
initial
begin
clk=1’b0;
rst_n=1’b0;
#10 rst_n=1’b1;
#1000 $finish;
end
always #5 clk=~clk;
reg[3:0] i;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
dividend<=8’d0;
divisor<=8’d0;
start_sig<=1’b0;
i<=1’b0;
end
else
begin
case(i)
0:if(done_sig)
begin
start_sig<=1’b0;
i<=i+1;
end
else
begin
dividend<=8’d9;
divisor<=8’d3;
start_sig<=1’b1;
end
1:if(done_sig)
begin
start_sig<=1’b0;
i<=i+1;
end
else
begin
dividend<=8’d3;
divisor<=8’d9;
start_sig<=1’b1;
end
2:if(done_sig)
begin
start_sig<=1’b0;
i<=i+1;
end
else
begin
dividend<=8’d8;
divisor<=8’d2;
start_sig<=1’b1;
end
3:if(done_sig)
begin
start_sig<=1’b0;
i<=i+1;
end
else
begin
dividend<=8’d8;
divisor<=8’d4;
start_sig<=1’b1;
end
4:if(done_sig)
begin
start_sig<=1’b0;
i<=i+1;
end
else
begin
dividend<=8’d8;
divisor<=8’d3;
start_sig<=1’b1;
end
5:i<=4’d5;
endcase
end
end

(5)执行仿真并查看波形。查看输出信息。检查没有错误之后查看波形。
点击右侧 Workspace 中的信号,进行添加并查看分析仿真结果。如图4-3-6所示:

3. divider_constrain约束文件的设计

由于开发板硬件资源限制,我们在后端设计中把除法器的dividend和divisor由8位改为4位,以达到更直观的验证效果。
(1)新建一个模块,命名为divider_constrain,具备11个输入和9个输出。
(2)把约束模块保存到和设计的divider模块同一个目录下,先打开divider模块把dividend,divisor,quotient,remainder数据长度都改成4位,保存并执行,之后通过鼠标左键单击把divider模块添加进约束模块。
(3)连线:分别把divider模块的clk,rst_n,start_sig和约束模块的一个输入端相连;把divider模块的dividend,divisor分别和约束模块的四个输入端相连;然后把divider模块的输出done_sig和约束模块的一个输出端相连,把quotient,remainder和约束模块的4个输出端相连。
(4)修改约束模块的端口名称和连线名称。约束模块的端口名称即分配到开发板上的硬件引脚。本次设计中使用的引脚如下:
clk对应开发板开关G15;
rst_n对应开发板开关P15;
start_sig对应开发板开关W13;
dividend[0],dividend[1],dividend[2],dividend[3]分别对应V13,U17,T17,Y17;
divisor[0],divisor[1],divisor[2],divisor[3]分别对应V12,W16,J15,H15;
done_sig对应开发板LED灯M14;
quotient[0],quotient[1],quotient[2],quotient[3]分别对应U14,U15,V17,V18;
remainder[0],remainder[1],remainder[2],remainder[3]分别对应T14,T15,P14,R14;
修改完端口名称后,记得修改对应divident,divisor,quotient,remainder的连线名称分别为0,1,2,3。完成修改后的模块图如图4-3-7所示。

(5)保存并运行,如果看到显示“Generate constrain file complete”字样,说明约束文件已经成功生成,同样也可以点击View->CodeView来查看代码。

4.3.3. 板级验证

为了测试所设计divider的工作特性,需选择搭载XILINX公司的Z-7010芯片的开发板,所以选用VIVADO设计平台进行Synthesis、Implementation和Generate Bitstream,最终将生成的数据流文件下载到开发板内,并进行验证。

1. VIVADO设计平台进行后端设计

1.1启动Vivado软件并选择设备XC7Z010CLG400-1作为硬件对象,设计语言选用Verilog,建立新的工程,添加通过Robei设计的文件divider.v。
(1)打开Vivado,选择开始>所有程序>Xilinx Design Tools> Vivado2013.4> Vivado2013.4;
(2)单击创建新项目Create New Project启动向导。你将看到创建一个新的Vivado项目对话框,单击Next;
(3)在弹出的对话框中输入工程名divider及工程保存的位置,并确保Create project subdirectory复选框被选中,单击Next;

(4)选择项目类型表单的RTL Project选项,不要勾选Do not specify sources at this time复选框,然后单击Next;
(5)使用下拉按钮,选中Verilog作为目标文件和仿真语言;
(6)点击添加Add Files按钮,浏览到刚刚我们Robei项目的目录下打开Verilog文件夹,选择divider.v,单击Open,然后单击Next去添加现有的IP模型;
(7)由于我们没有任何的IP添加,跳过这一步,单击Next去添加约束形成;
(8)点击添加Add Files按钮,浏览到刚刚设计的目录下找到constrain文件夹,选择其中的divider_constrain.xdc文件,单击open完成添加;
(9)在默认窗口中,按照图4-3-13所示设置Filer中的选项,然后在Parts中选择XC7Z010CLG400-1,单击Next;
(10)单击Finish,本Vivado项目创建成功。


1.2打开divider_constrain.xdc文件,可以查看引脚约束源代码。
(1)在资源窗口sources中,展开约束文件夹,然后双击打开divider_constrain.xdc进入文本编辑模式;

(2)Xilinx设计约束文件分配FPGA位于主板上的开关和指示灯的物理IO地址,这些信息可以通过主板的原理图或电路板的用户手册来获得。
本次设计的约束文件代码是通过Robei软件自动生成,但是,Robei软件目前生成的约束代码只有对输入输出端口的分配,在这个设计中,我们使用了一个通过开关控制的模拟时钟clk,而非系统时钟,这种电路在综合的时候一般都会报错,所以,在约束文件最后,我们需要手动添加一句命令:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]
来保证流程中不会出错。
完整的约束代码如下:
#This file is generated by Robei!
#Pin Assignment for Xilinx FPGA with Software Vivado.
set_property PACKAGE_PIN G15 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN P15 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN M14 [get_ports done_sig]
set_property IOSTANDARD LVCMOS33 [get_ports done_sig]
set_property PACKAGE_PIN V12 [get_ports divisor[0]]
set_property IOSTANDARD LVCMOS33 [get_ports divisor[0]]
set_property PACKAGE_PIN W16 [get_ports divisor[1]]
set_property IOSTANDARD LVCMOS33 [get_ports divisor[1]]
set_property PACKAGE_PIN J15 [get_ports divisor[2]]
set_property IOSTANDARD LVCMOS33 [get_ports divisor[2]]
set_property PACKAGE_PIN H15 [get_ports divisor[3]]
set_property IOSTANDARD LVCMOS33 [get_ports divisor[3]]
set_property PACKAGE_PIN V13 [get_ports dividend[0]]
set_property IOSTANDARD LVCMOS33 [get_ports dividend[0]]
set_property PACKAGE_PIN U17 [get_ports dividend[1]]
set_property IOSTANDARD LVCMOS33 [get_ports dividend[1]]
set_property PACKAGE_PIN T17 [get_ports dividend[2]]
set_property IOSTANDARD LVCMOS33 [get_ports dividend[2]]
set_property PACKAGE_PIN Y17 [get_ports dividend[3]]
set_property IOSTANDARD LVCMOS33 [get_ports dividend[3]]
set_property PACKAGE_PIN T14 [get_ports {remainder[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports remainder[0]]
set_property PACKAGE_PIN T15 [get_ports remainder[1]]
set_property IOSTANDARD LVCMOS33 [get_ports remainder[1]]
set_property PACKAGE_PIN P14 [get_ports remainder[2]]
set_property IOSTANDARD LVCMOS33 [get_ports remainder[2]]
set_property PACKAGE_PIN R14 [get_ports remainder[3]]
set_property IOSTANDARD LVCMOS33 [get_ports remainder[3]]
set_property PACKAGE_PIN U14 [get_ports quotient[0]]
set_property IOSTANDARD LVCMOS33 [get_ports quotient[0]]
set_property PACKAGE_PIN U15 [get_ports quotient[1]]
set_property IOSTANDARD LVCMOS33 [get_ports quotient[1]]
set_property PACKAGE_PIN V17 [get_ports quotient[2]]
set_property IOSTANDARD LVCMOS33 [get_ports quotient[2]]
set_property PACKAGE_PIN V18 [get_ports quotient[3]]
set_property IOSTANDARD LVCMOS33 [get_ports quotient[3]]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]

(3)点击File—>Save File保存文件。
1.3使用Vivado综合工具来综合设计,并进行Implementation任务实现。
(1)单击综合任务下拉菜单中的Run Synthesis,综合过程将会在divider.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)这一过程将已经生成的divider.bit文件放在divider.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-3-19所示。还要注意,该状态表明它还没有被编程;

(11)在器件上单击鼠标右键,选择Program device或单击窗口上方弹出的Program device-> XC7z010_1链接到目标FPGA器件进行编程;

(12)单击确定对FPGA进行编程。开发板上Done指示灯亮时,器件编程结束;
(13)通过控制拨动和按键开关的开闭来观察LED(请参考前面的逻辑图)验证输出结果。

2. 开发板验证

首先,将rst_n(SW1)复位开关拨之低电平,再来回拨动1至2次clk(BTNC)按键,进行复位操作,之后将rst_n拨至高电平;
然后,设置被除数和除数值,这里选择被除数为6,除数为2进行验证;
除数SW74,被除数SW30,商LD30,余数LD74。
最后,每次按一下clk时钟键,给一个上升沿,程序进行一次运算。第一次上升沿后,quotient为0,reminder为6,故LD7~0的显示为00000110;第二次上升沿后,quotient为1,reminder为4,故LD7~0的显示为00010100;第三次上升沿后,quotient为2,reminder为2,故LD7~0的显示为00100010;第四次上升沿后,quotient为3,reminder为0,故LD7~0的显示为00110000,此时计算结束,done_sig亮起,经验证该除法器本次运算无误。

重复以上步骤,设置不同的被除数和除数值进行多方位验证,通过验证结果证明该除法器符合设计的要求。

4.3.4. 问题与思考

挑战题:读者们可能发现以上设计的除法器每一次运算消耗的时钟不一致,当除数的数量越大,它消耗的时钟的就越大,所以下面请读者们上网搜索循环式除法器的资料,并以循环式除法器的算法设计一个运算过程消耗时钟一致的循环式除法器。

实例九— 除法器设计相关推荐

  1. (89)FPGA除法器设计

    (89)FPGA除法器设计 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA除法器设计 5)技术交流 6)参考资料 2 FPGA入门与提升课程介绍 1)FPG ...

  2. verilog除法器设计

    除法器原理 和十进制除法类似,计算 27 除以 5 的过程如下所示: 除法运算过程如下: (1) 取被除数的高几位数据,位宽和除数相同(实例中是 3bit 数据). (2) 将被除数高位数据与除数作比 ...

  3. Verilog 除法器设计(包含单步设计和流水线设计)

    Verilog 除法器设计(包含单步设计和流水线设计) 1 除法器原理(定点) 2 除法器设计 2.1 单步运算设计 2.2 流水级例化 1 除法器原理(定点) 和十进制除法类似,计算 27 除以 5 ...

  4. WF4.0 基础篇 (三) 流程实例WorkflowApplication与设计WF程序的基本原则

    通过本节,可以初步了解WF程序的特性,为以后的WF类应用开发提供一个初步的感性认识 目录 1    流程实例WorkflowApplication与设计WF程序的基本原则    1 1.1    流程 ...

  5. 实例:如何设计一款好的Metro UI应用

    据说 Windows Phone 标志性 Metro UI 的灵感最初来源于伦敦地铁指示图的设计,而这也是 "Metro" 这个名称的来历.从其对明亮色彩的广泛应用.以简单方块形式 ...

  6. ENSP配置 实例九 动态Nat配置

    ENSP配置 实例九 动态Nat配置 sy [Huawei]sy R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 ...

  7. FPGA系统性学习笔记连载_Day8【4位乘法器、4位除法器设计】 【原理及verilog实现、仿真】篇

    FPGA系统性学习笔记连载_Day8[4位乘法器.4位除法器设计] [原理及verilog实现.仿真]篇 连载<叁芯智能fpga设计与研发-第8天> [4位乘法器.4位除法器设计] [原理 ...

  8. 基于FPGA的除法器设计

    用FPGA写代码时候,尽量不用"/",因为其占用大量逻辑资源.所以有必要来设计一款除法器,使其不占用那么多逻辑资源,并且所用时钟数能够满足约束要求.(减弱空间复杂度.增加时间复杂度 ...

  9. 建筑造型的九大设计手法,建筑人必知

    九种设计手法超脱绝美案例 中融建筑设计小编带你聊聊那些令人惊叹的建筑造型设计 一.切角 切掉建筑立面的一个角,可以呈现出不规则的体量感,增加形式的趣味性 二.穿插 穿插是一种相交的形态,因对象,部位, ...

最新文章

  1. 关于百度分享——bdCustomStyle一点bug
  2. Xamarin XAML语言教程对象元素的声明方式
  3. OD调试9—实例:深入分析代码完成软件破解
  4. Dynamic AX ERP 4.0 数据导出(上)
  5. 用钱生钱,从掌握金钱的规律开始
  6. JavaWeb基础—JS学习小结
  7. 罗伯特·帕丁森Robert Pattinson(2)
  8. 《那些年啊,那些事——一个程序员的奋斗史》——49
  9. 从集合大小的定义到数学结构-解决了多年的疑惑
  10. linux软链接和硬链接的区别
  11. 刀下留人--苹果开发者账号封号前挽救
  12. 全国计算机三级网络技术题库南开,计算机三级上机:适用于三级网络技术、数据库等(南开100题)...
  13. 计算组合数的三种方式
  14. 96 不同得二叉搜索树 明安图法 动态规划法
  15. 专题详解-5G接入控制:CAG新特性(3)-end
  16. FireShot在windows2000上安装的问题
  17. js删除对象空属性值的方法
  18. 只要你懂得人性,就不怕没钱赚!
  19. css好看常用的中文字体
  20. 美国计算机加音乐专业,史上最全的美国大学音乐学院专业解析

热门文章

  1. 彻底搞懂数据库中的超码,候选码,主码,主属性,非主属性,全码的区别
  2. maven的下载安装与卸载
  3. 指针的类型和指针所指向的类型
  4. python123判断ip地址合法性_判断IP地址的合法性
  5. win11下MSVC++ 6.0无法启动问题
  6. Nginx的配置及原理
  7. shell 语句出错自动退出
  8. 【蓝桥杯】 阶乘约数:定义n的阶乘= 1 × 2 × 3 × · · · × n。 请问100 的阶乘有多少个约数。
  9. C语言求三个数的中间值(三目运算符)
  10. 关于小程序如何长按复制长文本的方法(比较简单的一种)