| |
MAX5开发板全面测试-笔记3
在全面测试文章中,提到了资源占用率为48,当时也没有仔细的思考为什么会这么大,哎,看来我的毛躁的毛病一点也么有改变,是时候该改变自己了。闲话转过来。如图1所示资源
图1
当时的想法是24个count占用了24个寄存器,配置为正常模式。计数器需要23个LE来作为组合逻辑,同时这23个LE应该设置为算术模式。而led2输出占用一个LE,配置为正常模式,这样加起来就是24 +23+1 = 48 了。
后来仔细分析 fitting报告
+---------------------------------------------+------------------+
; Resource ; Usage ;
+---------------------------------------------+------------------+
; Total logic elements ; 48 / 570 ( 8 % ) ;
; -- Combinational with no register ; 24 ;
; -- Register only ; 19 ;
; -- Combinational with a register ; 5 ;
; ; ;
; Logic element usage by number of LUT inputs ; ;
; -- 4 input functions ; 0 ;
; -- 3 input functions ; 0 ;
; -- 2 input functions ; 23 ;
; -- 1 input functions ; 5 ;
; -- 0 input functions ; 1 ;
; ; ;
; Logic elements by mode ; ;
; -- normal mode ; 26 ;
; -- arithmetic mode ; 22 ;
; -- qfbk mode ; 0 ;
; -- register cascade mode ; 0 ;
; -- synchronous clear/load mode ; 0 ;
; -- asynchronous clear/load mode ; 24 ;
; ; ;
;
; Maximum fan-out node ; clk ;
; Maximum fan-out ; 24 ;
; Highest non-global fan-out signal ; Add0~37 ;
; Highest non-global fan-out ; 5 ;
; Total fan-out ; 137 ;
; Average fan-out ; 2.49 ;
+---------------------------------------------+------------------+
看到算术模式的LE 只有22个,而普通模式却是26个,所有有所以疑惑。
在quartus11.0下打开post fitting 发现打不来,于是把程序移植到quartsu10.0下,并用max2来试验,此时打开fpost fitting如图2所示范
图2
打开其中一个小部分 如图3所示范
这里面有一点令我疑惑的是 为什么我设置的异步复位连接的却不是clr引脚,而是ADATA引脚,因此我分析师因为我的程序在复位的时候,设置的为1的缘故,这样相当于导入数据了,不过这样感觉不是异步复位还是同步复位了。!!!!! 这不太明白,待会在分析这个问题,现在回归主题。
如图4所示范
针对counter【0】来讲,由图来分析,每隔一个周期,信号就经过反相器后,进入触发器,这就产生了0-》1-》0的这个循环
而针对counter【1】所示范
分析数据
此时counter【0】与counter【1】进过了异或门后,输出数据返回到counter【1】 ,此时counter【1】保持2个周期,同时异或门配置为算术模式
针对counter【2】-----counter【22】 此时
分析的原理如同counter【1】所示范,同时配置为算术模式
而对于counter【23】
这个可以通过普通模式来进行,
分析后,发现进位链用了23个,而算术逻辑用了22个,其中add0-0用了普通模式,
如图所示范普通模式
算术模式
这样资源使用为 24个counter + 23个进位链(22个算术模式 + 1个普通模式) + osc时钟逻辑 = 48 。
这样就对了
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
在来分析 既然占用48个逻辑,其中24个 1 占用了24个查找表,那么怎么样才能让算术逻辑也走寄存器对应的查找表呢?
程序如下
always @(posedge clk1 or negedge cb)
begin
if (!cb)
counter <= 24'b0000_0000_0000_0000_0000_0000 ;
else
counter <= counter + 1'b1 ;
end
此时资源和逻辑占用率如下所示范
Total logic elements ; 25 / 240 ( 10 % )
; -- Combinational with no register ; 1
; Logic element usage by number of LUT inputs ;
; -- 4 input functions ; 0
; -- 3 input functions ; 0
; -- 2 input functions ; 23
; -- 1 input functions ; 1
; -- 0 input functions ; 1
; Logic elements by mode ;
; -- normal mode ; 3
; -- arithmetic mode ; 22
; -- qfbk mode ; 0
; -- register cascade mode ; 0
; -- synchronous clear/load mode ; 0
; -- asynchronous clear/load mode ; 24
根据上面的分析,24位的计数器,需要22个算术LE,2个普通模式LE,
1个时钟LE,这样正好是 22 +2+1 = 25 个LE 。
算术模式
普通模式
根据此图可以发现 这一种的优势在于算术逻辑使用后经过DFF,这样就节省了查找表,而第一种方式,查找表占用的是 1 ,所以浪费资源。同时根据下图所示,复位信号此时经过了clr,就是完全的异步复位。
此时还是不太理解,为什么在复位的时候,赋值为1,走的就是同步复位,而0就是异步复位。
继续试验
发现问题出在寄存器初始化上
比如在24位的寄存器中
当reg【23:0】counter = 24’b0000_0000_0000_0000_0000_0000 ;
此时走的复位信号就是 异步复位
而当reg【23:0】counter = 24’b100_0000_0000_0000_0000_0000 ;或者countermax5开发板.rar