前面文章讲解了在FPGA上实现SHA-256的原理性讨论。
SHA-256算法在FPGA上的实现
本文在前文的基础上进行了若干修正,增加了子模块的功能说明以及子模块之间的连接关系。本文是今天课堂讨论的整理。
![](https://img.haomeiwen.com/i6625050/c8aab27c8e6b80a7.png)
总的设计思路
我们希望尽可能多地使用现成的Altera IP来搭建我们的设计。我们的设计中会用到HPS2FPGA lightweighted bridge来挂接需要进行少量数据交互的模块如PIO和中断,用HPS2FPGA bridge来挂接需要传递大量数据的模块如双口memory,用PIO口来实现控制寄存器和状态寄存器的功能,用interrupt模块来触发ARM的中断。上图中那两块双口memory用来存储数据M和Kj。
这些模块的使用均可以在Altera的图形化系统开发工具Qsys中实现。
在Qsys中可以直接从IP库中选择需要的IP,通过鼠标拖拽来例化IP,通过鼠标操作来将所有IP和HPS/ARM连接起来组成一个SoC系统。在Qsys可以对每个IP进行设置,如设置基础地址,偏移地址,位宽,大小,输入输出属性等。
SHA-256 core的说明
上图中SHA-256 core实现SHA-256压缩算法的所有核心功能,如CH(x,y,z), Maj(x,y,x), Sigma0, Sigma1等。 这个模块均为组合逻辑,输入输出如上图所示。
该模块并行实现了复杂的数学运算。这就是为什么基于FPGA的SHA-256实现可以秒杀基于最强大CPU的软件SHA-256实现。
关于PIO START的说明
这是一个新引入的模块,其主要功能是启动硬件加速器。我们约定如果这个模块的值被软件设为‘1’时,硬件加速器被初始化,所有计数器(Counter 1...N ,Counter 0...63)被复位,加速器工作状态被复位,然后加速器开始工作。
这个模块的输出连到了状态机的输入。由于软件写为’1’后不可能立刻再清为0,状态机中必须加入上升沿检测来保证硬件加速器不会被反复重启。
软件需要在程序最开始时将该寄存器设为0,然后设置其他所有模块,最后再将该寄存器设为1。
关于Counter 0...63的说明
每个512bit message block需要经过64次迭代。Counter 0...63用来记录每个message block已经经过了多少次迭代。这个计数器在硬件加速器启动时被复位,然后进行模64计数,即当计数达到64时就回到0。
这个计数器可以用来生成Kj memory的读地址,与Counter1...N一起可以生成M memory的读地址。这个计数器还要用来控制Wj Gen模块的运行。
所有双口memory的FPGA侧输入信号的生成,包括地址,片选CS,读写信号Wr/Rd等均由状态机 State Machine模块实现。
这个模块是整个SHA-256 IP的核心模块。其实现以后再讲。
关于Counter 1...N的说明
Counter1...N用来记录多少个512bit Message Block已经被处理。我们要求这是一个8bit计数器,所以我们的设计最大支持的报文是512bit*256。这个值决定了memory M的大小。
当Counter0...63被计满一次时这个计数器的值加1。由于处理报文的长度是随机的,我们引入另外一个寄存器PIO CNT_N来存储报文M中有多少个512bit message block,即N值。
当计数器Counter1...N的值等于PIO CNT_N中的N值时运算结束。此时Buffer register a...h中的值就是最终的哈希值。
关于Wj Gen模块的说明
双口memory M中存放了所有的报文。根据SHA-256的规范,当j小于16时Wj直接来自512bit message block的切片,当j大于15时,Wj由过去的Wj生成。
所以该模块中需要实现深度为15宽度为32bit的移位寄存器,以及σ0和σ1的功能。
该模块需要用到计数器 Counter 0...63.
关于Interrupt gen模块的说明
该模块的功能是在所有运算结束时生成ARM的中断信号。当ARM接收到该中断时就会通过PIO register result a...h来读取最终的哈希结果。
该模块读取Counter 1...N 和Counter 0...63来判断所有运算是不是已经结束。
buffer register a...h
Buffer register a...h中存放当前512bit message block的压缩结果。
p.s 今天彻底被Visio打败了
蒙哥马利元帅曾经把人分为四种,智慧又勤劳的应该当参谋,智慧又懒惰的可以当将领,愚蠢又懒惰的可以当士兵,愚蠢又勤快的应该枪毙。
今天用Visio画图的时候不小心碰到了一个什么设置,那个自动走线变得极其灵敏又荒谬。这样的功能只能拿去关掉。
网友评论