试用手记:为国产FPGA正名(五,外扩SFR使用)

关键词: fpga , 国产 , 国产fpga , 试用
作者:特权同学
题记:本以为这个国产fpga的就此夭折,没想到权衡之后,在性能打些折扣的情况下还是重新捡起来了。从刚接触这个器件的时候特权同学就很关心它的硬核可扩展性,avalone接口用上手了,当然很希望这个51硬核也能够提供类似的强大扩展接口。不过话说回来,毕竟是个8位的核,再强大也不到哪去,但在花了点心思琢磨了这个小玩意的扩展方式后,多少觉得还是有点花头的。
sfr,即特殊功能寄存器。sfr是8051单片机内部用于访问控制各种片上集成外设的主要寄存器,如常见的io口(p0/p1/p2/p3)读写、io 中断配置、定时器配置、串口外设等。因此,对一般用户而言,玩转8051就是玩转sfr的过程。一般的单芯片8051单片机的sfr接口不对外开放,除了部分寄存器内部使用外,余下地址空间保留。而astro器件的这颗8051硬核将空置的sfr地址空间开放给用户,提供了专门的对外接口时序。
特权同学将关于astro器件sfr相关的特性整理如下:
●可寻址空间0x80~0xff。
●部分地址空间已被8051内部使用。
●16个地址空间(能被8整除的地址如0x80、0x88、0x90、…0xf8等)可位寻址。
●最多支持49个8051核外可用sfrs,除核内已占用的地址,余下地址空间均为用户可用的核外sfrs。
●外部sfr接口含有等待状态寄存器(主要由sfack信号控制实现),允许8051内核与较慢的外设连接。
●外部sfr读写时序如图1所示。
2011-5-25 11:44:13 上传
下载附件 (73.48 kb)
图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个时钟周期。
2011-5-25 11:44:13 上传
下载附件 (16.42 kb)
图2
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 8’d16、sfcnt>8’d24、sfcnt>8’d23得到sfrwe的波形如图3、图4、图5所示。
2011-5-25 11:44:14 上传
下载附件 (16.41 kb)
图3
2011-5-25 11:44:15 上传
下载附件 (16.47 kb)
图4
2011-5-25 11:46:24 上传
下载附件 (16.28 kb)
图5
由此可见,这里延时等待的时间必须刚好是指令周期。即系统指令周期为20ns*12=240ns,那么我们外部计数周期也是20ns的情况下,一般取等待时钟数为12的倍数即可。否则就会出现图3和图4的“毛刺”,其中原因特权同学不好妄下定论,恐怕和器件本身的内部处理机制有关。

小功率开关电源芯片U6117S
利用TMC428控制器和MCS51单片机实现步进电机驱动控制系统的设计
德国人工智能研究中心与IAV联合研发实验室:研发人工智能应用汽车
如何通过检测电源电压确定是否进行了断相保护
正确的电源纹波测试方法介绍
试用手记:为国产FPGA正名(五,外扩SFR使用)
SQL语言艺术
基于TMS320F2812的高精度智能变送器设计
计算机行业即将迎来一场量子革命
灭蚊灯真的有用吗?终于可以告别蚊子的叮咬了
访问团全面了解和体验了商汤科技创新AI技术及应用
什么是VXLAN?为什么需要VXLAN?
室内定位下的智能养老看护系统解决方案
离子注入的特点
嵌入式处理器分为哪四类
智慧机房Web3D可视化运维系统解决方案
一种新型的正弦信号发生器的设计与实现
荣耀9X搭载的麒麟810处理器AI性能跑分已达到了全球最高
沉寂许久的开心汽车,似乎又吸引了一批投资者的关注
你真的知道耳机对耳朵的伤害吗?对耳朵伤害最小的耳机又是什么?