我是靠谱客的博主 留胡子台灯,这篇文章主要介绍数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝对值函数运算(补码问题),取对数函数(移位寄存器),取整函数),现在分享给大家,希望可以做个参考。

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

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

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

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

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

基本算法思路:

复制代码
1
2
3
4
5
6
7
function [7:0] abs; input [8:0] data_in; if(data_in[8]) abs=1+(~data[7:0]); else abs=data[7:0]; // abs = (data_in[8] == 1'b1) ? (1+(~data[7:0]):(data[7:0]); endfunction

对于如下 二输入差的绝对值的函数。
z = abs(x - y)

  1. 如果考虑到两个输入均为无符号8bit数
复制代码
1
2
3
4
5
6
7
8
9
10
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
  1. 如果考虑到两个输入均为8bit有符号数(2进制补码)
    那么对于负数 A (二进制补码形式),其补码应该为 |A| = ~A + 1(按位取反加一 )
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
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为低的整数,具体方法上面用到的是移位寄存器,即将数据向右移位即可以得到所需最大的整数。
也可以利用下面两种方法:

  1. 利用移位寄存器
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
//以下两个函数任用一个 //求2的对数函数 function integer log2; input integer value; begin value = value-1; for (log2=0; value>0; log2=log2+1) value = value>>1; end endfunction
  1. 利用数值比较器(常见算法)
复制代码
1
2
3
4
5
6
7
8
9
10
11
function integer log2(input integer x); integer i; begin log2 = 1; for (i = 0; 2**i < x; i = i + 1) //不用移位寄存器,只用比较器 begin log2 = i + 1; end end endfunction
三、用Verilog实现取整函数

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

  1. Floor Function: the greatest integer that is less than or equal to x
  2. Ceiling Function: the least integer that is greater than or equal to x

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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_ceil endmodule

最后

以上就是留胡子台灯最近收集整理的关于数字电路基础知识——组合逻辑电路实现一些简单逻辑电路 (一)(用Verilog实现:绝对值函数运算(补码问题),取对数函数(移位寄存器),取整函数)的全部内容,更多相关数字电路基础知识——组合逻辑电路实现一些简单逻辑电路内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部