【FPGA-DSP】第六期:Black Box调用流程

目录

1. 实际操作流程

1.1 Verilog 代码编写

1.2 system generator操作

1.2.1 Black box模块

1.2.2 Simulink 搭建

2. Simulink模型优化 


System Generator是一个Xilinx公司的工具,用于设计数字信号处理系统。Black Box是System Generator中的一个block,可以将其他HDL文件以黑盒的形式封装到System Generator设计中,在仿真时使用Simulink+Vivado Simulator(或ModelSim)协同仿真的方法,在Simulink环境中完成设计的仿真测试,即使用verilog代码进行编写,并在system generator中完成调用。参考:[R1],[R2]

下面开始实际操作演示~

1. 实际操作流程

1.1 Verilog 代码编写

简单编写一个通过计数器timer_cnt来控制4个LED灯的亮灭

module led(
    input           clk         ,
    input           rst_n       ,
    input           ce          ,//使用Block box时,时钟clk和时钟使能ce是必须要包含的,同时命名要满足规范
    output reg[3:0] led         //四个LED灯
);

reg[31:0] timer_cnt;

always@ (posedge clk or negedge rst_n)
begin
  if(!rst_n)//复位:初始化
  begin
    led <= 4'd0;
    timer_cnt <= 32'd0;
  end
  else if(timer_cnt >= 32'd49) //每过50个clk周期
  begin
    led <= led + 4'd1;  //每过50个时钟周期,LED灯依此亮灭(LED亮灭频率由timer_cnt决定)
    timer_cnt <= 32'd0;//计数器清零
  end
  else
  begin
    led <= led;
    timer_cnt <= timer_cnt + 32'd1;//计数过程
  end
end

endmodule

1.2 system generator操作

1.2.1 Black box模块

通过system generator打开matlab,并打开simulink界面,首先将空白模型保存,我的保存路径为:

E:\FPGA\FPGA_DSP\Black_box\simulink\blackbox_demo.slx

然后在空白模型中调用black box模块

【FPGA-DSP】第六期:Black Box调用流程_第1张图片

并在该模块中添加我们的led.v代码,如下图所示,输入仅为rst_n和led引脚,clk和ce引脚没有显示

【FPGA-DSP】第六期:Black Box调用流程_第2张图片

当我们添加好代码之后,可以看到在matlab中会自动生成对应的config配置文件

【FPGA-DSP】第六期:Black Box调用流程_第3张图片

在该配置文件中,clk和ce被特别声明,引脚被隐藏,在内部已经被链接,这就是为什么在simulink的black box模块中没有显示的原因

【FPGA-DSP】第六期:Black Box调用流程_第4张图片

接下来开始我们的simulink模块搭建

1.2.2 Simulink 搭建

  • rst_n输入

由于rst_n输出只有0、1两种(真假),因此用布尔型表示

【FPGA-DSP】第六期:Black Box调用流程_第5张图片

  • led输出 

【FPGA-DSP】第六期:Black Box调用流程_第6张图片

注意:我们基于上图直接运行的话,示波器是没有任何显示的。原因是因为在开始运行的时候并未进行初始化,没有初始化寄存器,即没有进行复位操作,led寄存器就会没有输出 

  • 复位信号设置

通过将计数器,比较器,常数模块相结合来构造复位信号

计数器 常数模块
【FPGA-DSP】第六期:Black Box调用流程_第7张图片 【FPGA-DSP】第六期:Black Box调用流程_第8张图片

【FPGA-DSP】第六期:Black Box调用流程_第9张图片

模型构建分析:计数器从0~1023,一共1024个时钟周期归零一次,常数模块恒定为0,通过比较器将二者相比较,当计数器与常数模块相等(Counter=Constant=0)时,比较器模块输出为1(真),然而计数器每过1024个时钟周期归0一次,因此每隔1024个时钟周期比较器输出1,其余均输出0,然而blackbox模块为低电平复位,因此我们将比较器的输出取反,即可实现每隔1024个时钟周期复位一次。 

结果如下图所示:

【FPGA-DSP】第六期:Black Box调用流程_第10张图片

从上图可以看出示波器现实的led输出结果并不是我们期望的看到的结果,虽然上图现实的结果是正确的,但是不能与实际led的亮灭相对应,因此下面将使用一个额外模块来将输出结果与我们的led实际状态相对应

2. Simulink模型优化 

我们知道上述的4位led输出可以表示0~15共16个不同值,如上图结果所示,但是这样不能直观地与led的亮灭相结合,因此我们需要将led的四bit按位输出,每一位就可以表示不同led灯的状态。

模块所在位置 模块配置
【FPGA-DSP】第六期:Black Box调用流程_第11张图片 【FPGA-DSP】第六期:Black Box调用流程_第12张图片

由于我们要依此取出4bit,因此offset of top bit选项需要从0一次填写到-3,其中0代表MSB,-3代表LSB

【FPGA-DSP】第六期:Black Box调用流程_第13张图片

注意:FPGA模块最好不要与simulink中的模块(Scope)直连,需要经过input/output getway将FPGA的数据格式转化为matlab所需格式,从图中可以看出,我们的black box模块输出到matlab的scope时就没有经过output getway因此该模块上面会显示感叹号,Simulink报错如下 

意思是:外部连接块定义为不经过网关直接驱动Simulink/非sysgen块的块。例如,SysGen块的输出端口连接到Simulink Scope的输入端口。这个特性将在SysGen的未来版本中被移除。下表列出了具有这种连接的块。修改设计,插入网关,并关闭“转换成输出端口”。同时,带有打开信号记录的端口的Sysgen块被归类为外部连接块。有关更多详细信息,请参阅sysgenfeatuereport .htm。
禁用此模型的特性警告。 所以我们需要添加一个output getway即可

【FPGA-DSP】第六期:Black Box调用流程_第14张图片

添加好之后可以发现再也没有报错了,完美~  

示波器输出结果如下所示:

【FPGA-DSP】第六期:Black Box调用流程_第15张图片

 结果正确! 在1024个采样点处rst_n = 0,清零。

你可能感兴趣的:(FPGA,fpga开发,matlab)