amobbs.com 阿莫电子论坛

 找回密码
 注册
密码必须由大写、小写、数字组成,三者缺一不可
搜索
bottom↓
回复: 102

向莫大学习,从今天开始有限解答C/C++/Xilinx方面的较难问题

  [复制链接]
(11777513)

出0入8汤圆

发表于 2020-3-21 23:30:14 | 显示全部楼层 |阅读模式
RT,Xilinx用了多年了,除了Zynq没怎么折腾过,其它基本都用过,坑淌过不知多少了。从今天开始每天抽出一定时间解答有关的难题——注意,简单的问题请不要来这问。

哪些是简单的问题:
(1)一大堆warning之类的。比如信号被优化掉了,请(1)检查信号有没有输出,(2)检查io port list是否把output/inout写成input了(用ISE模板生成器容易出这问题)。
(2)时序不对。请(1)检查always块是用的=还是用的<=,(2)如果是组合逻辑,assign的话注意检查是否会造成环路,仿真会卡死,(3)仿真器不能有效处理组合逻辑的多时钟域边沿翻转问题,仿真跨时钟域模块时请根据情况自行添加延时。
(3)语法问题等等。常用运算符的问题请不要耽误大家时间,谢谢。请多用()把每一个运算包含起来,以免产生比较优先级歧义的问题,谢谢。

除此之外的大部分都是比较难的问题了,我不可能做到全会,但是至少我淌过的坑一般不会再淌一次。注意:Task,Function之类我没用过,也不会用,有关这一块的我不会解答。

较难问题示例:
(1)一个多时钟域系统在某个输出端口收到的数据个数不对。——请检查数据通道的时钟是否正确配置。错误的时钟在设计良好的异步模块里是可以工作的,但是会造成数据出错。
(2)状态机运行不稳定,很容易卡死。——请检查是否有异步状态输入(包括pin直接输入的,只要是跨时钟域的都算)。
(3)流水线速度上不去。——检查组合逻辑深度(看pr时序报告)。还有,流水线不应当过宽(因为FPGA不适合宽输入的组合逻辑,先天缺陷,片内布线资源基本可以认为是平面的,过于密集的信号布不开)。等等。
(4)AXI协议有时会卡死。——注意当且仅当wvalid & wready或rvalid & rready时抓wlast或rlast,部分IP在前面信号组合无效时会输出随机信号。此外,aw/w和ar/r信号组务必做成完全并行的,同时必须相互握手保证idle状态同步。部分IP要求数据先行。自己设计AXI模块时一定要注意这一点。
(5)时序总是不过。——看一下报错的最长路径,有些路径在仔细设计过之后可以忽略warning,跨时钟域操作如有握手或fifo的请设TIG或false path,以免给布线带来问题。此外,部分器件存在挖空的区域(硬件IP核占用区域),会导致周边走线困难,这种情况只能降频,没别的办法。
(6)批量产品总有异常。——做约束时把时钟加快10~30%,比如输入25M就约束到30M以上。因为FPGA也是有体质差异的,一般建议用最快的器件添加至少10%的时序余量生成bin,然后用普通的片子来跑。目前产品已用上千片,全部是-3生成bin,-2C片子日常用,各种环境下没发现一例时序问题。

C/C++这块,template几乎不怎么用了,日常用不到,同上,语法问题请自己查书上网搜,涉及系统调用等功能代码请上csdn找代码,这里仅仅有限解答一些疑难杂症,谢谢支持。

请不要灌水,谢谢支持。
(11776519)

出0入0汤圆

发表于 2020-3-21 23:46:48 来自手机 | 显示全部楼层
顶下,不过难和易,每个人在不同阶段的理解是不一样滴
(11775543)

出0入8汤圆

 楼主| 发表于 2020-3-22 00:03:04 来自手机 | 显示全部楼层
浮生莫若闲 发表于 2020-3-21 23:46
顶下,不过难和易,每个人在不同阶段的理解是不一样滴

这应该就是不同级别的积累了。
(11744567)

出0入4汤圆

发表于 2020-3-22 08:39:20 来自手机 | 显示全部楼层
朋友 ise带的逻辑分析仪如何把io信号加进来观察
(11742735)

出0入8汤圆

 楼主| 发表于 2020-3-22 09:09:52 | 显示全部楼层
本帖最后由 wye11083 于 2020-3-22 09:19 编辑
gwj221 发表于 2020-3-22 08:39
朋友 ise带的逻辑分析仪如何把io信号加进来观察


加个wire完事。

还有,IO应该是能直接加的。你看看你选的是不是port。
(11741854)

出0入0汤圆

