FPGA 学习分享-- 05 例化与仿真

一. 实验内容

  通过具体例程,学习vivado软件的下述功能:
  1.例化:04节fifo核的使用
  2.仿真:01节流水灯

二. 例化

2.1 概论

依我看,例化其实就是C语言的函数调用。这样做方便整体代码修改,以及模块化编写程序。咱们就带着函数调用的思想去学习例化的语法规则就好。

2.2 例化框架

例化的大体框架如下:

引用的外部模块名字  此模块的新名字 (
  .外部参数1					(对应的内部参数1),         
  .外部参数2					(对应的内部参数2),   		
  .外部参数3					(对应的内部参数3),     
  .外部参数4					(对应的内部参数4),  
  ......
  ......
  .外部参数n					(对应的内部参数n)
             //注意:最后一个参数的括号后面没有逗号
);

这是fifo核的例化。

fifo_generator_0 u_fifo_generator_0 (
  .clk					(clk),         
  .srst					(~rst_n),   		
  .din					(wr_data),     
  .wr_en				(wr_en),  
  .rd_en				(rd_en),  
  .dout					(rd_data),    
  .full					(full),    
  .empty				(empty)  
);

外部模块名为fifo_generator_0,
一般的,新名字都是 “u_模块名” ,即u_fifo_generator_0

再来看看参数。

外部参数名内部参数名
clkclk
srst~rst_n
dinwr_data
doutrd_data

没有列举完哈,这几个参数比较典型,拉出来说说。


fifo核自带的时钟名字为clk,我们定义的时钟名为clk
fifo核自带的复位名字为srst,我们定义的复位名为rst_n
(但因为srst为高电平有效,rst_n为低电平有效,所以取反)
fifo核自带的写数据名字为din,我们定义的写数据为wr_data
fifo核自带的读数据名字为dout,我们定义的读数据为rd_data


由此可见,外部参数和内部参数的名字不要求一致,只要他们代表的意义一样即可。
但内部参数对应的数据类型一般都是wire类型,这点还希望大家注意一下。

同理,ILA例化也是一样的框架。

ila_0 u_ila_0 (
	.clk             (clk), 	// input wire clk
	.probe0          (probe0) 	// input wire [26:0] probe0
);

值得一提的是,probe0参数有27位,但只是一个参数!
所以只占用一个外部参数名。

wire   [26:0]  probe0;

assign probe0[0] = clk;          
assign probe0[1] = rst_n;
assign probe0[2] = wr_rd_flag;
assign probe0[3] = wr_en;
assign probe0[4] = rd_en;
assign probe0[12:5] = wr_data[7:0];
assign probe0[20:13] = rd_data[7:0];
assign probe0[21] = full;
assign probe0[22] = empty;
assign probe0[26:23] = cnt_dly[3:0];

三. 仿真

3.1 概论

选择仿真大致有两个情况:

  1. 不上电,先行验证代码的正确性
  2. 没有板子,只能通过仿真来进行观看结果

据我所知,一般在实验或者工程上电之前,都会进行仿真,一旦连仿真结果都是失败的错误的,那么也就不必去上电了。所以学会仿真是必要的。

3.2 建立仿真文件

我在01节仿真部分已经带着大家一起建立过仿真文件了,在此处就不耽误大家时间了,有需要的同学可以去01节看看喔。

FPGA学习分享–01 led流水灯的实现

3.3 编写仿真代码

仿真仿真,就是要模仿真的。真的具有什么,放出来的结果应该也具有什么特点。
所以,我们在仿真中需要实现
1.系统时钟的编写
2.复位信号的切换
3.结合具体情况的一些其他功能
当然,也要确保仿真模块的代码语法的正确性。下面我们就以01节仿真代码为例,来看看这一必要的仿真模块到底长什么样。

