草庐IT

基于Matlab中Simulink生成FPGA-Verilog语言及联合Vivado的仿真(以卡尔曼-Kalman滤波器为例)

喜西 2024-05-29 原文

目录

一、简介

  此内容基于博文:基于Matlab Hdl Coder实现FPGA程序开发(卡尔曼滤波算法实现)实现,Simulink仿真构建参考于上链接中。
  本博文解决了上博文中无法生成Verilog语言的问题,并对于自动生成的Verilog——testbench文件进行了优化——通过matlab产生信号及白噪声,并将信号数据载入到Vivado-tb文件中,最终通过vivado软件自带仿真器进行观察。

二、在Simulink中生成Verilog语言

1、在Simulink中建立Kalman滤波器仿真

  此处进行简单演示,建立好的Kalman滤波器模型如下图所示。

2、将Kalman滤波器部分打包

  将创建好的滤波器模型打包为一个模块,便于之后将此模块转换为Verilog语言——全选后点击“create subsystem”;

  生成模块后可添加信号及示波器观察Kalman功能是否正常。

3、生成Verilog程序

3.1、参数配置

  1、点击simulation进行Model Configuration Parameters配置;

  2、点击Solver,将Solver selection_Type改为Fixed-step,其余默认,点击apply应用;

  3、点击Hardware Implementation,将Device vendor设置为ASIC/FPGA,其余默认,点击apply应用;

  4、设置芯片型号及时钟频率,其余默认,点击apply应用;

  5、将复位电平设置为低电平有效,其余默认,点击OK完成参数配置。

  6、关联Vivado软件,进行联合编译:在matlab命令窗口输入命令,hdlsetuptoolpath (‘ToolName’,‘…’,‘ToolPath’,‘…’),具体用法可右键参照帮助。

3.2、HDL Code代码生成

  1、Code–HDL Code–HDL W… A… 打开工作区,进行相关配置,并检查错误;

  2、选择Kalman模块,生成相应程序;

  3、在工作区1.1中将综合工具选为相应编译器,之前的相关配置会自动填充,之后点Apply应用;在1.2中将时钟频率设为相应频率,Apply即可;

  4、右击Set Target ,Run All完成此部分设定;

  5、在3.1.1中,将语言选择为Verilog;在3.1.5中,将Generate RTL code和Generate test bench勾选;在3.2中,勾选Generate RTL Code与Generate Testbench,点击Apply;在3.3中勾选Skip This Task;其余默认即可,记得完成每一步配置后点击Apply;然后Run all第3部分;

  6、此时3.2部分会报错,这里点击下图所示,将实数检查设为none/warning(因为Verilog语言在综合时不允许有浮点数存在,所以会报错,我们这里仅进行仿真,所以忽略此错误);

  7、再次Run All第三部分,完成Verilog程序生成;(因为我们这里仅进行了仿真所以不需要进行Run第4部分综合编译,且生成的程序中存在real类型变量,不能进行综合)。

三、Vivado中实现Kalman滤波仿真

1、在Vivado中创建工程并将Kalman.v与Kalman_tb.v文件添加到工程中

2、在Matlab中生成波形文件,代码如下

  其中cosy_dig为叠加了白噪声的混合信号。

fc          = 0.25e6 ;      % 中心频率
Fs          = 50e6 ;        % 采样频率
T           = 1/fc ;        % 信号周期
Num         = Fs * T ;      % 周期内信号采样点数
t           = (0:Num-1)/Fs ;      % 离散时间

cosn        = cos(2*pi*fc*t) ;    % 信号

snr=10;
px_dBW=10;
pn_W=10^((px_dBW-snr)/10);
n=sqrt(pn_W)*randn(1,length(cosn));%噪声

y1=mapminmax(cosn+n);
cosy_dig    = floor((2^11-1) * y1 + 2^11) ;        %幅值扩展到 0~4095
cosy_dig1    = floor((2^11-1) * n + 2^11) ;        %幅值扩展到 0~4095
cosy_dig2    = floor((2^11-1) * cosn + 2^11) ;     %幅值扩展到 0~4095

fid         = fopen('E:\JXR\FPGA\matlab\Kalman1\whitenosie.dat', 'wt') ;  %写数据文件
fprintf(fid, '%x\n',cosy_dig1) ;
fclose(fid) ;

fid1         = fopen('E:\JXR\FPGA\matlab\Kalman1\sin.dat', 'wt') ;  %写数据文件
fprintf(fid1, '%x\n', cosy_dig2) ;
fclose(fid1) ;

fid2         = fopen('E:\JXR\FPGA\matlab\Kalman1\cosy_dig.dat', 'wt') ;  %写数据文件
fprintf(fid2, '%x\n', cosy_dig) ;
fclose(fid2) ;


figure('name','混合信号时域波形');
subplot(221);plot(cosy_dig1);hold on ;
subplot(222);plot(t,cosy_dig2) ;hold on ;
subplot(223);plot(t,y1) ;hold on ;
subplot(224);plot(t,cosy_dig) ;