发表于 2020-3-22 09:24:33 来自手机 | 显示全部楼层
支持楼主
(11741693)

出0入0汤圆

发表于 2020-3-22 09:27:14 | 显示全部楼层
楼主整理一下遇到得一些常见问题和重要问题及解答,搞个问题集和经验分享造福坛友。
(11741302)

出0入0汤圆

发表于 2020-3-22 09:33:45 | 显示全部楼层
楼主分享经验套路吧
(11740751)

出0入0汤圆

发表于 2020-3-22 09:42:56 来自手机 | 显示全部楼层
简单的问题都问不出来……
(11739620)

出0入4汤圆

发表于 2020-3-22 10:01:47 来自手机 | 显示全部楼层
wye11083 发表于 2020-3-22 09:09
加个wire完事。

还有,IO应该是能直接加的。你看看你选的是不是port。

io加不了 加了wire也不行…………
(11739578)

出0入4汤圆

发表于 2020-3-22 10:02:29 来自手机 | 显示全部楼层
我说的io就是port端口
(11738829)

出0入0汤圆

发表于 2020-3-22 10:14:58 | 显示全部楼层
支持楼主
(11738384)

出0入0汤圆

发表于 2020-3-22 10:22:23 | 显示全部楼层
支持楼主,这个应该不算灌水············只是为了这份热情舔砖······
(11738326)

出0入0汤圆

发表于 2020-3-22 10:23:21 | 显示全部楼层
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. clkA和clkB时钟频率差在50%以内。即A为100MHz,那么 50MHz <  B <150Mhz
2. flagA出现频率不会超过 FclkA/4。即flagA最多4个clkA出现一次
3. flagA只会保持1个时钟周期
4. syncB尽量不要扩展为3位,减少延时
module crossflag(
    input clkA,
    input flagA,
    input clkB,
    output flagB
    );
reg toggle = 0;
always @(posedge clkA) toggle <= toggle ^ flagA;
reg [1:0] syncB = 0;
always @(posedge clkB) syncB <= {syncB[0], toggle};
assign flagB = (syncB[1] ^ syncB[0]);
endmodule
(11736907)

出0入4汤圆

发表于 2020-3-22 10:47:00 来自手机 | 显示全部楼层
canspider 发表于 2020-3-22 10:23
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. c ...

不能吧,flagA最短只有一个clka时钟,clkb又比clka慢,看不到toggle的脉冲吧。
(11734800)

出0入8汤圆

 楼主| 发表于 2020-3-22 11:22:07 来自手机 | 显示全部楼层
canspider 发表于 2020-3-22 10:23
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. c ...

兄弟,跨时钟握手本来就是大延时保证可靠性的,如果你时钟相差100%,至少要a b都延时3个周期。想省时间用fifo,然而fifo同样有至少3cyc的延时!
(11734732)

出0入8汤圆

 楼主| 发表于 2020-3-22 11:23:15 来自手机 | 显示全部楼层
gwj221 发表于 2020-3-22 10:02
我说的io就是port端口

那还是你没选好。你仔细看看chipscope选项。我已经多年不用了,调试直接读状态机看状态。chipscope只能用jtag,非常麻烦。我多年不用jtag线了。
头像被屏蔽
(11734614)

出0入0汤圆

发表于 2020-3-22 11:25:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
(11733982)

出0入0汤圆

发表于 2020-3-22 11:35:45 来自手机 | 显示全部楼层
get500wan 发表于 2020-3-22 10:47
不能吧,flagA最短只有一个clka时钟,clkb又比clka慢,看不到toggle的脉冲吧。


toggle只在flagA上升沿变化,频率最高FclkA/4,这个是低于clkB的
(11733918)

出0入0汤圆

发表于 2020-3-22 11:36:49 来自手机 | 显示全部楼层
支持楼主
(11732707)

出0入0汤圆

发表于 2020-3-22 11:57:00 | 显示全部楼层
Xilinx有没有类似altera那样的内核Nios?
(11732617)

出0入0汤圆

发表于 2020-3-22 11:58:30 | 显示全部楼层
有没有关于FPGA内部总线方面的资料?

和同事调项目(FPGA+DSP),同事设计了套内部总线,参考了各个处理器的寄存器管理方式,把32bit地址划分为若干个region。每个region内部是同一个时钟域的寄存器,与总线之间用小深度的fifo做跨时钟域隔离
目前用着感觉还可以,但是想看看参考资料,看看有没有可改进的地方
(11732487)

出0入0汤圆

发表于 2020-3-22 12:00:40 | 显示全部楼层
chun2495 发表于 2020-3-22 11:57
Xilinx有没有类似altera那样的内核Nios?

