Verilog之基本算数运算
1.加减法
module addsub
(
input [:] dataa,
input [:] datab,
input add_sub, // if this is 1, add; else subtract
input clk,
output reg [:] result
); always @ (posedge clk)
begin
if (add_sub)
result <= dataa + datab; //or "assign {cout,sum}=dataa+datab;"
else
result <= dataa - datab;
end endmodule
补码不仅可以执行正值和负值转换,其实补码存在的意义,就是避免计算机去做减法的操作。
1101 -3 补
+ 1000 8
01015
假设 -3 + 8,只要将 -3 转为补码形式,亦即 0011 => 1101,然后和 8,亦即 1000 相加
就会得到 5,亦即 0101。至于溢出的最高位可以无视掉
2.乘法
module mult(outcome,a,b);
parameter SIZE=;
input[SIZE:] a,b;
output reg[*SIZE:] outcome;
integer i;
always @(a or b)
begin outcome<=;
for(i=,i<=SIZE;i=i+)
if(b[i]) outcome<=outcome+(a<<(i-));
end
endmodule
乘法-带符号位,在初始化之际,取乘数和被乘数的正负关系,然后取被乘数和乘数的正值。输出结果根据正负关系取得。
else if( Start_Sig )
case( i ) :
begin isNeg <= Multiplicand[] ^ Multiplier[];
Mcand <= Multiplicand[] ? ( ~Multiplicand + 'b1 ) : Multiplicand;
Mer <= Multiplier[] ? ( ~Multiplier + 'b1 ) : Multiplier;
Temp <= 'd0;
i <= i + 'b1; end 1: // Multipling
if( Mer == 0 ) i <= i + 1'b1;
else begin Temp <= Temp + Mcand; Mer <= Mer - 1'b1; end //浪费时钟 :
begin isDone <= 'b1; i <= i + 1'b1; end :
begin isDone <= 'b0; i <= 2'd0; end endcase /*************************/ assign Done_Sig = isDone;
assign Product = isNeg ? ( ~Temp + 'b1 ) : Temp; /*************************/ endmodule
乘法器.vt示例
`timescale ps/ ps
module multiplier_module_simulation(); reg CLK;
reg RSTn; reg Start_Sig;
reg [:] Multiplicand;
reg [:] Multiplier; wire Done_Sig;
wire [:]Product; /***********************************/ initial
begin RSTn = ; #; RSTn = ;
CLK = ; forever # CLK = ~CLK; end /***********************************/ multiplier_module U1
(
.CLK(CLK),
.RSTn(RSTn),
.Start_Sig(Start_Sig),
.Multiplicand(Multiplicand),
.Multiplier(Multiplier),
.Done_Sig(Done_Sig),
.Product(Product)
); /***********************************/ reg [:]i; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 'd0;
Start_Sig <= 'b0;
Multiplicand <= 'd0;
Multiplier <= 'd0;
end
else
case( i ) : // Multiplicand = 10 , Multiplier = 2
if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
else begin Multiplicand <= 'd10; Multiplier <= 8'd2; Start_Sig <= 'b1; end : // Multiplicand = 2 , Multiplier = 10
if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
else begin Multiplicand <= 'd2; Multiplier <= 8'd10; Start_Sig <= 'b1; end : // Multiplicand = 11 , Multiplier = -5
if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
else begin Multiplicand <= 'd11; Multiplier <= 8'b11111011; Start_Sig <= 'b1; end : // Multiplicand = -5 , Multiplier = -11
if( Done_Sig ) begin Start_Sig <= 'b0; i <= i + 1'b1; end
else begin Multiplicand <= 'b11111011; Multiplier <= 8'b11110101; Start_Sig <= 'b1; end :
begin i <= 'd4; end endcase /***********************************/ endmodule
循环除法器
module streamlined_divider_module
(
input CLK,
input RSTn, input Start_Sig,
input [:]Dividend,
input [:]Divisor, output Done_Sig,
output [:]Quotient,
output [:]Reminder, /**************************/ output [:]SQ_Diff,
output [:]SQ_Temp
); /******************************/ reg [:]i;
reg [:]s;
reg [:]Temp;
reg [:]Diff;
reg isNeg;
reg isDone; always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i <= 'd0;
s <= 'd0;
Temp <= 'd0;
Diff <= 'd0;
isNeg <= 'b0;
isDone <= 'b0;
end
else if( Start_Sig )
case( i ) :
begin isNeg <= Dividend[] ^ Divisor[];
s <= Divisor[] ? { 'b1, Divisor } : { 1'b1 , ~Divisor + 'b1 };
Temp <= Dividend[] ? { 'd0 , ~Dividend + 1'b1 } : { 'd0 , Dividend };
Diff <= 'd0;
i <= i + 'b1; end ,,,,,,,:
begin Diff = Temp + { s , 'd0 }; if( Diff[] ) Temp <= { Temp[:] , 'b0 };
else Temp <= { Diff[:] , 'b1 }; i <= i + 'b1; end :
begin isDone <= 'b1; i <= i + 1'b1; end :
begin isDone <= 'b0; i <= 2'd0; end endcase /*********************************/ assign Done_Sig = isDone;
assign Quotient = isNeg ? ( ~Temp[:] + 'b1 ) : Temp[7:0];
assign Reminder = Temp[:]; /**********************************/ assign SQ_Diff = Diff;
assign SQ_Temp = Temp; /**********************************/ endmodule
Verilog之基本算数运算的更多相关文章
- 数组名取地址所算数运算应注意的"trap"
数组名取地址所算数运算应注意的"trap" 直接看代码: #include <stdio.h> int main() { int array[5]; printf(&q ...
- 初学 Java Script (算数运算及逻辑术语)
在JS中常用的算数运算符与其他编程类语言类似,逻辑术语也近乎相同. 一.常用算数运算符 1.基本算数运算符 赋值运算符:= : 加号:+ : 减号: - : 乘号: * : 除号: / : 求余: % ...
- python魔法方法-单目运算及一般算数运算
在比较的魔法方法中,我们讨论了魔法方法其实就是重载了操作符,例如>.<.==等.而这里,我们继续讨论有关于数值的魔法方法. 1.单目运算符或单目运算函数 __pos__(self) 实现一 ...
- Shell学习笔记——算数运算与条件测试
算数运算 1. 使用let命令 #!/sbin/bash var1=2 var2=3 let sum=var1+var2 echo $sum 使用let命令式,变量前不需要加$号 只用于整数运算,不适 ...
- NumPy算数运算
NumPy - 算数运算 用于执行算术运算(如add(),subtract(),multiply()和divide())的输入数组必须具有相同的形状或符合数组广播规则. 示例 import numpy ...
- java的数组index[]方括号内是可以进行算数运算的
java的数组index[]方括号内饰可以进行算数运算的 如: String[] stringArray = testString.split("\\."); System.out ...
- linux bash编程之算数运算和测试类型(第二篇)
写在最前边:在bash中数据类型有两种,分别是数值型和字符型.其中字符型是默认的. 1.算数运算 · 运算符 · 语法 1.1.运算符:+.-.*./.%.** 注意:有些时候 *(乘号)需要转义 1 ...
- pandas读书笔记 算数运算和数据对齐
pandas最重要的一个功能是,它可以对不同索引的对象进行算数运算.在对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集. Series s1=Series([,3.4,1.5],ind ...
- Linux - Shell - 算术表达式 - 算数运算
概述 shell 中基于 $(()) 的 算数运算 背景 复习 shell 脚本 凑数吧 准备 环境 os centos7 1. 算数运算 代码 #!/bin/bash # $(()) 的数学运算, ...
随机推荐
- python学习-day12:列表、元祖、字典介绍和内置
list:列表 >>>----可以被修改.修改成元素,元素可以使单独的数字,也可以是:新的list. 通过:链表..每个元素存储的时候,同时会指向下一个元素. 二.list编辑修改方 ...
- Orcal学习
sqlplus有几种登陆方式 比如:1.C: > sqlplus "/as sysdba" --以操作系统权限认证的oracle sys管理员登陆2.C: > sqlp ...
- Asp.net MVC 之请求生命周期
今天主要试着描述一下ASP.NET MVC 请求从开始到结束的整个生命周期,了解这些后,对MVC会有一个整体的认识. 这里主要研究了MVC请求的五个过程. 1.创建RouteTable 当ASP.NE ...
- [转]App Store 审核、限时免费、排行、推荐机制技巧精华汇总
在 App Store 上,什么样的应用会得到推荐? 这个问题问的非常大,而且编辑推荐很多个人元素在里面,我试着用推荐Ovi Store应用的思路来回答一下: 关于应用: 1.首先这个应用最基本的功能 ...
- 解决【win10管理员已阻止程序运行】问题时有感
今天在安装loadrunner11的时候点击setup弹出以下报错 然后试了很多方法,从网上找了各种解决方案:修改UAC.修改本地组策略,均未解决ps:本人电脑是win10家庭中文版. 研究了半天未果 ...
- autoit 中_GUICtrlStatusBar_SetBkColor失效的解决办法
#include <GuiConstantsEx.au3> #include <GuiStatusBar.au3> #include <WinAPI.au3> #i ...
- UVa10806 Dijkstra,Dijkstra-费用网络流
Problem, in short Given a weighed, undirected graph, find the shortest path from S to T and back wit ...
- 纸上谈兵:伸展树(splay tree)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们讨论过,树的搜索效率与树的深度有关.二叉搜索树的深度可能为n,这种情况下,每次 ...
- Python之路【第十九篇】:爬虫
Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...
- UICollectionView布局功能
UIConllectionView和UITableView类似,也是展示数据,但不同于UITableView那种规则的布局,UICollectionView可以实现不规则的布局,即瀑布流. 创建UIC ...