FPGA基础之逻辑单元LE(三)
本文主要简单介绍下verilogHDL代码和LE的对应关系,也就是说我们的代码占用了LE当中的哪些资源LE:
- 如果是纯组合逻辑的话,会使用到LE中的查找表(LUT)等结构;
assign dout[0] = (din==3'b000)? 1'b1 : 1'b0;
这是一段简单的组合逻辑代码,当din的3bit全为0时,dout[0]输出为1,否则为0;
通过上图可以看出,那一行组合逻辑代码在布局布线后占用一个LE的资源,并且仅占用了组合逻辑部分,LE内部使用了LUT的B、C、D输入端口,输出直接旁路输出,并没有占用寄存器资源。
- 在使用了时序逻辑后,将会用到LE中的寄存器(reg)等结构;
always@(posedge clk or negedge rst_n)
if(!rst_n)
dout[0] <= 1'b0;
else if(din==3'b000)
dout[0] <= 1'b1;
else
dout[0] <= dout[0];
从上图可以看到上述代码占用了一个LE的资源,并且组合LUT部分和寄存器部分均有使用,为了实现代码的最后一句“ dout[0] <= dout[0]; ”LE内部有一条反馈线路用于实现此功能,此反馈占用了LUT的C输入口,因此din的3bit使用的是A、B、C输入端。
如果我们代码设计中组合逻辑和时序逻辑并不像上述代码一样用于同一个输出,软件在布局布线的时候有时候会做一些优化,将其放入同一个LE中以节省资源。万变不离其宗,再复杂的设计也是由这些基础性的东西累加而成的,了解一些基础也可以方便在设计之初便考虑一些设计优化进去。
对LE的简介到这一篇便结束了,这些仅是学习过程中的一点笔记,曾经也将FPGA设计认为是软件里写写代码,慢慢便理解了为什么将FPGA设计称之为硬件设计,且要将硬件设计的思想贯穿整个设计中。