帮楼主回答这个问题了。。
有,MicroBlaze,IP核直接生成,用起来还算简单,可以用它来点灯
(11730741)

出0入4汤圆

发表于 2020-3-22 12:29:46 来自手机 | 显示全部楼层
canspider 发表于 2020-3-22 11:35
toggle只在flagA上升沿变化,频率最高FclkA/4,这个是低于clkB的

哦,确实。考虑错了。
(11719576)

出0入8汤圆

 楼主| 发表于 2020-3-22 15:35:51 来自手机 | 显示全部楼层
prow 发表于 2020-3-22 11:58
有没有关于FPGA内部总线方面的资料?

和同事调项目(FPGA+DSP),同事设计了套内部总线,参考了各个处理器 ...

现在流行axi,你找一下。axi4是主流。包括很多ip都是axi的了。
(11708721)

出0入0汤圆

发表于 2020-3-22 18:36:46 | 显示全部楼层
prow 发表于 2020-3-22 12:00
帮楼主回答这个问题了。。
有,MicroBlaze,IP核直接生成,用起来还算简单,可以用它来点灯  ...

多谢了。。。
(11707758)

出0入0汤圆

发表于 2020-3-22 18:52:49 | 显示全部楼层
外行来看看,有啥入门资料?
(11693361)

出0入8汤圆

 楼主| 发表于 2020-3-22 22:52:46 来自手机 | 显示全部楼层
powerk6 发表于 2020-3-22 18:52
外行来看看,有啥入门资料?

找本fpga教材,然后多练多写。fpga和c++重在积累。数据结构一定要非常熟,因为fpga内部全部都是最底层的按bit分配的数据结构。
(11690467)

出0入0汤圆

发表于 2020-3-22 23:41:00 | 显示全部楼层
FPGA和深度学习有什么结合的点嘛?
hls写出来的代码和xilinx家的dnndk编译出来的网络可以PK嘛?会不会手写就被取代掉了

(11689744)

出0入4汤圆

发表于 2020-3-22 23:53:03 来自手机 | 显示全部楼层
有hls相关的资料吗?貌似最近很流行
(11689225)

出0入0汤圆

发表于 2020-3-23 00:01:42 | 显示全部楼层
支持楼主!复杂的问题问不出来,先啃书……就像2楼说的,难和易,每个人在不同阶段的理解是不一样
(11688158)

出0入8汤圆

 楼主| 发表于 2020-3-23 00:19:29 来自手机 | 显示全部楼层
jjl3 发表于 2020-3-22 23:53
有hls相关的资料吗?貌似最近很流行

因为比较成熟了。比如opencv的haar人脸检测可以直接编译出来,代价是485t的90% sram用满。资料我没有,你找hls语法。hls是扩展的c语言,有几种标准io模型 。
(11687946)

出0入8汤圆

 楼主| 发表于 2020-3-23 00:23:01 来自手机 | 显示全部楼层
韩乔二 发表于 2020-3-22 23:41
FPGA和深度学习有什么结合的点嘛?
hls写出来的代码和xilinx家的dnndk编译出来的网络可以PK嘛?会不会手写 ...

fpga可以做cnn核,但是复杂逻辑必须得soc紧耦合,否则面积大。目前整体还不够成熟,开源框架资源消耗极高,低端微小片子没一个能跑的,自己写可以针对性去写。软核用vexriscv即可,体积小速度快。大多数手写代码要比机器生成的代码好(当然你得熟练甚至精通,且没有冗余代码)。机器代码没有可读性,出个bug只能s13了。
(11549031)

出0入0汤圆

发表于 2020-3-24 14:58:16 | 显示全部楼层
我再来问个奇怪的问题,FPGA启动用的SPI FLASH可以换vivado里没有的型号么,计划使用GD的flash,但是id应该和常用型号不一致
(11547533)

出0入4汤圆

发表于 2020-3-24 15:23:14 | 显示全部楼层
楼主目前FPGA使用什么方式调试的,JTAG在线调试确实非常难用,另外之前看过楼主发的vexriscv的帖子,比较感兴趣但鉴于编译环境等问题一直是没找方向下手
(11544438)

出0入4汤圆

发表于 2020-3-24 16:14:49 | 显示全部楼层
谭春林 发表于 2020-3-24 15:23
楼主目前FPGA使用什么方式调试的,JTAG在线调试确实非常难用,另外之前看过楼主发的vexriscv的帖子,比较感 ...

自告奋勇回答一下。

