时序工具
关于时序工具的一些FAE解答:
问:你们的工具是否只提供所有输入输出管脚完全一致的时序约束?如tsu,th,tco,tpd的约束?如果不同管脚可以有不 同约束值,如何设置?
问:tco是指reg2pin的延时约束,tpd是指pin2pin的约束。而输入管脚约束tsu和th值,具体含义我不是很 明白?比如说我希望输入管脚的pin2reg延时为0-10ns,那么tsu和th如何设置?
问:我尝试用GUI做了一些时序约束,然后每次做时序分析都报错:Error: T2000: (ice_run_sta) Run sta failed. 这是什么问题?
今天终于拿到了最新3.2版本的软件,安装后,进行编译,长达近10分钟的placement让我眉头紧皱。后来从FAE处得知我拿到的是还未release出来的中间版本,有问题在所难免。不说这个,回到主题上来,其实总感觉有些遗憾。FAE在之前的回答其实已经预示着这个国产FPGA与特权同学缘分已到尽头。
图1
如图2所示,很无奈的只是移植了一个SDRAM控制器外加一些其它逻辑,占去了总共1000个LE中80%的资源,然后只是约束了一个50MHz的工作时钟,结果出来了20条false路径。即便尝试去试试用提供的仅有几个对mapping或palcement&routing设置的优化,结果换来了更多的false。FAE也坦言,目前只能做些简单的逻辑,跑个SDRAM等稍复杂的逻辑也就只能跑个二三十兆的样子。
图2
几天的试用,虽然以国产FPGA的性能问题而告夭折。虽然还显稚嫩的开发工具、差强人意的器件性能多少让人有些失望,但至少从某种程度上让特权同学改变了对国产的一些偏见。其实,如果Agate Logic能够持续这种开发热情,不断的改进,假以时日,相信他们会成为“中国的Altera”、“中国的Xilinx”。
{pagination}
扩SFR使用
题记:本以为这个国产FPGA的就此夭折,没想到权衡之后,在性能打些折扣的情况下还是重新捡起来了。从刚接触这个器件的时候特权同学就很关心它的硬核可扩展性,Avalone接口用上手了,当然很希望这个51硬核也能够提供类似的强大扩展接口。不过话说回来,毕竟是个8位的核,再强大也不到哪去,但在花了点心思琢磨了这个小玩意的扩展方式后,多少觉得还是有点花头的。
特权同学将关于Astro器件SFR相关的特性整理如下:
·可寻址空间0x80~0xff。
·部分地址空间已被8051内部使用。
·16个地址空间(能被8整除的地址如0x80、0x88、0x90、…0xf8等)可位寻址。
·最多支持49个8051核外可用SFRs,除核内已占用的地址,余下地址空间均为用户可用的核外SFRs。
·外部SFR接口含有等待状态寄存器(主要由sfack信号控制实现),允许8051内核与较慢的外设连接。
·外部SFR读写时序如图1所示。
为了简单的评估8051硬核的SFR扩展功能的性能,特权同学做了一些测试。
测试1:SFR可用性测试
简单的用逻辑模拟一个SFR可访问的外部寄存器,该寄存器只使用低四位,对应控制4个外部LED的亮暗。以此验证核外SFR的可用性。
对于8051硬核而言,如果开启核外SFR功能,提供了如下接口(与前面给出的波形图对应):
// External Special Function Registers interface
output[7:0] sfrdatao; //8051写数据
output [6:0] sfraddr; //8051访问地址
input [7:0] sfrdatai; //8051读数据
output sfrwe; //8051写SFR使能信号,高电平有效
output sfroe; //8051读SFR使能信号,高电平有效
SFR从机的逻辑接口代码如下:
reg[3:0] ledr; //LED指示灯对应的SFR
always @(posedge clk_50m or negedge rst_n) begin
if(!rst_n) ledr <= 4'h0;
else if(sfrwe && (sfraddr == 7'h78)) ledr <= sfrdatao[3:0];
//8051往地址为0xf8的SFR写数据,将数据锁存到ledr寄存器中
end
assign {led3,led2,led1,led0} = ledr;
软件编程时,需要在工程中做一个新的sfr定义:
//自定义SFR
sfr LED = 0xf8; //低4bit控制LED亮暗
编写函数实现SFR控制的流水灯:
void main(void)
{
while(1)
{
LED = 0x1;
delay(500);
LED = 0x2;
delay(500);
LED = 0x4;
delay(500);
LED = 0x8;
delay(500);
}
}
实验结果证明功能可行,达到预期。这个SFR功能的使用还是蛮简单的。
为了验证写功能,基本思路是想针对板载4个按键做一个SFR寄存器,专供8051内核读取当前按键值,然后把该值分别赋给4个LED(在前面测试的基础上执行)。添加的逻辑代码:
reg[3:0] keyr;
always @(posedge clk_50m or negedge rst_n) begin
if(!rst_n) keyr <= 4'hz;
else if(sfroe && (sfraddr == 7'h79)) keyr <= {key4,key3,key2,key1}; //8051从地址为0xf9的SFR读出数据
else keyr <= 4'hz;
end
assign sfrdatai = keyr;
读时序这个时钟clkcpu应该是8051工作的指令时钟,即8051外部输入时钟的12分频。这个时序图好像不太准确,实际读或写选通高脉冲不会保持一整个指令周期。特权同学测试下来发现用50MHz时钟做从接口,早一个时钟或是晚一个时钟周期送数据都无法使8051读走数据,只有上面给出的代码下时钟送数据才能正常保证8051锁存数据。也就是说,数据必须在读选通期间都保持稳定,早一个时钟周期撤销或是晚一个时钟周期撤销都不行。因此,为了延长数据有效长度,改进如下:
reg[3:0] keyr;
reg keyrden;
always @(posedge clk_50m or negedge rst_n) begin
if(!rst_n) keyrden <= 1'b0;
else if(sfroe && (sfraddr == 7'h79)) keyrden <= 1'b1;
else keyrden <= 1'b0;
end
always @(posedge clk_50m or negedge rst_n) begin
if(!rst_n) keyr <= 4'hz;
else if(keyrden || (sfroe && (sfraddr == 7'h79))) keyr <= {key4,key3,key2,key1}; //8051从地址为0xf9的SFR读出数据
else keyr <= 4'hz;
end
assign sfrdatai = keyr;
软件编程也很简单:
//自定义SFR
sfr LED = 0xf8; //低4bit控制LED亮暗
sfr KEY = 0xf9; //低4bit对应当前按键值
void main(void)
{
while(1)
{
LED = KEY;
}
}
测试2:SFR性能测试
与《国产FPGA试用手记二(51硬核性能测试)》做了类似的测试,验证LED寄存器拉高拉低的速度,和之前的结果一样。也就是说,核外的SFR在不使用等待功能的情况下与核内SFR的操作速度是一样的。
测试3:SFR等待功能验证
在50MHz的clkcpu下,没有等待时(即assign sfrack = 1'b1;),不断的对核外SFR写使能情况可以得到如图2所示的使能信号波形。两次上升沿之间240ns即一个指令周期(12个50MHz时钟周期),而读使能信号有效高脉冲为160ns,即8个时钟周期。
Datasheet中标明的sfrack信号其实无法直接从例化的51硬核中找到接口,于是特权同学干脆直接生成的IP核例化文件中把它手动引出来了,在自定义逻辑中对这个信号做了一些测试,也发现了该信号的使用方法。
代码如下:
reg[7:0] sfcnt; //延时等待计数器,以50MHz为时钟单位计数
wire sfrack; //SFR 读写等待信号
always @(posedge clk_50m or negedge rst_n) begin
if(!rst_n) sfcnt <= 8'd0;
else if(sfrwe) sfcnt <= sfcnt+1'b1;
else sfcnt <= 8'd0;
end
assign sfrack = (sfcnt == 0) | (sfcnt > 8'd23);
//等待n个指令周期,则sftcnt要大于(n*12-1)
该代码实现在sfrwe即SFR寄存器写选通信号到来后,用计数器sfcnt进行计数,然后相应的对需要延时等待的8051指令周期数通过控制sfrack为低电平实现。
分别设置了sfcnt>8’d16、sfcnt>8’d24、sfcnt>8’d23得到sfrwe的波形如图3、图4、图5所示。
由此可见,这里延时等待的时间必须刚好是指令周期。即系统指令周期为20ns*12=240ns,那么我们外部计数周期也是20ns的情况下,一般取等待时钟数为12的倍数即可。否则就会出现图3和图4的“毛刺”,其中原因特权同学不好妄下定论,恐怕和器件本身的内部处理机制有关。
{pagination}
完结篇
两个调试中遇到的小问题,引以为戒。
1.画板子的时候由于没注意结构上的固定边框,不小心把一个旁路电容放在边界上。在外部铁壳将液晶屏固定到电路板上后,出现的症状很有意思。两个不同的屋子(A和B),同样的电源输入,咱的板子在A屋子若是用手触碰铁壳,液晶屏就闪一下;而在B屋子就不会出现同样的问题。问题出现后,做了一些验证和测试,初步将问题定位在液晶屏的外壳和铁壳的接地。当然,回到开始提到的旁路电容,它随算不上是罪魁祸首,但本来铁壳以及液晶屏外壳(这二者应该是固定在一起的)与电路板的地没有连在一起,而这里的电容裸露的焊盘导致了二者连接在一起了。A屋子的供电拖线板的地和大地(由人手来传导)没有连在一起,而B屋子的供电拖线板的地和大地本来就是连在一起的。因此,结论也就浮出水面:在A屋子,大地和电路板的地(也就是铁壳的地)原本没有共在一起,当人手触碰铁壳的时候,两个地连在一起了,因此导致了液晶屏显示的闪烁现象;B屋子相应就不存在此问题,因为大地和铁壳的地原本就是共在一起的,人手触碰铁壳也就不会有什么问题了。
2.这是关于存储器的有效管脚被悬空引发的问题。从大学里上《数字电路》开始,就听说数字芯片不使用的管脚不可以悬空,要么接GND要么接VCC。而在实际工程中,咱可基本是“中规中矩”的照此设计,然而有些问题的出现大都不是设计者可以“算计”到的。先看看出现的问题:如果不小心用手触碰到了存储器,那么液晶屏就会出现花屏闪烁等现象。特权同学的第一感觉是虚焊了,但是多次重新加锡焊过后,问题还是时不时的出现。最终看看存储器的型号,隐约感觉到了问题出在这上面:由于原本128K的存储器由于库存问题被兼容型号的256K替代了,因此就存在一条地址线在电路中处于悬空状态。意识到这个问题后,特权同学试着用手(这是一个不好的习惯,人手的静电很可能引发新的“血案”)靠近那个悬空管脚,根本无需接触到,立马现象复现。问题的解决也很简单,要么接GND要么接VCC,还有一个更简单的办法是把这个悬空管脚和旁边的地址线短路,总之让他处于一个可控的固定状态问题就能解决。
接着上图,国产FPGA其实也很“给力”。当然,这和特权同学在性能与功能折中的情况下“绞尽脑汁”最大限度的“扬长避短”不无关系,也难怪芯片销售商看到效果后乐得合不拢嘴。但是后期是否能够经受住新的考验可就要看看它自己是否有真本事了。
作者:电子工程专辑博主特权同学
本文属于《电子工程专辑》网站作者原创,谢绝转载。