`timescale 1ns / 1ps   

module tb_led_stream();

reg         sys_clk;       
reg         sys_rst_n;    

wire  [3:0] led;
              
initial begin         //初始化                        
	sys_clk = 1'b0;
	sys_rst_n = 1'b0;
	#1 sys_rst_n = 1'b1;
end 

always #10 sys_clk = ~sys_clk;    //定义一个50M赫兹的时钟

led_stream u_led_stream(      //例化
.clk                  (sys_clk),        
.rst_n                (sys_rst_n),      

.led                  (led)   
);

endmodule

咱们一个部分一个部分的讲解:

  1. 单位时间:
`timescale 1ns / 1ps   

这个代表了在仿真模块中的单位时间为1ns,精度为1ps。
举个例子,"#10"就代表经过10ns.

  1. 仿真变量:
reg         sys_clk;       
reg         sys_rst_n;    

我要实现时钟和复位信号,就必然要先定义他们。

  1. 初始化:
initial begin         //初始化                        
	sys_clk = 1'b0;
	sys_rst_n = 1'b0;
	#1 sys_rst_n = 1'b1;
end 

代码翻译如下:
最开始,时钟信号为低电平,复位信号为低电平,1ns之后复位信号拉高。
这和真正的板子是一致的。板子真正的复位信号,是上电瞬间为低电平有效,之后就拉高为1。时钟也是相似的道理(详见下一模块)。

  1. 时钟模块
always #10 sys_clk = ~sys_clk;    //定义一个50M赫兹的时钟

先来讲讲真正的系统时钟。
时钟信号就是不断地拉高拉低,通过记录时钟信号的上升沿即可得到时间。那么一个上升沿是多少时间呢。这就和系统的晶振有关系了。博宸电子的ZYNQ7020DEV开发板采用的是50M的晶振,即1s震动50M次。也就是时钟信号1s翻转50M次。
在这里插入图片描述
也就是说,时钟信号每隔10ns都是前一个瞬间的取反。
在这里插入图片描述
在仿真模块中,10ns后取反是
#10 sys_clk = ~sys_clk;
而时钟信号是一直每隔10ns就取反,所以必然有always语句。

always #10 sys_clk = ~sys_clk;    //定义一个50M赫兹的时钟
  1. 例化模块
    现在该把module模块例化到仿真模块中了,让仿真模块实现它的功能。
led_stream u_led_stream(      //例化
.clk                  (sys_clk),        
.rst_n                (sys_rst_n),      

.led                  (led)   
);

led_stream是module模块的模块名,直接从module中复制过来就行。剩下的例化知识就和上面讲例化是相同的。大家可以自行理解。

3.4 启动仿真

点击vivado左边的Run Simulation后就可以看到仿真图啦!

  • 46
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FPGA学习专题-DAC的使用 DAC,即数字模拟转换器(Digital-to-Analog Converter),是将数字信号转换为模拟信号的一种电子设备。在FPGA的应用中,DAC常常用于将数字信号转换为模拟信号,实现模拟输出功能。 在FPGA中使用DAC需要以下几个步骤: 1. 选择DAC芯片:根据实际需求选择适合的DAC芯片。常见的DAC芯片有很多种,包括R-2R网络型DAC、串行型DAC、并行型DAC等,根据不同的应用场景选择合适的芯片。 2. 连接硬件:将FPGA与DAC芯片进行连接。通常使用SPI、I2C、并行接口等方式进行通信。根据具体的芯片和FPGA板卡,进行正确的引脚连接。 3. 配置FPGA:在FPGA的设计中,需要配置相应的逻辑电路和接口电路,以实现与DAC芯片的通信。这涉及到FPGA开发工具和编程语言,例如使用Verilog或VHDL进行设计。 4. 驱动DAC芯片:通过FPGA发送数字信号给DAC芯片,驱动其输出模拟信号。这需要按照DAC芯片的通信规则和协议进行数据传输和控制。 5. 调试和验证:完成FPGA与DAC的连接和配置后,需要进行调试和验证。可以通过示波器或其他测试仪器,检测DAC输出的模拟信号是否符合预期。 需要注意的是,DAC的使用需要了解具体的芯片规格和通信协议,以及FPGA开发工具和编程语言。同时,对数字信号和模拟信号的特性也需要有一定的了解。 希望以上对你有所帮助,如果还有其他问题,可以继续提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值