看看 spinalhdl 的环境搭建。我用 spinalhdl 来写了一些代码,整体感觉非常好,主要是安装 msys2 的环境,安装 gcc 和 c++ 编译器,安装 verilator 用来仿真,安装 gtkwave 来查看波形。

下载 IDEA,添加 scala 的插件,然后 clone 模板库,导入,就可以做 spinalhdl 的开发。

如果对 IDE 没有兴趣,只要 vxxriscv,不原意安装 IDEA 的话,只要一个 sbt 就可以了。
(11531283)

出0入0汤圆

发表于 2020-3-24 19:54:04 | 显示全部楼层
谢谢楼主
(11530248)

出0入0汤圆

发表于 2020-3-24 20:11:19 | 显示全部楼层
支持楼主
(11525925)

出0入8汤圆

 楼主| 发表于 2020-3-24 21:23:22 | 显示全部楼层
prow 发表于 2020-3-24 14:58
我再来问个奇怪的问题,FPGA启动用的SPI FLASH可以换vivado里没有的型号么,计划使用GD的flash,但是id应该 ...

随便接。要是怕不兼容就用x1模式(不需要特别生成mcs文件!直接在generate bitstream选项里勾上生成bin,找找spi选x1就好)。注意CFG和SPI电压要保持一致,要么都1.8要么都3.3。
(11525764)

出0入8汤圆

 楼主| 发表于 2020-3-24 21:26:03 | 显示全部楼层
abutter 发表于 2020-3-24 16:14
自告奋勇回答一下。

看看 spinalhdl 的环境搭建。我用 spinalhdl 来写了一些代码,整体感觉非常好,主要 ...

不建议让他折腾spinalhdl了,这货语法完全不一样,入门看似简单,但是想做深很难。我verilog用了8年才达到现在这程度,之前看了看spinalhdl就没太大兴趣了——貌似这个东西就是为了vexriscv开发的。而且低版本有bug,生成的rv32核点不亮。
(11525701)

出0入8汤圆

 楼主| 发表于 2020-3-24 21:27:06 | 显示全部楼层
谭春林 发表于 2020-3-24 15:23
楼主目前FPGA使用什么方式调试的,JTAG在线调试确实非常难用,另外之前看过楼主发的vexriscv的帖子,比较感 ...

当你深入到一定程度,就会发现JTAG的鸡肋了。用这货编译一遍时间要长一倍,而且必须得接下载线。而我手边没有一条下载线了——全坏了。

(11520512)

出0入14汤圆

发表于 2020-3-24 22:53:35 来自手机 | 显示全部楼层
wye11083 发表于 2020-3-24 21:27
当你深入到一定程度,就会发现JTAG的鸡肋了。用这货编译一遍时间要长一倍,而且必须得接下载线。而我手边 ...

能不能大概描述一下用什么方式调试呢,目前我用的z7,ps部分还可以不用下载器,pl部分就不行了,没找到调试办法。
(11520070)

出0入8汤圆

 楼主| 发表于 2020-3-24 23:00:57 来自手机 | 显示全部楼层
zxq6 发表于 2020-3-24 22:53
能不能大概描述一下用什么方式调试呢,目前我用的z7,ps部分还可以不用下载器,pl部分就不行了,没找到调 ...

直接把状态机导出来就好。务必做好前仿。
(11488781)

出0入4汤圆

发表于 2020-3-25 07:42:26 | 显示全部楼层
wye11083 发表于 2020-3-24 21:26
不建议让他折腾spinalhdl了,这货语法完全不一样,入门看似简单,但是想做深很难。我verilog用了8年才达 ...

缺点的确如此,毕竟是一个开源软件。

优点就是:1,更少的代码量,2. 友好的 IDE 环境,3,如果不是特别在意,有一些常用库。
(11480827)

出0入8汤圆

 楼主| 发表于 2020-3-25 09:55:00 | 显示全部楼层
abutter 发表于 2020-3-25 07:42
缺点的确如此,毕竟是一个开源软件。

优点就是:1,更少的代码量,2. 友好的 IDE 环境,3,如果不是特别 ...

代码量一点都不少。框架自己代码都一大堆了。比如要点个灯,我记得例程里面足足写了十几行代码。而且是扩展的java语法——如果对java非常熟可以考虑折腾。
(11474097)

出0入4汤圆

发表于 2020-3-25 11:47:10 | 显示全部楼层
wye11083 发表于 2020-3-25 09:55
代码量一点都不少。框架自己代码都一大堆了。比如要点个灯,我记得例程里面足足写了十几行代码。而且是扩 ...

要看工程的体量,对于小工程的确不会少写代码,对 systemverilog 也没有优势,工程量大的时候,而且组件需要经常重用的时候就省的太多了。
(11474006)

