Zynq开发实践(SDK之自定义IP2 - FPGA验证)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

既然准备好了verilog代码,也在iverilog工具上面仿真过了,下面是不是就可以直接做成ip了。答案肯定是否定的,因为仿真ok的内容,直接fpga部署的时候,有可能会出现各种问题。至于会出哪些问题,这里简单总结下。

1、使用了不能综合的语法

在verilog里面,很多的语法是没有办法进行fpga部署的,所以如果类似于循环这样的语法,只能用在testbench上面,而不能出现在工程代码里面。这一类错误特别容易发生在刚转verilog开发的同学身上,尤其是c转verilog的同学。

2、组合逻辑过长的问题

这是比较头疼的一个问题。因为仿真的时候,所有的计算都是cpu帮助做的,而不是真实的逻辑门算出来的。所以这个时候,即使发生组合逻辑过长的问题,也是没有办法发现的。除非是综合部署的时候,我们才知道最长执行路径是多少。

3、寄存器到io口的距离问题

如果是仿真,外部的激励都是通过testbench直接赋值的。但如果是真实的电子器件,上面的信号是有抖动的。这种情况下要么加上功能开关,要么要两级延迟处理。如果没有这一步,很有可能我们采样得到的数据就是不对的。一旦采样数据不对,后面的功能和状态机都是无从谈起了。

4、寄存器宽度设置不对

比如我们仿真的时候,一般状态机的flag,或者是counter计数不需要那么多。但是fpga不一样,起步输入时钟就是50M,如果倍频一下有可能达到100M、200M。这种情况下,计数还是那么小就不合适了。此时,就会想到改计数范围。但是很多时候,我们发现修改了之后没有作用,这样查找了半天才发现是宽度范围的问题。

所以,比如8位的范围是255,16位的范围是65000多,24位的范围是1700万左右,32位的范围是40多亿。这些常用的范围一定要熟记于心。

5、使用了magic number

很多人喜欢直接用magic number来触发状态的变更。这种代码一开始写的时候,可能比较好理解,但是时间长了很容易就忘记里面的含义。此外,还有一个很大的潜在危险,那就是我们需要变更代码的时候,如果一部分发生修改,另外一部分没有发生修改,就很容易陷入自我怀疑当中。因此,养成良好的习惯,有助于解决一类的问题。

6、添加了错误的pin脚

pin脚如果忘记添加,这都还好说,但是如果是加错了,这类问题就需要用示波器进行查找了。fpga的eda工具只能保证生成的bitfile是对的,已经route到对的pin上面。但是如果pin本身就是错误码的,那确实就比较难查了。很多同学会误以为这种问题很简单,殊不知电路图上,上下对齐看走眼pin脚,其实是经常发生的事情。

7、修正后的verilog代码

最后我们给出修正后的呼吸灯verilog代码,代码如下,

复制代码
module breathe_led(
	input rst, 
	input clk, 
	output led); //in fact it is wire

// about local param

localparam FREQ_COUNT  = 24'd500000;
localparam CATCH_COUNT = 24'd400000;
localparam STEP        = 10'd1000; 

// inner wire & reg

reg[23:0] freq;
reg[23:0] catch;
reg state;
reg next_state;

// about state machine
 
always@(posedge clk or negedge rst)
	if(!rst)
		state <= 0;
	else
		state <= next_state;

always@(*)
	if(state == 0 && catch > CATCH_COUNT)
		next_state <= 1;
	else if(state == 1 && catch == STEP)
		next_state <= 0;
	else
		next_state <= state;


// basic frequency
 
always @(posedge clk or negedge rst)
    if (!rst) 
        freq <= 24'h00;
	else if (freq == FREQ_COUNT)
		freq <= 24'h00;
	else
		freq <= freq + 1;

// part ratio in each part

always @(posedge clk or negedge rst)
	if(!rst)
		catch <= 24'h00;
	else if(freq == FREQ_COUNT)
	begin
		case (state)
			0: 
				catch <= catch + STEP;
			1: 
				catch <= catch - STEP;
			default: 
				catch <= catch;
		endcase
	end

// output signal defined here

assign led = (freq >= catch) ? 0:1;
	
endmodule

对应的约束文件如下,有兴趣的同学可以实际跑一下。

相关推荐
坏孩子的诺亚方舟6 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐6 天前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐6 天前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH7 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡7 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安7 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐8 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯8 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客8 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA8 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发