900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝

数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝

时间:2024-05-12 17:02:35

相关推荐

数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝

数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝对值函数运算(补码问题),取对数函数(移位寄存器),取整函数)

在数字逻辑设计中,本节介绍绝对值运算函数如何用Verilog硬件描述语言来实现,本质上是补码的问题。

而取对数问题,可以归结为移位寄存器的问题。具体可以参考之前的一篇博文:数字电路基础知识——组合逻辑电路(数据选择器MUX、多路复用器)

最后介绍一下取整函数的实现。

一、用Verilog硬件描述语言来实现 取绝对值函数

基本算法思路:

function [7:0] abs;input [8:0] data_in;if(data_in[8]) abs=1+(~data[7:0]);elseabs=data[7:0];// abs = (data_in[8] == 1'b1) ? (1+(~data[7:0]):(data[7:0]);endfunction

对于如下 二输入差的绝对值的函数。

z = abs(x - y)

如果考虑到两个输入均为无符号8bit数

module abs(input [7:0] dina,input [7:0] dinb,output [7:0] dout);assign dout = (dina > dinb)? (dina - dinb): (dinb - dina); //使用2-MUX即可解决endmodule

如果考虑到两个输入均为8bit有符号数(2进制补码)

那么对于负数 A (二进制补码形式),其补码应该为|A| = ~A + 1(按位取反加一 )

module abs(input signed [7:0] dina,input signed [7:0] dinb,output[8:0] dout // 至多9位);wire signed [8:0] dout_r; //dout_r是九位二进制补码assign dout_r = (dina >dinb)? (dina - dinb): (dinb - dina); assign dout = (dout_r[8] == 1'b1)? (~dout_r + 1): {1'b0, dout_r[7:0]};endmodule

二、取对数函数(求log以2为低的整数)

求log以2为低的整数,具体方法上面用到的是移位寄存器,即将数据向右移位即可以得到所需最大的整数。

也可以利用下面两种方法:

利用移位寄存器

//以下两个函数任用一个//求2的对数函数function integer log2;input integer value;beginvalue = value-1;for (log2=0; value>0; log2=log2+1)value = value>>1;endendfunction

利用数值比较器(常见算法)

function integer log2(input integer x);integer i;beginlog2 = 1;for (i = 0; 2**i < x; i = i + 1) //不用移位寄存器,只用比较器 beginlog2 = i + 1;endendendfunction

三、用Verilog实现取整函数

用Verilog实现取整函数(ceil、floor、round)。

Floor Function: the greatest integer that is less than or equal to xCeiling Function: the least integer that is greater than or equal to x

以5bit为例,小数部分1位,取整后保留4bit。

wire [4:0] data; wire [3:0] data_ceil;wire [3:0] data_floor; wire [3:0] data_round;/*ceil(x)函数,返回不小于x的最小整数值。向上取整floor(x)函数,返回不大于x的最大整数值。向下取整round(x)函数,返回x的四舍五入值。四舍五入取整*/module Ceil_floor_Round(input [4:0] data,output[3:0] data_ceil,output[3:0] data_floor,output[3:0] data_round);assign data_ceil = (data[0] == 0)? data[4:1]: data[4:1]+1;assign data_floor = data[4:1];assign data_round = (data[0] == 1)? (data[4:1]+1): data[4:1];// data_round = data_ceilendmodule

数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝对值函数运算(补码问题) 取对数函数(移位寄存器) 取整函数)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。