【FPGA项目】System Generator算法板级验证-快速搭建外围测试电路

🎉欢迎来到FPGA专栏~System Generator算法板级验证-快速搭建外围测试电路


  • ☆* o(≧▽≦)o *☆~我是小夏与酒🍹
  • 博客主页:小夏与酒的博客
  • 🎈该系列文章专栏:FPGA学习之旅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️
    FPGQ2

优快云

遇见未来

一、效果演示

🔸项目介绍

使用System Generator搭建算法时,为了快速进行算法正确性的板级验证,只需要将算法的算法时钟端口数据输入端口结果输出端口保留,如下图所示:
sysgen
为了控制算法模块,需要实现数据输入的控制算法启动数据输出的控制等。本篇文章搭建简单的外围电路实现对sysgen算法的控制和执行。

🔸项目演示效果

在本项目中,使用Verilog HDL编写了一个和使用System Generator搭建的算法模块类似的模块,该模块实现的功能是对输入的两个32位的非负整型数据进行相加。该模块有时钟端口复位端口两个数据输入端口一个数据输出端口,如下图所示:
算法模块
使用matlab生成两组1-100随机非负整数,每组数据的个数为100个两组数据以及两组数据对应数据之和的波形绘图如下所示:
matlab
将两组数据存为bin文件并输入到FPGA中执行求和算法,将算法执行结果导出进行数据进制转换并使用matlab画图得到的结果如下所示:
FPGA结果
将FPGA运算得到的结果与matlab运算得到的结果进行对比,算法执行结果一致,如下图所示:
最终结果
本项目的完整系统包括时钟模块、vio控制、串口收发模块、计数器模块、ram控制模块、算法使能模块和算法模块。FPGA系统的RTL视图如下所示:
RTL

🔸操作过程演示

FPGA开发板与电脑连接:
实际连接图
系统串口波特率为115200

项目主要使用到vio控制串口助手收发数据,串口将bin文件数据发送给FPGA并存入到ram1ram2中,运行算法之后的结果存储到ram3中,通过控制从串口将结果数据读出。vio使用4个输出信号控制系统:信号1置为高电平时,存入第一组bin文件数据到ram1中;信号2置为高电平时,存入第二组bin文件数据到ram2中;信号3置为高电平时,执行sysgen算法模块信号4置为高电平时,将ram3中的结果数据通过串口读取出来。操作过程视频如下所示:

【FPGA项目】System Generator算法板级验证

二、说明

本项目基于《【FPGA项目】bin文件ram存取回环测试》来搭建完整的板级验证系统,建议小伙伴们可以先学习该篇文章的知识点。

需要该项目中的串口助手软件或者项目工程文件的小伙伴,直接加入QQ群,在群文件中搜索下载即可QQ群862135231
matlab版本:R2020b
vivado版本:2020.2
开发板型号:AXKU040
接口连接如下所示:
接口
工程文件目录结构如下所示:
目录结构

三、Matlab数据存为bin文件

关于bin文件的介绍和使用bin文件存储数据的原因,在该篇文章中已经做了讲解:《【FPGA项目】bin文件ram存取回环测试》

通过串口将sysgen算法模块的运行结果导出时,串口助手可以将数据保存为hex格式,需要对数据进行简单的处理,再通过matlab将十六进制的结果数据转换成十进制即可。

本项目中的matlab代码如下,根据需要运行相关代码片段即可:

%% bin文件生成代码:生成两个随机波形数据的bin文件
%----------------------------------------------------
% 首先生成1-100的double类型随机整数;
% 将double类型随机整数转换为32位数据;
% 将转换后的数据保存为bin文件。
%----------------------------------------------------
clear;
clc;
close all;
% 生成1-100的double类型随机整数
random_data1 = randi([1 100], 1, 100);
random_data2 = randi([1 100], 1, 100);

% 将double类型数据转换为uint32类型
random_data1_uint32 = uint32(random_data1);
random_data2_uint32 = uint32(random_data2);

% 画图
figure;
x = 0:1:100-1;
subplot(3,1,1);
plot(x,random_data1_uint32,'b');
title('random data1');
grid on;

subplot(3,1,2);
plot(x,random_data2_uint32,'g');
title('random data2');
grid on;

subplot(3,1,3);
plot(x,random_data1_uint32+random_data2_uint32,'r');
title('random data1 + random data2');
grid on;

% 将数据保存为bin文件
fid = fopen('random_data1.bin', 'wb');
fwrite(fid, random_data1_uint32, 'uint32');
fclose(fid);
fid = fopen('random_data2.bin', 'wb');
fwrite(fid, random_data2_uint32, 'uint32');
fclose(fid);

disp('波形数据已生成并保存为random_data1.bin和random_data2.bin');

%% 读取txt文档中的数据,并转换成十进制
file_path = 'Rec240626210210.txt'; % 替换为实际文件路径
fileId = fopen(file_path, 'r');

hex_values = cell(100, 1);
for i = 1:100
    hex_values{
   i} = fgetl(fileId);
end

fclose(fileId);
dec_values = hex2dec(hex_values);

figure;
x = 0:1:100-1;
plot(x,dec_values);
title('FPGA');
grid on;

% 画图
figure;
x = 0:1:100-1;
subplot(4,1,1);
plot(x,random_data1_uint32,'b');
title('random data1');
grid on;

subplot(4,1,2);
plot(x,random_data2_uint32,'g');
title('random data2');
grid on;

subplot(4,1,3);
plot(x,random_data1_uint32+random_data2_uint32,'r');
title('random data1 + random data2');
grid on;

subplot(4,1,4);
plot(x,dec_values);
title('FPGA');
grid on;

四、串口收发模块

整个sysgen算法的验证都是通过vio和串口来实现的。

关于串口收发模块的详细讲解,请点击如下两篇文章进行学习:
串口发送模块:【FPGA零基础学习之旅#13】串口发送模块设计与验证
串口接收模块:【FPGA零基础学习之旅#15】串口接收模块设计与验证(工业环境)

在此附上模块代码:

串口发送模块:

//
//模块名称:串口发送模块
//
module uart_byte_tx(
	input 		Clk,
	input 		Rst_n,
	input [7:0]	data_byte,
	input 		send_en,
	input [2:0]	baud_set,
	
	output reg uart_tx,
	output reg Tx_Done,
	output reg uart_state
);

	reg bps_clk;//波特率时钟
	
	reg [15:0]div_cnt;//分频计数器
		
	reg [15:0]bps_DR;//分频计数最大值
	
	reg [3:0]bps_cnt;//波特率计数时钟
		
	//定义数据的起始位和停止位
	localparam START_BIT = 1'b0;
	localparam STOP_BIT  = 1'b1;
	
	reg [7:0]r_data_byte;//数据寄存器
	
//--------<uart状态模块>--------	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			uart_state <= 1'b0;
		else if(send_en)
			uart_state <= 1'b1;
		else if(bps_cnt == 4'd11)//bps_cnt计数达到11次,即发送结束
			uart_state <= 1'b0;
		else
			uart_state <= uart_state;
	end

//--------<使能分频计数模块>-------	
//	assign en_cnt = uart_state;
	
//--------<寄存待发送的数据,使数据保持稳定>--------
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			r_data_byte <= 8'd0;
		else if(send_en)
			r_data_byte <= data_byte;
		else
			r_data_byte <= r_data_byte;
	end
	
//--------<波特率查找表>--------		
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			bps_DR <= 16'd5207;
		else begin
			case(baud_set)
				0:bps_DR <= 16'd5207;
				1:bps_DR <= 16'd2603;
				2:bps_DR <= 16'd
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小夏与酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值