出0入8汤圆

 楼主| 发表于 2020-3-25 11:48:41 来自手机 | 显示全部楼层
abutter 发表于 2020-3-25 11:47
要看工程的体量,对于小工程的确不会少写代码,对 systemverilog 也没有优势,工程量大的时候,而且组件 ...


但是verilog模块也一样复用啊。工程量大的话,我就会把层级弄得足够深,这样每层就很简单了。

对了,还有就是可靠性。verilog是经过几十年工业验证的,包括intel,amd都是写的verilog。
(11473492)

出0入4汤圆

发表于 2020-3-25 11:57:15 | 显示全部楼层
wye11083 发表于 2020-3-25 11:48
但是verilog模块也一样复用啊。工程量大的话,我就会把层级弄得足够深,这样每层就很简单了。

对了,还 ...

呵呵,个人以为,spinalhdl 和 chisel 不是要替代 verlog 的,而且用 spinalhdl 也还是需要 verilog 的基础。
(11471692)

出0入0汤圆

发表于 2020-3-25 12:27:15 | 显示全部楼层
wye11083 发表于 2020-3-24 21:23
随便接。要是怕不兼容就用x1模式(不需要特别生成mcs文件!直接在generate bitstream选项里勾上生成bin, ...

但是使用ID不同的flash,vivado会报错啊,没办法烧写
(11471045)

出0入8汤圆

 楼主| 发表于 2020-3-25 12:38:02 来自手机 | 显示全部楼层
prow 发表于 2020-3-25 12:27
但是使用ID不同的flash,vivado会报错啊,没办法烧写

不要用vivado,直接烧spi。
(11470620)

出0入0汤圆

发表于 2020-3-25 12:45:07 | 显示全部楼层
wye11083 发表于 2020-3-25 12:38
不要用vivado,直接烧spi。

好吧,这也是种方法
(11438954)

出0入0汤圆

发表于 2020-3-25 21:32:53 来自手机 | 显示全部楼层
外行来看看,热闹不热闹
(11437539)

出0入0汤圆

发表于 2020-3-25 21:56:28 | 显示全部楼层
支持!支持!
(11428073)

出0入0汤圆

发表于 2020-3-26 00:34:14 | 显示全部楼层
S6锁相环有时锁不住,那个锁相环是通过哪组电源供电的?谢谢
(11404100)

出0入8汤圆

 楼主| 发表于 2020-3-26 07:13:47 来自手机 | 显示全部楼层
sdram 发表于 2020-3-26 00:34
S6锁相环有时锁不住,那个锁相环是通过哪组电源供电的?谢谢

你把频率控制好。s6 pll只能锁400~1000mhz vco。
(11305014)

出0入0汤圆

发表于 2020-3-27 10:45:13 | 显示全部楼层
我是外行,也点进来看看热闹
(11302103)

出20入0汤圆

发表于 2020-3-27 11:33:44 | 显示全部楼层
想学FPGA不知道怎么开始好一点. 买个开发板, 按例程搞?
(11301345)

出0入4汤圆

发表于 2020-3-27 11:46:22 | 显示全部楼层
jackman 发表于 2020-3-27 11:33
想学FPGA不知道怎么开始好一点. 买个开发板, 按例程搞?

推荐 http://zipcpu.com/tutorial/
头像被屏蔽
(10952950)

出0入0汤圆

发表于 2020-3-31 12:32:57 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
(10938578)

出0入0汤圆

发表于 2020-3-31 16:32:29 来自手机 | 显示全部楼层
想请教一下做FPGA行情好吗 转行难度高吗 待遇方面如何
(10937974)

出0入8汤圆

 楼主| 发表于 2020-3-31 16:42:33 来自手机 | 显示全部楼层
ghos 发表于 2020-3-31 16:32
想请教一下做FPGA行情好吗 转行难度高吗 待遇方面如何

这就不清楚了,但是如果积累不够,项目是做不出来的。fpga对整体素质要求很高。
(10934044)

出0入0汤圆

发表于 2020-3-31 17:48:03 来自手机 | 显示全部楼层
外行人来看热闹
(10873464)

出0入12汤圆

发表于 2020-4-1 10:37:43 来自手机 | 显示全部楼层
楼主说一下做这个待遇能到多少?
(10748835)

出0入0汤圆

发表于 2020-4-2 21:14:52 | 显示全部楼层
wye11083 发表于 2020-3-24 23:00
直接把状态机导出来就好。务必做好前仿。

"状态机导出来",用逻辑分析仪看波形?
(10747833)

出0入8汤圆

 楼主| 发表于 2020-4-2 21:31:34 | 显示全部楼层
lyl520719 发表于 2020-4-2 21:14
"状态机导出来",用逻辑分析仪看波形?

用任何方式看都可以,UART,USB,etc。逻辑分析仪是最笨的办法。
(10712676)

出0入0汤圆

发表于 2020-4-3 07:17:31 来自手机 | 显示全部楼层
wye11083 发表于 2020-4-2 21:31
用任何方式看都可以,UART,USB,etc。逻辑分析仪是最笨的办法。

当设计数模混合处理系统,混合信号示波器是必要的,靠uart等根本不现实
(10710587)

出0入8汤圆

 楼主| 发表于 2020-4-3 07:52:20 来自手机 | 显示全部楼层
NJ8888 发表于 2020-4-3 07:17
当设计数模混合处理系统,混合信号示波器是必要的,靠uart等根本不现实

除了射频,没有什么是uart搞不定的(当然c代码要在pc仿真好)。
(10276579)

出0入0汤圆

发表于 2020-4-8 08:25:48 来自手机 | 显示全部楼层
有个c的小白问题想请教一下,c51中如何对io进行指针操作?
(10275644)

出0入8汤圆

 楼主| 发表于 2020-4-8 08:41:23 来自手机 | 显示全部楼层
ghostxdy 发表于 2020-4-8 08:25
有个c的小白问题想请教一下,c51中如何对io进行指针操作?

c51好像不行,那是sfr直接寻址。你可以考虑写个函数来调。
(10144338)

出0入0汤圆

发表于 2020-4-9 21:09:49 来自手机 | 显示全部楼层
wye11083 发表于 2020-4-8 08:41
c51好像不行,那是sfr直接寻址。你可以考虑写个函数来调。

函数也不能操作可变的sfr啊。这种sfr设计完全是个怪胎。没法做个指向sfr的指针。
(10144155)

出0入0汤圆

发表于 2020-4-9 21:12:52 来自手机 | 显示全部楼层
wye11083 发表于 2020-4-8 08:41
c51好像不行,那是sfr直接寻址。你可以考虑写个函数来调。

除非,你写一大堆函数,每个函数固定操作一个sfr,然后用指针指向这一大堆函数中的某一个。
这也很烦。
(10140005)

出0入8汤圆

 楼主| 发表于 2020-4-9 22:22:02 来自手机 | 显示全部楼层
redroof 发表于 2020-4-9 21:12
除非,你写一大堆函数,每个函数固定操作一个sfr,然后用指针指向这一大堆函数中的某一个。
这也很烦。 ...

一个switch case就搞定了。
(10099931)

出0入0汤圆

发表于 2020-4-10 09:29:56 | 显示全部楼层
wye11083 发表于 2020-4-9 22:22
一个switch case就搞定了。

对,siwtch case每一项操作的sfr地址是常数就行。
大不了写128个case项,这样就能动态操作全部sfr了
(10016108)

出0入0汤圆

发表于 2020-4-11 08:46:59 | 显示全部楼层
一个有单数的数组,如何取中间值?是要排序才行吗?想知道有没更快的方法,如3个,5个
(9977693)

出0入8汤圆

 楼主| 发表于 2020-4-11 19:27:14 来自手机 | 显示全部楼层
miscell 发表于 2020-4-11 08:46
一个有单数的数组,如何取中间值?是要排序才行吗?想知道有没更快的方法,如3个,5个 ...

中值滤波比较麻烦。3阶直接比,5阶数据可以(1)两两比较,做一个大表,(2)针对比值大表做一个查找表,(3)根据查找表选择数据。大概需要3072bit的ram。

3x3的有快速算法,先按行排序,再按列取最大,中间,最小,然后再取中间。
(9973990)

出0入0汤圆

发表于 2020-4-11 20:28:57 | 显示全部楼层
谢谢!我目前只想到排序
(9634917)

出0入0汤圆

发表于 2020-4-15 18:40:10 | 显示全部楼层
ghostxdy 发表于 2020-4-8 08:25
有个c的小白问题想请教一下,c51中如何对io进行指针操作?

好奇,为啥要把这些SFR全部映射一遍呢?
(9364289)

出0入0汤圆

发表于 2020-4-18 21:50:38 | 显示全部楼层
canspider 发表于 2020-3-22 10:23
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. c ...

你这个简单啊,clkA将flagA脉冲展宽为2个脉冲宽度,然后经过clkB两级同步就行了啊,这样经过同步到clkB,延时最多就2个clkB时钟呗
(8869218)

出0入0汤圆

发表于 2020-4-24 15:21:49 | 显示全部楼层
canspider 发表于 2020-3-22 10:23
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. c ...

最好另外开贴。
PS, 大赞楼主分享精神。。
(8537685)

出0入0汤圆

发表于 2020-4-28 11:27:22 | 显示全部楼层
wye11083 发表于 2020-4-2 21:31
用任何方式看都可以,UART,USB,etc。逻辑分析仪是最笨的办法。

小资源fpga,调试伤不起,项目开始阶段得用资源多很多的pintopin的先调试
(4731440)

出0入12汤圆

发表于 2020-6-11 12:44:47 | 显示全部楼层
请教一下楼主,vivado调用modelsim仿真时,每次代码修改都要重新打开modelsim吗,有没有办法在modelsim中只编译修改的部分,然后直接重新开始仿真?
(4730440)

出0入8汤圆

 楼主| 发表于 2020-6-11 13:01:27 来自手机 | 显示全部楼层
xxdd 发表于 2020-6-11 12:44
请教一下楼主,vivado调用modelsim仿真时,每次代码修改都要重新打开modelsim吗,有没有办法在modelsim中只 ...

modelsim我也不会用它直接仿真。但是并不算太耗时啊。你要是折腾fpga把cpu换成最新的吧,r7 3700x起步,固态换nvne,能节省一大半编译时间。
(4719880)

出0入12汤圆

发表于 2020-6-11 15:57:27 | 显示全部楼层
wye11083 发表于 2020-6-11 13:01
modelsim我也不会用它直接仿真。但是并不算太耗时啊。你要是折腾fpga把cpu换成最新的吧,r7 3700x起步, ...

那你怎么仿真呢?
(4717187)

出0入8汤圆

 楼主| 发表于 2020-6-11 16:42:20 来自手机 | 显示全部楼层
xxdd 发表于 2020-6-11 15:57
那你怎么仿真呢?

ise直接调
(4454334)

出0入4汤圆

发表于 2020-6-14 17:43:13 来自手机 | 显示全部楼层
xxdd 发表于 2020-6-11 12:44
请教一下楼主,vivado调用modelsim仿真时,每次代码修改都要重新打开modelsim吗,有没有办法在modelsim中只 ...

可以只运行modelsim,运行仿真,修改代码,确认代码没问题了,再启动vivado进行综合布局布线。
(3458772)

出140入0汤圆

发表于 2020-6-26 06:15:55 | 显示全部楼层
本帖最后由 neqee 于 2020-6-26 06:19 编辑

(6)批量产品总有异常。——做约束时把时钟加快10~30%,比如输入25M就约束到30M以上。因为FPGA也是有体质差异的,一般建议用最快的器件添加至少10%的时序余量生成bin,然后用普通的片子来跑。目前产品已用上千片,全部是-3生成bin,-2C片子日常用,各种环境下没发现一例时序问题。

~~~做时序约束时,选好器件之后,ise软件就已经考虑了器件个体差异,如果出问题,可能是你没有考虑晶振或时钟的抖动,所以不建议约束时把时钟加快来约束,而是约束时加上晶振或时钟的抖动。另外不理解你为什么在最快的片子上加大约束来生成bin再到普通的片子上跑?多此一举而且不严谨
(3453367)

出0入8汤圆

 楼主| 发表于 2020-6-26 07:46:00 来自手机 | 显示全部楼层
neqee 发表于 2020-6-26 06:15
(6)批量产品总有异常。——做约束时把时钟加快10~30%,比如输入25M就约束到30M以上。因为FPGA也是有体质 ...

器件批量一致性是不可靠的。而且我们是应用在24x365场合的。加抖动解决不了所有问题,留出足够余量才能做到。
(3335246)

出0入0汤圆

发表于 2020-6-27 16:34:41 | 显示全部楼层
支持楼主,很想学习下xlinix方面的知识
(3159175)

出0入0汤圆

发表于 2020-6-29 17:29:12 | 显示全部楼层
顶个,楼主,理解深刻
(2897056)

出0入0汤圆

发表于 2020-7-2 18:17:51 | 显示全部楼层
支持楼主,只是为了这份热情舔砖····
(2839618)

出0入0汤圆

发表于 2020-7-3 10:15:09 | 显示全部楼层
来看看。。。。。。。。。。。。
(2831904)

出0入0汤圆

发表于 2020-7-3 12:23:43 | 显示全部楼层
支持楼主,逛贴也学到不少知识
(2748765)

出0入0汤圆

发表于 2020-7-4 11:29:22 | 显示全部楼层
请教楼主一个c语言enum方面的问题。
我现在在用mdk编译环境,由于程序结构的要求,enum必须为两个字节。
我现在能想到的办法是再每个type enum结构体的最后定义个16bit的变量,这样编译器会自动将enum编译为2个字节。
我使用到的type enum比较多,每个都加很麻烦。
楼主有没有好的实现type enum 2字节的方法,或者退而求其次,使用一些技巧,
让每个type enum最后自己增加一个16bit变量。

下面是我现在的实现方式:
  1. #define FORCE_ENUM_SIZE (0xFFFF)
  2. typedef enum tagSPEED_CONTROL_SOURCE
  3. {
  4.   SPEED_PANEL_SRC   = 0,      /*!< Speed given by the panel                 */
  5.   SPEED_AI_CTRL     = 1,      /*!< Speed given by the analog input          */
  6.   SPEED_COM_CTRL    = 2,      /*!< Speed given by the modbus protocol       */
  7.   SPEED_CAN_CTRL    = 3,      /*!< Speed given by the CAN(private protocol) */
  8.   ENUM_FORMAT_FILL  = FORCE_ENUM_SIZE
  9. } SPEED_CONTROL_SOURCE_T;
复制代码
(2747753)

出0入8汤圆

 楼主| 发表于 2020-7-4 11:46:14 | 显示全部楼层
本帖最后由 wye11083 于 2020-7-4 11:47 编辑
simplorer 发表于 2020-7-4 11:29
请教楼主一个c语言enum方面的问题。
我现在在用mdk编译环境,由于程序结构的要求,enum必须为两个字节。
我 ...


你这问题有点 VC和gcc等默认是int型,会占4个字节。如果enum后面跟的是个uint16,则后面的变量一般会自动对齐到变量位宽,除非指定pack大小。

通常情况下C99和C++规范是支持typedef enum : uint16_t之类的声明,表示这个enum用某一类存储大小。但是不是所有编译器都能支持。所以你可以使用typedef来做操作:

typedef uint16_t SPEED_CONTROL_SOURCE;

则例化为:SPEED_CONTROL_SOURCE tSPEED_CONTROL_SOURCE,
赋值的时候用tSPEED_CONTROL_SOURCE = (SPEED_CONTROL_SOURCE)tagSPEED_CONTROL_SOURCE::SPEED_PANEL_SRC来操作(注意域声明符只有C99/C++才支持,可以去掉,但是C++11强类型enum必须使用域声明符),会麻烦一些,或者直接关掉编译器警告。

你先试一下enum : uint16_t声明,看看能不能编译过。不行的话就重新指定uint16_t 为enum名。据我的试验,VC6只能用后者,gcc都可以用。
(2746802)

出0入0汤圆

发表于 2020-7-4 12:02:05 | 显示全部楼层
wye11083 发表于 2020-7-4 11:46
你这问题有点 VC和gcc等默认是int型,会占4个字节。如果enum后面跟的是个uint16,则后面的变量 ...

我知道要求有些蛋疼
mdk中编译器会根据enum赋值的情况自动调整enum占用的字节数,编译选项可以指定为int型,这又与我的要求不符。
您提出的这种方式有些复杂,项目中不大合适。
我再研究一下,多谢回复。
(1857384)

出0入0汤圆

发表于 2020-7-14 19:05:43 | 显示全部楼层
simplorer 发表于 2020-7-4 12:02
我知道要求有些蛋疼
mdk中编译器会根据enum赋值的情况自动调整enum占用的字节数,编译选项可以指 ...

我与层主有同样的需求,
因此我的enum是作为一个modbus寄存器,而modbus寄存器必须是16-bit的。
我使用IAR for MSP430编译环境,也是采用层主相同的方法,因为也不支持enum xxx : uint16_t语法。
(638385)

出0入0汤圆

发表于 2020-7-28 21:42:22 | 显示全部楼层
C++使用线程可以100ms执行一次吗?线程开启后,CPU使用率占到50%,有什么办法解决?
(637831)

出0入8汤圆

 楼主| 发表于 2020-7-28 21:51:36 来自手机 | 显示全部楼层
zw_7627 发表于 2020-7-28 21:42
C++使用线程可以100ms执行一次吗?线程开启后,CPU使用率占到50%,有什么办法解决? ...

加个sleep就搞定了
(488909)

出0入0汤圆

发表于 6 天前 | 显示全部楼层
为楼主的无私奉献点个赞!
(485884)

出0入0汤圆

发表于 6 天前 来自手机 | 显示全部楼层
为楼主的无私奉献点个赞!最近没有时间上网!来冒个泡!
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-8-5 07:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表