决定写一些基础电路方面的笔记, 免得自己把一些很基础的概念、电路忘得一干二净。 这篇文章就介绍三个, 并且这三个电路经常出现在笔试或者面试。
统计电路
我们知道matlab有一个函数hist, 可以画出随机数的分布, 其实这个函数用电路也可以实现。看下面一个例子:
假设每个周期输入一个16bit的随机数, enable 和capture_data指定一个数据, 假设是W, 电路要统计W之前出现的次数, 并且要求下一周期输出,如何实现?
如果不考虑overflow, 那么便可以用一个2p-RAM来实现。 把随机数当做地址。
1 | ram_dp_ar_sw |
log2(X) 电路设计
如何实现log2(x)? 假设X是16bit定点数(有整数部分和小数部分), 并且输入的值大于1。
其实如果输入数据是整数, 那么优先编码器可以解决该问题,但是输入是定点数,就不可以那么处理了。设计实现的思路有两点:
- LUT 查表
- 归一化
计算方法如下面的公式:
如果我们选择$n$ 使得$(2^{-n}\cdot x) \in [1,2)$, 那么n就是log结果的整数部分, 可以通过优先编码器得到。 然后经过barrel shifter得到$2^{-n}\cdot x$.
最后用LUT计算低bit, 也就是log的小数部分。 因为我们把数值范围进行了归一化, 这样LUT就会比较小了。
电路的结构如图所示:
其中 LUT部分的rtl code 可以写成:
1 | function real rlog2; |
而优先编码器的rtl code 可以写成:
1 | generate |
测试结果如下所示: