基于Verilog HDL整数乘法器设计与仿真验证

基于Verilog HDL整数乘法器设计与仿真验证

1.预备知识

整数分为短整数,中整数,长整数,本文只涉及到短整数。短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为0表示为正数),取值范围为-127~127。

负数的表示方法为正值的求反又加1。例如:

8’b0000_0100; //表示值:4,正值求反为:8’b1111_1011;再加1表示为:8’b1111_1100,这样便得到了-4的表示方法为:8’b1111_1100。

同理,负值变成正值的方法为:负值求反又加1。

2.设计思路

怎样判断一个短整数是正值还是负值?

利用一个数的最高位,if(!A[7])  //A是正值;if(B[7]) //B是负值。

在乘法运算中,运算结果的符号可以通过异或运算得到。


A值


B值


结果


正(0)


正(0)


正(0)


正(0)


负(1)


负(1)


负(1)


正(0)


负(1)


负(1)


负(1)


正(0)

3.乘法器程序设计思路

首先考虑输入信号量,有乘数与被乘数,有一个开始指令(Start_Sig),相当于我们在计算器中输入完计算式子之后,再按下一个“=”号,得到最终的结果。

再考虑输出信号量,有计算结果,同时在计算结果出来后,输出一个运算完成信号(Done_Sig)。

乘法运算的Verilog HDL程序实现:以8X5来举例,其中8是被乘数,5是乘数,表示的含义是5个8相加。乘法运算可以拆分成三个步骤来实现:

在运算前,取得乘数和被乘数的符号位,然后取被乘数和乘数的正值。

isNeg <= Multiplicand[7]^Multiplier[7];

Mcand <= Multiplicand[7]?(~Multiplicand+1’b1):Multiplicand;

Mer <= Multiplier[7]?(~Multiplier+1’b1):Multiplier;

4.基于ModelSim的乘法器仿真验证

本文将详细描述ModelSim的配置过程,方便以后查阅。

(1)首先建立乘法器的模型,编辑好Verilog HDL程序(学习重点)

  (2)关联Quartus与Modelsim-Altera

Tools ---- Options ---- EDA Tool Options,选择仿真工具,并添加仿真工具的安装路径。本文选用的Modelsim-Altera。

(3)设置仿真工具与需要仿真的文本格式,Time Scale。

Assignments ---- Settings ---- Simulation

Tool name:

Format for output netlist:

Time scale:

Output directory:为默认设置

   (4)自动生成Test bench模板

Processing ---- Start ---- Start Test Bench Template writer,操作完成后,自动生成Test bench。

打开Test Bench文件,在整个工程文件中会生成一个simulation文件夹,打开,找到里面的“XXX.vt”文件。

   (5)编辑Test bench文件

按照模板文件中的注释,填充相应的测试程序即可。(里面有大学问)

     在测试文件中,有一个初始化模块,一般用来初始化时钟信号(CLK)和复位整个电路(RSTn)。

结合“#num”这一参数的变化,与仿真波形的对比,可以得出“#num”是用来设定时间的语句。

首先谈谈乘法器的工作原理:首先输入乘数与被乘数,当Start_Sig信号置高电平,乘法器开始工作,按照预先写好的模型一步一步运算完后,Done_Sig输出高电平,代表运算完成,得出运算结果输出到Product上。

    1.Start_Sig由0跳变到1,乘法器开始运算(相当于计算器上的等号按钮),此时乘数与被乘数输入端口已经有数值,Done_Sig处于st0状态,代表还未完成计算。

     2.计算完了乘法的第一步,输出Product上已经有第一步的运算结果了,但是Done_Sig信号还是保持st0状态,代表计算还未结

    3.第二步运算完成,结果输出到了Product信号线上,但是Done_Sig信号还是保持st0,乘法器还在继续工作。

     4.Done_Sig信号线由st0跳变为st1,并持续一个脉冲周期,此刻表示乘法器完成计算,Product信号线上的数据即为乘法运算的最终结果。

    5.Done_Sig状态又恢复到st0,此刻Start_Sig信号由1变为0,代表乘法器关闭,停止工作,always块语句里面的乘法算法将不再执行。

 

(6)将编辑好的Test bench文件添加到工程中

Assignments ---- Settings ---- Simulation

选择 Compile test bench选项,单击“...”

New ----

需要填充如下内容:

Test bench name:就是testbench文件的名字,即“.vt”文件的文件名。

Top level module in test bench:就是testbench文件的顶层模块名。

End simulation at:就是仿真最大的时间。

在Test bench files面板中添加Test bench文件,单击“...”找到“.vt”文件的路径,单击add即可,最后单击OK。

    单击OK。

   单击Apply,单击OK。

(7)开始仿真

Tools ---- Run EDA Simulation Tool ---- EDA RTL Simulation

