




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Verilog带符号数运算 摘 要: 介绍了Verilog带符号数的不同运算。因为Reg和Wire数据默认情况下是无符号的,而在数据处理的情况下,Verilog既要对带符号数据进行各种运算,也要对无符号数和带符号数进行运算,所以简单使用Verilog提供的运算符是不够的。因此研究不同类型数据运算的通用方法是必要的。 关键词: Verilog; 带符号数; 补码; 算术运算 中图分类号: TN911?34 文献标识码: A 文章编号: 1004?373X(2015)03?0160?03 Operation of numbers with symbols by Verilog HUI Wei?jun, SHEN Zhao?jun (Yancheng Institute of Technology, Yancheng 224051, China) Abstract: Different operations of data with symbols by Verilog are introduced. Reg and Wire data in the case of default is unsigned, but in the case of data processing, a variety of operations of data with symbols are performed by Verilog, and the unsigned and signed with numbers need to be processed. However, it is not enough to use the operation symbols provided by Verilog. It is necessary to research the general method for various types of data operation. Keywords: Verilog; number with symbol; twos complement; arithmetic operation 0 引 言 Verilog语言是目前流行的一种硬件描述语言。它的最大的优点是简单、规范,语法规则与C语言十分相似。然而,作为一种描述语言,Verilog不具备C语言丰富的数据类型和数据处理能力。Verilog 95中能处理带符号数数据类型是整型,而整型的默认位宽是32位,且位宽不能改变,因而限制了整型数的使用。为了解决这个问题,Verilog 2001版本增加了对带符号数处理的支持,虽然如此,Verilog对数据处理仍然有很多问题。本文以Verilog 2001为版本,重点讨论带符号数的算术运算,并给出Verilog程序和仿真结果,同时,本文也讨论了带符号数的其他运算情况。 1 加、减运算 Verilog 2001处理带符号数加减运算很简单,只要在定义数组是使用关键字signed即可: module add_signed(a,b,sum); input signed 7:0 a,b; output signed 7:0 sum; assign sum=a+b; endmodule 仿真结果如图1所示。 图1 加法仿真结果 Verilog处理带符号数和无符号数运算时候,默认是把带符号数转换为无符号数。因此,对于带进位加法或者带借位减法运算,如果不加处理就会发生错误: module addc(a,b,c,sum); input signed 7:0 a,b; input c; output signed 8:0 sum; assign sum=a+b+c; endmodule 仿真如图2所示,可知结果是错误的,原因是a和b高位扩展加零。改进的方法是把带符号数进行符号扩展: assign sum=a7,a+b7,b+c; 图2 带符号数和无符号数加法仿真错误结果 图3所示仿真表明结果是正确的。也可以用系统函数把无符号数转换为带符号数参加运算: assign sum=a+b+$signed(c); 所得仿真结果将会相同。不同的是,系统函数$signed不能综合,具有$signed的代码只能用于仿真。 图3 带符号数和无符号数加法仿真正确结果 2 乘法运算 两个带符号数乘法运算的处理与加法运算相似,只需在定义端口的时候使用关键字signed即可: module mult(a,b,prod); input signed 7:0 a; input signed 7:0 b; output signed 15:0 prod; assign prod = a * b; endmodule 如图4所示的仿真表面结果是正确的。当然,实现一个带符号数和无符号数的乘法的时候,默认是把带符号数高位全部扩展为零,因而,用乘法运算符实现的乘法结果将会是错误的,如图5所示。 module mult(a,b,prod); input signed 7:0 a; input 7:0 b; output signed 15:0 prod; assign prod = a*b; endmodule 图5 带符号数与无符号数乘法仿真错误结果 解决方法是可以用函数$signed把上述代码中的无符号数b转换为带符号数,此时代码就不可综合。实现通用的两个数乘法的算法,基本的思路是用移位加的方式实现。其算法基础是认为补码是一个权重码,位宽为n的向量存放补码,其MSB的权为-2n-1,其他位的权为2i,i的取值范围为0in-2。当两个位宽为n的数相乘时,从右向左,逐位考察乘数索引为i的位的值,若为1,将被乘数左移i位,作为部分和加到结果中。若乘数最高为位1,因为权为-2n-1,所以被乘数要先取反加一,然后再左移n-1位。两个位宽为n的数相乘,最终的结果,是由n个移位的部分和相加得到。 module mult8(a,b,prod); input signed 7:0 a; input 7:0 b; output signed 15:0 prod; wire 15:0 prod_int0; wire 15:0 prod_int1; wire 15:0 prod_int2; wire 15:0 prod_int3; wire 15:0 prod_int4; wire 15:0 prod_int5; wire 15:0 prod_int6; wire 15:0 prod_int7; wire 7:0 inv_add1; assign prod_int0 = b0 ? 8a7,a : 16b0; assign prod_int1 = b1 ? 7a7,a,1b0 : 16b0; assign prod_int2 = b2 ? 6a7,a,2b0 : 16b0; assign prod_int3 = b3 ? 5a7,a,3b0 : 16b0; assign prod_int4 = b4 ? 4a7,a,4b0 : 16b0; assign prod_int5 = b5 ? 3a7,a,5b0 : 16b0; assign prod_int6 = b6 ? 2a7,a,6b0 : 16b0; assign inv_add1 = a + 1b1; assign prod_int7=b7?inv_add17,inv_add1,7b0 : 16b0; assign prod = prod_int0 + prod_int1 + prod_int2+prod_int3 + prod_int4 + prod_int5+prod_int6 + prod_int7;/六个部分和相加得到积 endmodule 以上代码可以对2个无符号数、2个带符号数、1个带符号数和1个无符号数的乘法都适用,仿真结果如图6所示。 图6 带符号数和无符号数相乘的正确结果 3 除法运算 通用的整数除法器也不可以用除法运算符来实现。除法器实现比较复杂,组合逻辑实现的算法较少。以下代码实现的就是一个通用的组合逻辑除法器,其思想是,先把带符号数转换为无符号数,实现两个无符号数的整数除法。 至于两个无符号数的除法器的算法是,循环实现被除数减去除数,直到被除数比除数小。那么,减的次数就是商,保留的被除数就是余数。最后根据被除数和除数的符号位确定商和余数的符号。 Module dividenew(Dividend,Divisor,Quotient,Reminder); input 7:0 Dividend,Divisor; output reg 7:0 Quotient,Reminder; wire isneg; wire 7:0 Dividend_abs,Divisor_abs; integer i; reg 7:0 tempa; reg 7:0 tempb; reg 15:0 temp_a; reg 15:0 temp_b; assign isneg = Dividend7 Divisor7; assign Dividend_abs = Dividend7 ? Dividend + 1 : Dividend; assign Divisor_abs = Divisor7 ? Divisor + 1 : Divisor; always (Dividend_abs,Divisor_abs) begin tempa tempb = tempb ) temp_a = temp_a - temp_b + 1; else temp_a = temp_a; end Quotient = isneg ? temp_a7:0 + 1 : temp_a7:0; Reminder = Dividend7 ? temp_a15:8+1 : temp_a15:8; end endmodule 上述程序适用于任意两个数相除的情况。仿真结果如图7所示,结果表明算法设置是正确的。 4 其他运算 (1) 移位运算 Verilog 2001增加了 带符号数右移运算符,不同于运算符 ,当执行该运算时,低位移出,高位补的是符号位。 (2) 关系运算 当执行带符号数和无符号数运算时候,Verilog默认是把带符号数看成无符号数。因此比较大小时,容易发生错误。 reg 7:0 a = 13; reg signed 7:0 b = -8; wire c; assign c = (a b); 上述代码中,c的值为0,说明关系运算是错误的。要正确的比较带符号数和无符号数的大小,需要根据符号位的具体情况来处理。 (3) 按位运算 当需要扩展的时候,注意的是用符号扩展,不能用默认的补零扩展。 5 结 语 在Verilog 1995版中,Reg和Wire都只支持无符号数,为了解决对带符号数的问题,Verilog 2001版增加了对带符号数处理的支持。在一般情况下,直接使用运算符实现带符号数的各种运算会出现错误。在加减、关系等运算中需要把带符号数进行符号扩展,然后再参加运算,在乘除运算中,仍然要采取一定的算法,才能实现通用的数据运算。 参考文献 1 布莱恩特,奥哈拉伦.深入理解计算机系统(英文版)M.2版.北京:机械工业出版社,2011. 2 王宏政.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 潍坊护理单招题库及答案解析
- a2从业资格证模拟考试酷二及答案解析
- 2025年国家开放大学《环境工程学》期末考试备考试题及答案解析
- 2025年铸造工(技师)职业技能鉴定理论考试题(附答案)
- 鹤岗市2025年公需课考试题库及答案
- 2025年幼儿园保育员理论考试试题(含答案)
- 2025年全国矿山安全管理人员(地下矿山)安全生产考试题库含答案
- 2025年度湖北省襄阳市专业技术人员继续教育公需科目试卷及答案
- 2025年国家开放大学《员工关系管理》期末考试备考试题及答案解析
- 2025年国家开放大学(电大)《创业风险管理》期末考试备考试题及答案解析
- 旅游公司旅行社安全应急救援预案及措施
- 驾照换证考试题库及答案
- 医药物流仓库管理流程标准
- 英语介绍端午节课件
- 先兆流产课件
- 2025年上海市新能源光伏组件中试车间智能化生产可行性研究报告
- 矿山节能管理办法
- 2025至2030鸡汁行业风险投资态势及投融资策略指引报告
- 水手考试题库及答案
- 手足外科护理常规
- 2025年安全生产考试题库(安全知识)安全培训课程试题
评论
0/150
提交评论