3、重写tb仿真文件

  生成的tb文件很乱,我这里重新写了tb文件,并将matlab中生成的波形数据载入,具体代码如下:

`timescale 1ns / 1ps

module Kalman_tb;

  parameter    NIN  =12 ;  //matlab中生成文件数据位宽为12

    reg              clk;        
    reg              rstn;      
    reg              en; 
    reg              [63:0] In1; 
    wire                 ce_out;     
    wire             [63:0] Out1;
        
 //============== 200MHz clk generating=======================
    localparam   T200M_HALF    = 2.5000;
    initial begin
        clk = 1'b0 ;
        forever begin
            # T200M_HALF clk = ~clk ;
        end
    end    
  //========reset and finish=============
    initial begin
        rstn = 1'b0 ;
        # 30 ;
        rstn = 1'b1 ;
        # (T200M_HALF * 2 * 2000) ;
        $finish ;
    end   
//=====read cos data into register ========                     
    parameter    SIN_DATA_NUM = 200 ;
    reg          [NIN-1:0] stimulus1 [0: SIN_DATA_NUM-1] ;
    integer      i ;

    initial begin
        $readmemh("E:/JXR/FPGA/matlab/Kalman1/cosy_dig.dat", stimulus1) ;    //提取加噪声后的波形数据
        i         = 0 ;
        en        = 0 ;
       In1  =0;
        # 200 ;
        forever begin
            @(negedge clk) begin
                en          = 1 ;
                In1         = stimulus1[i] ;
                if (i == SIN_DATA_NUM-1) begin
                    i = 0 ;
                end
                else begin
                    i = i + 1 ;
                end
            end
        end
    end

Kalman Kalman_u(
    .clk        (clk),
    .reset      (rstn),
    .clk_enable (en),
    .In1        (In1),
    .ce_out     (ce_out),
    .Out1       (Out1)
);
 
endmodule  // kalman_tb

4、Vivado中仿真编译

  仿真结果如下所示:

四、小结

  比较初步的实现了simulink仿真转换为Verilog语言程序在vivado中的Kalman滤波仿真,不足之处是程序中变量均为real型,不能综合编译烧录于实际硬件中,还有待改进,望能共同交流协作。

有关基于Matlab中Simulink生成FPGA-Verilog语言及联合Vivado的仿真(以卡尔曼-Kalman滤波器为例)的更多相关文章

  1. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  4. u盘安装系统(win10为例) - 2

    下载微PE工具箱进入官网下载微PE工具箱-下载 安装好后,打开微PE工具箱客户端,选择安装PE到U盘 PE壁纸可选择自己喜欢的壁纸,勾选上包含DOS工具箱,个性化盘符图标 下载原版系统进入网站下载镜像NEXT,ITELLYOU如果没有账号,注册一下就好进入选择开始使用选择win10 这里我们选择消费者版,用迅雷把BT种子下载下来 下面的两个盘符,是PE工具箱安装进U盘后,分成的盘符,注意EFI的盘符,这里面不能删东西,也不能添东西,另一个盘符可以当做正常的U盘空间使用,我们现在需要把下载下来的景象文件复制到正常的U盘空间中去 这个时候我们的系统U盘就只做好了 安装系统我们将U盘插入电脑,开机,

  5. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  6. Verilog使用inout信号的方法 - 2

    目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电

  7. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  8. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  9. 【华为OD技术面试 | 真八股 】MySQL联合索引,谈springIOC的理解,谈springAOP的理解,Erika和zookeeper等问题 - 2

    文章目录华为OD面试流程1.mysql数据库建了两个字段,且设置了联合索引,如果其中有一个字段为空会出现什么问题?2.谈谈springIOC的理解,有什么好处,解决了什么问题3.谈谈springAOP的理解,切面编程有没有实际应用,有哪些注解,作用是什么,有那些应用场景?4.Erika和zookeeper有了解过吗,作用是什么,主要解决了什么问题5.谈谈JDK、JRE、JVM的理解,区别是什么6.谈谈对泛型的理解7.JVM的组成华为OD面试流程机试:三道算法题,关于机试,橡皮擦已经准备好了各语言专栏,可以直接订阅。性格测试:机试技术一面(本专栏核心)技术二面(本专栏核心)主管面试定级定薪发of

  10. ruby - 如何从两个哈希数组中获取联合/交叉/差异并忽略一些键 - 2

    我想从两个哈希数组中获取并集/交集/差集,例如:array1=[{:name=>'Guy1',:age=>45},{:name=>'Guy2',:age=>45}]array2=[{:name=>'Guy1',:age=>45},{:name=>'Guy3',:age=>45}]...parray1-array2=>[{:name=>"Guy2",:age=>45}]parray2-array1=>[{:name=>"Guy3",:age=>45}]parray1|array2=>[{:name=>"Guy1",:age=>45},{:name=>"Guy2",:age=>45},{:

随机推荐