soc中如果让FPGA和HPS同时控制某一个输入或输出会不会出现矛盾?
这是我之前问别人的一个问题。
其实答案很明显,让FPGA和HPS同时控制某一个输入或输出是不可能的事情。就是我太笨,不知道怎么去想这个问题,所以还是试了一下。
我还是记录一下,免得哪天又问自己这个傻问题。
问题是这么来的:
de1-soc上FPGA和HPS可以通信,FPGA的外设可以由FPGA自己控制,而HPS也可以通过AXI bridge控制FPGA的外设。由于FPGA的工程文件在Quartus中编译,而HPS中的可执行文件是由.c文件生成的,并且在在下载时也是Quartus工程文件下载到FPGA,可执行文件在HPS中运行。所以我觉得这两个过程基本上分开,应该不会相互干扰。那么如果让FPGA和HPS同时控制某一个输入或输出会不会出现矛盾?比如,FPGA的外设LED灯,假设在FPGA中用拨码开关控制,而在HPS中又让它以另一种固定方式亮灯,那么结果会变成怎样?
额,,,,然后我就建了一个工程,Qsys生成的系统中含LED和开关,又在FPGA的顶层文件中让LED随开关亮灭。如下图
。。。。
其实稍微不是我这样反应迟钝的也该发现问题了,不过我这笨笨还是要分析综合后才意识到问题的。。。
添加相应文件后分析和综合出错:(类似这样的)object HEX0 declared in a list of port declarations cannot be redeclared within the module body
如图
我是笨蛋。其实还是因为对FPGA和HPS之间的通信不理解。
那个叫做Qsys的东西,生成的文件中有一个模块module,这个模块就像我们一般自己写的模块那样。在FPGA的工程中,我们在顶层文件中实例化这个模块,从而让HPS通过AXI bridge控制FPGA的外设。而在实例化这个模块时,LEDR作为输出,相当于已经确定LED的输出由谁决定,此时再在FPGA中写LED由谁决定输出就会报错。
唉,两种方式控制一个东西的状态,肯定会打架的嘛。
同时可以看到,同样传到Qsys生成的系统中的KEY[0]和KEY[1],因为是作为输入就没有报错。而同样作为输出的HEX0,也报了同样的错误。
我居然问这种问题。。。其实以前写verilog文件时编译出错时就犯过两个地方对同一个输出赋值的情况,也是这样子报错的。。。额。。。我错了。。。居然在同一个地方跌倒了。。。