1.加减法

  1. module addsub
  2. (
  3. input [:] dataa,
  4. input [:] datab,
  5. input add_sub, // if this is 1, add; else subtract
  6. input clk,
  7. output reg [:] result
  8. );
  9.  
  10. always @ (posedge clk)
  11. begin
  12. if (add_sub)
  13. result <= dataa + datab; //or "assign {cout,sum}=dataa+datab;"
  14. else
  15. result <= dataa - datab;
  16. end
  17.  
  18. endmodule

补码不仅可以执行正值和负值转换,其实补码存在的意义,就是避免计算机去做减法的操作。

  1101       -3 补
+   1000        8
    01015
假设 -3 + 8,只要将 -3 转为补码形式,亦即 0011 => 1101,然后和 8,亦即 1000 相加
就会得到 5,亦即 0101。至于溢出的最高位可以无视掉

2.乘法

  1. module mult(outcome,a,b);
  2. parameter SIZE=;
  3. input[SIZE:] a,b;
  4. output reg[*SIZE:] outcome;
  5. integer i;
  6. always @(a or b)
  7. begin outcome<=;
  8. for(i=,i<=SIZE;i=i+)
  9. if(b[i]) outcome<=outcome+(a<<(i-));
  10. end
  11. endmodule

乘法-带符号位,在初始化之际,取乘数和被乘数的正负关系,然后取被乘数和乘数的正值。输出结果根据正负关系取得。

  1. else if( Start_Sig )
  2. case( i )
  3.  
  4. :
  5. begin
  6.  
  7. isNeg <= Multiplicand[] ^ Multiplier[];
  8. Mcand <= Multiplicand[] ? ( ~Multiplicand + 'b1 ) : Multiplicand;
  9. Mer <= Multiplier[] ? ( ~Multiplier + 'b1 ) : Multiplier;
  10. Temp <= 'd0;
  11. i <= i + 'b1;
  12.  
  13. end
  14.  
  15. 1: // Multipling
  16. if( Mer == 0 ) i <= i + 1'b1;
  17. else begin Temp <= Temp + Mcand; Mer <= Mer - 1'b1; end //浪费时钟
  18.  
  19. :
  20. begin isDone <= 'b1; i <= i + 1'b1; end
  21.  
  22. :
  23. begin isDone <= 'b0; i <= 2'd0; end
  24.  
  25. endcase
  26.  
  27. /*************************/
  28.  
  29. assign Done_Sig = isDone;
  30. assign Product = isNeg ? ( ~Temp + 'b1 ) : Temp;
  31.  
  32. /*************************/
  33.  
  34. endmodule

乘法器.vt示例

  1. `timescale ps/ ps
  2. module multiplier_module_simulation();
  3.  
  4. reg CLK;
  5. reg RSTn;
  6.  
  7. reg Start_Sig;
  8. reg [:] Multiplicand;
  9. reg [:] Multiplier;
  10.  
  11. wire Done_Sig;
  12. wire [:]Product;
  13.  
  14. /***********************************/
  15.  
  16. initial
  17. begin
  18.  
  19. RSTn = ; #; RSTn = ;
  20. CLK = ; forever # CLK = ~CLK;
  21.  
  22. end
  23.  
  24. /***********************************/
  25.  
  26. multiplier_module U1
  27. (
  28. .CLK(CLK),
  29. .RSTn(RSTn),
  30. .Start_Sig(Start_Sig),
  31. .Multiplicand(Multiplicand),
  32. .Multiplier(Multiplier),
  33. .Done_Sig(Done_Sig),
  34. .Product(Product)
  35. );
  36.  
  37. /***********************************/
  38.  
  39. reg [:]i;
  40.  
  41. always @ ( posedge CLK or negedge RSTn )
  42. if( !RSTn )
  43. begin
  44. i <= 'd0;
  45. Start_Sig <= 'b0;
  46. Multiplicand <= 'd0;
  47. Multiplier <= 'd0;
  48. end
  49. else
  50. case( i )
  51.  
  52. : // Multiplicand = 10 , Multiplier = 2
  53. if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
  54. else begin Multiplicand <= 'd10; Multiplier <= 8'd2; Start_Sig <= 'b1; end
  55.  
  56. : // Multiplicand = 2 , Multiplier = 10
  57. if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
  58. else begin Multiplicand <= 'd2; Multiplier <= 8'd10; Start_Sig <= 'b1; end
  59.  
  60. : // Multiplicand = 11 , Multiplier = -5
  61. if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
  62. else begin Multiplicand <= 'd11; Multiplier <= 8'b11111011; Start_Sig <= 'b1; end
  63.  
  64. : // Multiplicand = -5 , Multiplier = -11
  65. if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
  66. else begin Multiplicand <= 'b11111011; Multiplier <= 8'b11110101; Start_Sig <= 'b1; end
  67.  
  68. :
  69. begin i <= 'd4; end
  70.  
  71. endcase
  72.  
  73. /***********************************/
  74.  
  75. endmodule

循环除法器

  1. module streamlined_divider_module
  2. (
  3. input CLK,
  4. input RSTn,
  5.  
  6. input Start_Sig,
  7. input [:]Dividend,
  8. input [:]Divisor,
  9.  
  10. output Done_Sig,
  11. output [:]Quotient,
  12. output [:]Reminder,
  13.  
  14. /**************************/
  15.  
  16. output [:]SQ_Diff,
  17. output [:]SQ_Temp
  18. );
  19.  
  20. /******************************/
  21.  
  22. reg [:]i;
  23. reg [:]s;
  24. reg [:]Temp;
  25. reg [:]Diff;
  26. reg isNeg;
  27. reg isDone;
  28.  
  29. always @ ( posedge CLK or negedge RSTn )
  30. if( !RSTn )
  31. begin
  32. i <= 'd0;
  33. s <= 'd0;
  34. Temp <= 'd0;
  35. Diff <= 'd0;
  36. isNeg <= 'b0;
  37. isDone <= 'b0;
  38. end
  39. else if( Start_Sig )
  40. case( i )
  41.  
  42. :
  43. begin
  44.  
  45. isNeg <= Dividend[] ^ Divisor[];
  46. s <= Divisor[] ? { 'b1, Divisor } : { 1'b1 , ~Divisor + 'b1 };
  47. Temp <= Dividend[] ? { 'd0 , ~Dividend + 1'b1 } : { 'd0 , Dividend };
  48. Diff <= 'd0;
  49. i <= i + 'b1;
  50.  
  51. end
  52.  
  53. ,,,,,,,:
  54. begin
  55.  
  56. Diff = Temp + { s , 'd0 };
  57.  
  58. if( Diff[] ) Temp <= { Temp[:] , 'b0 };
  59. else Temp <= { Diff[:] , 'b1 };
  60.  
  61. i <= i + 'b1;
  62.  
  63. end
  64.  
  65. :
  66. begin isDone <= 'b1; i <= i + 1'b1; end
  67.  
  68. :
  69. begin isDone <= 'b0; i <= 2'd0; end
  70.  
  71. endcase
  72.  
  73. /*********************************/
  74.  
  75. assign Done_Sig = isDone;
  76. assign Quotient = isNeg ? ( ~Temp[:] + 'b1 ) : Temp[7:0];
  77. assign Reminder = Temp[:];
  78.  
  79. /**********************************/
  80.  
  81. assign SQ_Diff = Diff;
  82. assign SQ_Temp = Temp;
  83.  
  84. /**********************************/
  85.  
  86. endmodule

Verilog之基本算数运算的更多相关文章

  1. 数组名取地址所算数运算应注意的&quot;trap&quot;

    数组名取地址所算数运算应注意的"trap" 直接看代码: #include <stdio.h> int main() { int array[5]; printf(&q ...

  2. 初学 Java Script (算数运算及逻辑术语)

    在JS中常用的算数运算符与其他编程类语言类似,逻辑术语也近乎相同. 一.常用算数运算符 1.基本算数运算符 赋值运算符:= : 加号:+ : 减号: - : 乘号: * : 除号: / : 求余: % ...

  3. python魔法方法-单目运算及一般算数运算

    在比较的魔法方法中,我们讨论了魔法方法其实就是重载了操作符,例如>.<.==等.而这里,我们继续讨论有关于数值的魔法方法. 1.单目运算符或单目运算函数 __pos__(self) 实现一 ...

  4. Shell学习笔记——算数运算与条件测试

    算数运算 1. 使用let命令 #!/sbin/bash var1=2 var2=3 let sum=var1+var2 echo $sum 使用let命令式,变量前不需要加$号 只用于整数运算,不适 ...

  5. NumPy算数运算

    NumPy - 算数运算 用于执行算术运算(如add(),subtract(),multiply()和divide())的输入数组必须具有相同的形状或符合数组广播规则. 示例 import numpy ...

  6. java的数组index[]方括号内是可以进行算数运算的

    java的数组index[]方括号内饰可以进行算数运算的 如: String[] stringArray = testString.split("\\."); System.out ...

  7. linux bash编程之算数运算和测试类型(第二篇)

    写在最前边:在bash中数据类型有两种,分别是数值型和字符型.其中字符型是默认的. 1.算数运算 · 运算符 · 语法 1.1.运算符:+.-.*./.%.** 注意:有些时候 *(乘号)需要转义 1 ...

  8. pandas读书笔记 算数运算和数据对齐

    pandas最重要的一个功能是,它可以对不同索引的对象进行算数运算.在对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集. Series s1=Series([,3.4,1.5],ind ...

  9. Linux - Shell - 算术表达式 - 算数运算

    概述 shell 中基于 $(()) 的 算数运算 背景 复习 shell 脚本 凑数吧 准备 环境 os centos7 1. 算数运算 代码 #!/bin/bash # $(()) 的数学运算, ...

随机推荐

  1. WeX5之xid相关API

    WeX5针对xid提供了以下js api: 1.根据xid获取id:this.getIDByXID(xid): 2.根据xid获取HTML节点:this.getElementByXid(xid),此a ...

  2. Hadoop学习19--推测式执行

    所谓推测式执行,就是计算框架判断,如果有一个task执行的过慢,则会启动备份任务,最终使用原任务+备份任务中执行较快task的结果.产生原因一般是程序bug.负载倾斜. 那么这个较慢,是怎么判断的呢? ...

  3. ThinkPad E440 Ubuntu 13.1无线网卡 RTL8723BE 驱动解决办法总结

    方法一.在使用网线链接到情况下 第一步.执行下边到命令,即从github上下载驱动程序并安装 sudo apt-get install linux-headers-generic build-esse ...

  4. SQL 养成一个好习惯是一笔财富

    来源:MR_ke 链接:http://www.cnblogs.com/MR_ke/archive/2011/05/29/2062085.html 我们做软件开发的,大部分人都离不开跟数据库打交道,特别 ...

  5. bzoj2006 noi2010 超级钢琴 主席树 + 优先队列

    Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2435  Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...

  6. eclipse中没有R文件

    换了台电脑,把eclipse安装上去,很久没用,最近用了一下.发现R文件无法生成.试了各种方法. Project-->Clean:从其他的项目中,复制一个R.java过来:检查语法:勾选上了Pr ...

  7. iOS官方Sample大全

    转载自:http://blog.csdn.net/yangtb2010/article/details/7005471 http://developer.apple.com/library/ios/s ...

  8. 11.tftp和nfs服务器

    宿主机产生嵌入式软件的机器 运行程序的是目标机上运行 基于网络的下载 目标机通过tftp下载到目标机 1. 安装tftp依赖xinetd [root@cfm880 Packages]# rpm -iv ...

  9. Android test---monkey

    一.在使用monkey之前,需要用到模拟器,那么怎么启动模拟器呢,先看一下电脑有什么模拟器,通过命令行查看一下 android list avd 二.看到了模拟器列表了,下来就是启动模拟器了.在命令行 ...

  10. AX 4.0 调用打印设定的功能

    PrintJobSettings printJobSettings; PrintJobSettings printJobSettings2; Boolean ok; container packPri ...