自动启动ModelSim程序,即可以看到仿真波形。

时间: 2024-10-24 20:47:42

基于Verilog HDL整数乘法器设计与仿真验证的相关文章

第三章 Verilog HDL的模块化设计和描述方法

一.模块申明 verilog HDL设计以模块为基础,以关键字module开始,以endmodule结束,其格式如下: 二.模块例化 对于模块例化(实例调用)的时候,需要将两个端口的信号连接起来,在Verilog HDL中有两种方法进行端口连接:顺序连接和名称连接.这两种连接方式只可单独使用,不可混合使用. 1.顺序连接 需要连接到模块实例的信号必须和模块声明时的目标端口列表中的位置保持一致. 2.名称连接法 原文地址:https://www.cnblogs.com/guojun-junguo/

paper:基于verilog HDL 的高速可综合FSM设计

1.寄存器输出型状态机 VS 组合逻辑输出型状态机 2.状态编码方法 这块讲的不好,也比较少. 3.系统设计中模块划分的指导性原则

基于Verilog HDL的二进制转BCD码实现

在项目设计中,经常需要显示一些数值,比如温湿度,时间等等.在数字电路中数据都是用二进制的形式存储,要想显示就需要进行转换,对于一个两位的数值,对10取除可以得到其十位的数值,对10取余可以得到个位的数值.对于Verilog来说它的标准是支持除法和取余运算的,综合器也会有IP可以进行除法运算.但是这样未免会耗费太多资源,使用移位加3算法就可以实现二进制到BCD码之间的转换. BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码.用4位二进制数来表示1位十进制数中的

基于Verilog的奇数偶数小数分频器设计

今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然连上我只有两个人,但丝毫不影响我们的工作热情和创业野心.合抱之木,生于毫末:九层之台,起于垒土:千里之行,始于足下! 首先小编在这里分享一个基于Verilog语言的分频器设计,该分频器实现了奇数.偶数.小数(0.5)分频,可综合,能跑700M左右的时钟,基本能够满足大部分应用需求. 一:背景 前天,

【黑金教程笔记之003】【建模篇】akuei2的Verilog hdl心路

Verilog hdl不是“编程”是“建模” Verilog hdl语言是一种富有“形状”的语言. 如果着手以“建模”去理解Verilog hdl语言,以“形状”去完成Verilog hdl语言的设计.在感觉上Verilog hdl + FPGA是“可所触及”,是一种“实实在在”的感觉,不相等于“编程”时的那种“抽象感”. “低级建模”最基本最简单之意,建模习惯or风格.

Verilog HDL设计进阶:有限状态机的设计原理及其代码风格_zt

http://www.21ic.com/app/eda/201308/189781_1.htm 由于Verilog HDL和 VHDL 行为描述用于综合的历史还只有短短的几年,可综合风格的Verilog HDL 和VHDL的语法只是它们各自语言的一个子集.又由于HDL的可综合性研究近年来非常活跃,可综合子集的国际标准目前尚未最后形成,因此各厂商的综合器所支持的HDL子集也略有所不同. 本书中有关可综合风格的Verilog HDL的内容,我们只着重介绍RTL级.算法级和门级逻辑结构的描述,而系统级

[Verilog]任意整数(奇数,整数)分频器设计, 50%占空比

module div_clk(clk_in, divisor, clk_out); input clk_in; input divisor; output clk_out; reg clk_out = 0; wire clk_in; reg [7 : 0] count = 0; wire [7 : 0] divisor; wire odd; assign odd = divisor & 1; always @(clk_in) begin if (count == 0 && clk_

8421BCD转余3码Verilog HDL的设计(2)

接着上节8421BCD转余3码Verilog HDL的设计(1),分析另一条路径A-C分支 (1)在C状态,t1时刻Bin输入的值可能为0或者1:当bin输入0时,进入F状态:当bin输入1时,进入G状态,比特流Bin二进制为t3t2t1t0的可能性如下: C状态(t1时刻,Bin=0),Bout=0 C状态(t1时刻,Bin=1),Bout=1 t3t2t1t0 T3T2T1T0 下一状态为F状态 t3t2t1t0 T3T2T1T0 下一状态为G状态 0001 0100 0011 0110 0

自己动手写处理器之第二阶段(2)——Verilog HDL简介

将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第六篇,我尽量每周四篇 2.3 Verilog HDL简介 本书实现的OpenMIPS处理器是使用Verilog HDL编写的,所以本章接下来的几节将介绍Verilog HDL的一些基本知识,包括语法.结构等.因为本书并不是一本讲授Verilog HDL的专门书籍,所以此处介绍的内容并不是Verilog HDL的全部,只是一些基础知识,以及在OpenMIPS处理器实现过程中会使用到的知识.读者如果对Verilog HDL有进一步了解