【第五届集创赛备赛】七、紫光同创李星钢和王斌赛题培训(2021年4月13日)
讲师介绍:
- FPGA应用方案工程师 李星钢
- FAE工程师 王斌
培训内容:
- 1、PDS软件使用经验分享
- 2、赛题仿真设计及注意事项
- 3、互动答疑
一、仿真
//UDP_HW_SPEEDUP--------------------------------------------------------wire HSEL_temp;assign HSEL_temp = HSEL && (HADDR[31:28] == 4'h7);reg [7:0] test_datai;reg test_dbusy;wire dready;always @(posedge HCLK or negedge SYSRESETn) beginif (~SYSRESETn) begintest_datai <= {8{1'b0}};test_dbusy <= 1'b0;endelse if(dready) begintest_datai <= test_datai + 1'b1;test_dbusy <= 1'b1;endelse begintest_datai <= {8{1'b0}};test_dbusy <= 1'b0;endendassign udp_tpnd = tsmac_tpnd && udp_cs;// UDP SPEEDUP is driven from the AHBgenerate if (`CORTEXM1_AHB_UDP == 1) begin : gen_udp_hw_speedup_0udp_hw_speedup u_udp_hw_speedup(.HCLK (HCLK), // system bus clock.HRESETn (SYSRESETn), // system bus reset.datai (test_datai), // source data.dbusy (test_dbusy), // source data valid .dready (dready), // hw_speedup_ready.HSEL (HSEL_temp), // AHB peripheral select.HREADY (HREADY), // AHB ready input.HTRANS (HTRANS), // AHB transfer type.HSIZE (HSIZE), // AHB hsize.HWRITE (HWRITE), // AHB hwrite.HADDR (HADDR), // AHB address bus.HWDATA (HWDATA), // AHB write data bus .HREADYOUT (HREADYOUT_udp),// AHB ready output to S->M mux.HRESP (HRESP_udp), // AHB response.HRDATA (HRDATA_udp),.udp_tdata (udp_tdata), // TSMAC tx data.udp_tstart (udp_tstart), // TSMAC tx start.udp_tpnd (udp_tpnd), // TSMAC tx going.udp_tlast (udp_tlast), // TSMAC tx end.udp_cs (udp_cs) // UDP tx valid);end elsebegin : gen_no_udp_hw_speedup_0assign dready = 1'b0;assign HREADYOUT_udp = 1'b1;assign HRESP_udp = 1'b0;assign HRDATA_udp = {32{1'b0}};assign udp_tdata = {8{1'b0}};assign udp_tstart = 1'b0;assign udp_tlast = 1'b0;assign udp_cs = 1'b0;end endgenerate//MEM-------------------------------------------------------------------wire a_wr_en;assign a_wr_en = w_en | ~r_en;wire [31:0] rdata0;assign rdata = rdata0;TEST_RAM u_TEST_RAM (.wr_data (wdata), // input [31:0].wr_addr (waddr[7:0]), // input [7:0].wr_en (a_wr_en), // input.wr_clk (HCLK), // input.wr_clk_en (mem_cs[0]), // input.wr_rst (1'b0), // input.rd_addr (raddr[7:0]), // input [7:0].rd_data (rdata0), // output [31:0].rd_clk (HCLK), // input.rd_rst (1'b0) // input);
直接挂在顶层,需要的GPIO直接拖到模块里面就行了。自己建个.v文件把它放到顶层即可。通过定义的地址段,通过软核操作它的地址偏移量,就可以直接操作它了。
为什么不能直接用提供的SPI模块,通过片选控制SPI读写什么的?
本次大赛的目的锻炼总线的方式挂载自己的模块,通过软核控制,这三个东西需要互动起来。如果直接用提供好的GPIO模块去访问自己的东西,相当于直接脱节了,相当于什么都没做。
GPIO_SetBit 实现如下:
void GPIO_SetBit(GPIO_TypeDef* GPIOx,uint32_t GPIO_Pin)
{GPIOx->DATAOUT |= GPIO_Pin;
}
注意,GPIOx->DATAOUT |= GPIO_Pin;
等价于GPIOx->DATAOUT = GPIOx->DATAOUT | GPIO_Pin;
,即先把GPIOx->DATAOUT
寄存器中的值读出来,然后再与 GPIO_Pin 进行或操作。故,仿真结果不是单纯的0和1的切换,往里面写0写1,就是高低电平,可能默认的DATAOUT 是有数据的,不是预期的高低切换!
全局,临时变量的等的空间分配都是从0x30000000这个地址开始的!
TEST_ADDR = temp_cnt++;
第一次运行到该语句时,TEST_ADDR 的值为 temp_cnt 自加之前的值,temp_cnt的值为自加之后的值。
temp_cnt 是一个全局变量,是系统自动分配的,在数据段地址内随机分配。
TEST_ADDR = 127; 对应地址:0x7000 1000;对应时间:441360000000 fs
temp_cnt = 128; 对应地址:0x3000 0028;对应时间:441460000000 fs
TEST_ADDR = 128; 对应地址:0x7000 1000;对应时间:442060000000 fs
上述的仿真是特殊的地址赋值,评审把结果做成视频,找一些特殊的点,跟C代码结合,如何快速的看到你这个仿真确实是跑起来了!
SD卡模块也要做成一个仿真。参赛队伍比较多,不可能一个个去看,会去抽查5个里面抽1个,进行实实在在的跑,更多的时候是看大家的仿真结果,要更直观的去凸显自己的仿真记过,不仅仅去录视频还要有文档去讲解。
#define TEST_ADDR (*(__IO uint32_t*)(0x70001000))
int temp_cnt = 0;int main(void)
{SystemInit();
// TimerInit();GpioInit();
// UartInit();
// SPIInit0();
// I2CInit();
// SystickInit();
// NVIC_SetPriority(SysTick_IRQn, 1); WatchDogInit(WATCH_DOG,2); DEBUG_P("PANGO Cortex-M1 Start Run......\r\n");DEBUG_P("JEDEC id = 0x%x\n",SFLASH_ReadJEDEC_ID());while(1){// if(key_flag)
// {// Delay(1000);
// if(!(GPIO_ReadBits(GPIO0)&0x0001))
// {// DEBUG_P("Key interrupt OK.....\r\n");
// }
// key_flag = false;
// }
// Timer_test(timer_counter);GPIO_SetBit(GPIO0,LED_PIN);GPIO_ResetBit(GPIO0,LED_PIN);TEST_ADDR = temp_cnt++;}
}
仿真需要使用make_hex128.exe生成3个.data文件(仿真用的);make_hex.exe 生成4个itcm文件(BootLoader用的)。
BootLoader不存在.data
而后放置到仿真的目录下.\pgr_FPGA_Cortex-M1_eval\rtl_design\pgr_ARM_Cortex_M1_PGL22_324_eval_4_6\simulation
直接覆盖,而后重新运行sim.bat文件
二、上板
I2C文件修改
EEPROM地址是8bit位宽,不需要用到16bit,故直接注释掉PANGO_i2c_eeprom.c
读写里面的高8位操作:
接着在PANGO_i2c_eeprom.h
文件中,修改I2C_PageSize
为16
为什么合成sfc文件时,选的.bin文件偏移地址必须是0x000C0000呢?这个是由BootLoader确定的,如下图:
BootLoader工程地址:
.\pgr_FPGA_Cortex-M1_eval\software_design\boot\Cortex-M1_spi_flash_bootloader
BootLoader去引导C语言从FLASH中去读数据,读数据去加载到DDR里,它的起始读地址,是从0xC0000开始的。
APP_BIN_SIZE 大小为409664,即644K = 256K,最大位流为256K。
故没必要修改BootLoader,即时跑LWIP和FreeRTOS,位流大小也够用!
BootLoader打印是看BootLoader起来了没,方便定位是BootLoader问题,还是应用程序问题!
仿真用的BootLoader和实际在板子上跑用的BootLoader是不一样的,也就是说4个ITCM文件不一样!
等功能没问题了,再去改或测试BootLoader。
黑金板下载到FLASH之后需要复位,或者掉电再运行!
上述点不了是因为,黑金的SPI线没有引出来!
答疑
片上跑,必须依赖块RAM,块RAM很珍贵!
不带操作系统十几个KB
跑操作系统和LWIP,代码段都有70+KB.
片上资源放不了,加Cache,把代码放到DDR。Cache的原理是:片上开一小块RAM,执行到哪一个段,从DDR里去取,如果命中了,直接在块RAM中去取,如果没有命中,去DDR里去取,地址和数据全部取出来,才能进行下一步处理。
实现SD卡的功能,即便没有挂到软核上去,但是逻辑端已经实现了这个功能。仿真也能跑起来。
0xC0000能不能改?
可以,需要改两个地方
- 1、BootLoader工程里面的C0000需要改
- 2、PDS工程合成SFC文件时的地址也需要改
- 3、位流大小不能超过FLASH的余量
AHB总线使用:
只要看顶层,AHB总线就那么点东西,根据地址去做判断,去做偏移量处理,地址段在哪一段,数据是什么,怎么去处理什么的。
SD接口,怎么分配引脚?
参考UDP加速,总线定义好之后,在模块里例化GPIO就可以了。
黑金开发板SD卡引脚支持的是SPI模式,并不是SDIO模式。
没关系,什么模式。现在大赛需要做的是,通过AHB 总线接口去SD卡,总线怎么去操作,把模块规定一个起始地址,往这个寄存器里面去写数据,去控制SD卡读写。读操作相当于访问了一个SD卡的读操作。
开放的目的是给你们参考,看一下内部一个简单的寄存器读写怎么实现的,外设内部的所有动作都通过这些寄存器实现的。m1通过AHB总线写某个约定好的寄存器,就可以将需要实现的功能发给外设模块,比如m1通过AHB总线写地址为0×00000004寄存器的第一个bit位,这个bit位约定为进行i2c的start操作,外设内部逻辑一旦检测到改bit位有效,就开始造出i2c的是start波形。这个过程就实现了m1完成i2c的start操作
即要把软核和SD卡这个纯逻辑的东西联合
坏区检测思路
每个块都进行一个读写校验,看它有没有错。
不希望大家直接使用现有的SPI接口去访问SD卡!
SD卡仿真要求?
单独写激励,能仿真起来就可以了。能结合软核一起跑,通过软核即C语言,控制寄存器跑起来,这样也是可以的!这样晋级的概率更大!
是的,无法挂。
自己写1个模块,挂载AHB总线上,实现SD卡的读写,这样也是可以的!不一定拿黑金的代码来!只要能实现SD卡的读写,并且挂载AHB总线上,没有用现成的东西,这个就是可以的!
初审不要求LWIP仿真,也没法跑,做TCP/IP的激励也很复杂
这样没有通过网线与PC机交互,算是附加功能。
??
上板的BootLoader工程和仿真的BootLoader文件是不一样的(4个ITCM文件不一样)!分别放在了工程里面!不需要动!在完成了功能之后,再去尝试这些功能!
底下配有说明文档,用的更多的是查核?
存储空间不用担心,使用了CACHE之后,DDR的寻址范围,CACHE都是可以访问的!
ICACHE指令起始地址必须配置为:0x10000000,DDR颗粒映射范围:0x10000000~0x10FFFFFF(16MB)
DCACHE数据起始地址必须配置为:0x30000000,DDR颗粒映射范围:0x30000000~0x3FFFFFFF(256MB)
除了0x10000000前面十几M的代码段外,后面的数据段,全部都是可以映射到DDR,即几百兆的空间都是可以通过软核申请操作的!
对应映射的实际物理地址,映射到了DDR中,实际地址是多少呢?需要通过C语言去把地址读出来,读出来过后,与实际DDR地址对应起来。
数据段地址,在keil中可以通过魔术棒配置为0x30001000,那么0x30000000 ~ 0x30001000之间的地址去哪了呢?它还是实际存在的,实际映射到DDR上,相当于静态存储空间,可以通过C语言直接访问地址的!可参考工程:
.\pgr_FPGA_Cortex-M1_eval\software_design\boot\Cortex-M1_Icache_Dcache_my_mem //参考这个工程,了解如何使用静态存储空间!
这个功能对需要大存储空间的需求特别重要!还可以知道实际的Buffer地址是多少!0x30000000 ~ 0x30001000之间的地址段就是静态的,系统在编译的时候不会编译到这个代码段,而这个代码段的用处就可以访问了。这个就很方便,可以随意使用,与DDR交互,只需要知道与DDR对应的地址是多少就可以了!比如0x30000000对应的DDR地址在xxxx,
上面那个Cortex-M1_Icache_Dcache_my_mem 工程,使用了ICACHE,但是数据段是放到了DTCM上面!只是把DCACHE当成了一个外部设备!起始地址是0x30000000,通过指针的方式直接对它进行读写,8位读写,16位,32位读写都可以!
???
基本要求必须满足,其他看SD卡读写速度,图像传输稳定,图像传输不卡顿,显示很流畅,实时性比较高(前面放一个遮挡物,上位机延时比较短),并不是功能多谁就厉害,还需要看性能!性能越高,得分越高!
GPIO绑定正确,自己去操作偏移量即可!
首先要明白软核和纯逻辑之间的纯逻辑是什么,用C语言怎么去控制纯逻辑代码,通过一个地址,这个地址可以在AHB总线上也可以在APB总线上!现在要求SD模块挂在AHB总线上!通过总线实现,AHB总线地址为0x7000 1000的初始地址,通过C语言往这个地址里面写1个1,你的AHB总线(verilog的input)收到了你的这个数据,把这个地址里面的数据值读出来是1,然后在自己的逻辑里面去做相应的操作!1是实现SD卡的读或写,0x7000 1004这个地址里面写个1,对应SD卡的操作(读或写)。比赛的目的,通过C语言,通过总线地址,去控制SD卡外设的动作!
本身纯逻辑就可以做这个事情,软核下发指令去做这个事情!
首先要想成功编译BootLoader工程,做如下修改:
解决方法:修改堆栈空间,默认分配的很大!魔术棒里面的IROM1和IRAM1分配的很小!
Stack_Size EQU 0x00001000
Heap_Size EQU 0x00001000
改为:
Stack_Size EQU 0x00000100
Heap_Size EQU 0x00000100
注意上图中的,Use MircroLIB勾不要去掉,下面的IROM1和IRAM1默认就行!
上面的配置之后,已经可以正常编译BootLoader工程了,仿真和上板的BootLoader工程区别即main.c
中的SIMULATION
宏有没有打开,打开就是仿真,不打开就是上板!
#define SIMULATION
仿真不需要引导过程,即不需要从SPI-FLASH中把数据读出来进而写入DDR。因为我们是把3个.data文件数据直接放到了DDR里,故省略了这样一个过程!
BootLoader只要能跑起来,代码量没有超过256K,就真的没有必要去改!BootLoader仅仅只是个引导,BootLoader的作用是把你的应用程序加载起来!
应用程序里面完全没有必要勾选#RUN2,即make_hex.exe生成的4个ITCM文件是没有用的!不需要去关心ITCM文件,只需要关系bin文件即可!
1、软核本身的仿真,直观的看到软核跑起来!
2、SD卡的纯逻辑代码仿真,硬件代码已经初步实现,只差上板。或者更进一步SD卡与软核的通过C语言联合仿真。
更好的方式,是上位机上的按键,通过LWIP下发指令等!使用开发板上的物理按键也是可以的,上位机也是需要自己写的,界面功能!
没有标明外设名称的中断,表示软核本身的,暂时是没有用到的!
AHB总线基地址为0x4000 0000,现有的外设到了0x4900 0000,其后的0x4A00 0000 ~ 0x4F00 0000都是可以用的!
UDP加速模块的基地址为:0x70000000
一共用到了0x20,剩余的是都可以用的!即0x7000 0020之后的都可以用!
验证
1、PDS工程重新编译后的sbit与ICACHE_DCACHE_DEMO工程生成的.bin文件放到板子上看看是否可以运行呢?
没有问题!
2、
参考
- keil空间不足,.\Objects\template.axf: Error: L6406E: No space in execution regions with .ANY selector mat
【第五届集创赛备赛】七、紫光同创李星钢和王斌赛题培训(2021年4月13日)相关推荐
- 第12届蓝桥杯国赛真题剖析-2021年5月29日Scratch编程初中级组
[导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第128讲. 第12届蓝桥杯Scratch国赛真题,这 ...
- 芯片|紫光国微拟对参股子公司紫光同创增资 后者从事商用FPGA相关业务
[TechWeb]8月8日消息,深交所上市公司紫光国微昨晚发布公告称,拟对参股子公司紫光同创增资,后者从事商用FPGA相关业务. 紫光国微公告截图 交易概述 紫光国微表示,深圳市紫光同创电子有限公司( ...
- 【FPGA创新设计竞赛——2022紫光同创杯】1、“基于 RISC-V 处理器的软硬件系统设计”赛题介绍
文章目录 一. 开发方向 基于 RISC-V 处理器的软硬件系统设计 设计要求 设计指标 作品提交注意事项 二. 考核标准 三. 平台借用 四. 竞赛支持 一. 开发方向 基于 RISC-V 处理器的 ...
- 紫光同创国产FPGA学习之Fabric Debugger
文章从紫光同创参考书拷贝过来的.因为我用的时候,看了一下就会用了(纯粹只是会用了,默认和xilinx的一样),没有看教程.先更新点文本,后面在写程序. 一. 软件简介 Fabric Debu ...
- 紫光同创国产FPGA学习之IP Compiler
这里就是紫光同创里面IP核的使用方法,缺少一个重要的内容就是,里面的IP怎么用没有写.看看也好,具体核怎么用仿真一下看看应该也和xilinx的一样吧.如果不一样,查找bug就危险了. 一. ...
- 紫光同创国产FPGA学习之Fabric Inserter
这一篇文章也是从紫光同创那边拷贝过来的.这个是在线逻辑分析仪调试,和xilinx的也差不多,所以,基本看过就能用了.具体有什么新的功能添加.我就不知道了.我看看,如果有特别的就在用另外的文章写了. 一 ...
- 紫光同创国产FPGA学习之Fabric Configuration
这个是下载软件使用教程.紫光同创的参考文件.哎呦我去,一个下载软件都弄的那么详细.我真的不知道,看到的人啥感想.估计他们更喜欢我自己写的简易教程.估计看晕了,还是先学会下载了,在看文档吧. 一. ...
- 国产FPGA(紫光同创)—— 数据采集及千兆以太网传输(二)
科研需要,使用国产FPGA(紫光PLG50H)实现数据采集及千兆以太网传输.总体流程如图所示 数据采集完成后,第二部分就需要千兆以太网实现数据传输. 一.硬件部分 开发板上通过Realtek RTL8 ...
- 基于国产FPGA紫光同创Titan2 PG2T390H的PCIe链式DMA控制器设计
文章目录 背景介绍 逻辑方案 性能测试 软件驱动 相关帖子 技术交流 背景介绍 近年来,国产FPGA厂商发展迅速,紫光同创.安路等公司已经量产28nm.几k~几百k的FPGA逻辑芯片,在自主可控的大环 ...
- 2021年10月8日模拟赛(保龄奇遇记)
本场考试考的很撇,值得反思,暴露出很多问题,望及时的拨乱反正,改掉操之过急,心态不稳定的缺点 2021年10月8日模拟赛(保龄奇遇记) 太菜了 T1 话中有话 有些词是多义词.这就导致同一句话可能有多 ...
最新文章
- java编写学生管理系统_Java实现学生管理系统
- 喧哗的背后:Serverless 的概念及挑战
- java ftp上传文件 linux_Java实现把文件上传至ftp服务器
- c语言支持默认参数吗,嵌入式C语言可以带“默认参数”的函数吗
- [vc中文绿色版本]33.8 MB下载
- 使用Docker制作zentao禅道镜像
- 第一个Sprint冲刺成果
- python的模块和类_Python 模块和类
- [转] 面向对象编程 - 访问限制
- 21、OSPF配置实验之特殊区域totally stub
- ssh 两个mysql数据库_SSH下,关于多数据库的两个问题
- matlab imrotated,图像旋转由Matlab无需使用imrotate
- 学大伟业:学习物理竞赛的学生如何快速掌握所需要的高数知识?
- control c linux命令,linux中Control+C是什么指令?使用什么命令可以给一个进程发出一个这样的指令?...
- Python 爬虫之 Beautifulsoup4,爬网站图片
- 「React 基础」组件生命周期函数componentDidMount()介绍
- easyui分页查询为什么会有下拉框_Easyui 添加分页组件_EasyUI 教程
- 云服务器BCC实例重装系统的操作步骤
- pikachu靶场之暴力破解
- Microsoft Word 教程「4」,如何在 Word 中应用样式、主题?
热门文章
- 如何说孩子才会听,怎么听孩子才肯说
- 如何将图片转成png格式?图片的格式怎么转换
- APP推广运营小技巧:可复制的APP推广渠道
- 批量将图片与白色图进行叠加(仅作记录)
- 利用XMLHTTP实现ASP.NET无刷新提交 (老梁)
- 【实战讲解】数据血缘落地实施
- java 适配器模式详解_JAVA设计模式详解(五)----------适配器模式
- PSNR、SSIM、BD-rate和BD-PSNR
- RxJava 沉思录(一):你认为 RxJava 真的好用吗?
- android 连接蓝牙耳机 的判断代码,如何验证Android上是否连接了蓝牙耳机?