HLS实现CORDIC算法计算正余弦并上板验证

news2024/11/13 15:17:07

硬件:ZYNQ7010
软件:MATLAB 2019b、Vivado 2017.4、HLS 2017.4、System Generator 2017.4

1、CORDIC算法计算正余弦

  CORDIC算法详细分析网上有很多资料,它的主要思想是用一系列旋转去逼近目标角度,这一系列旋转的角度为 θ = a r c t a n ( 2 − i ) \theta=arctan(2^{-i}) θ=arctan(2i) i i i 是迭代次数。下面给出了用CORDIC算法计算正余弦的代码,其中 s1 不做任何优化,数据类型都用的 float 型;s2 对数据类型做了定点数优化;s3 在 s2 的基础上,对迭代的循环做了流水线优化。

//cordic.h
#ifndef _CORDIC_H_
#define _CORDIC_H_
#include <ap_int.h>
#include <ap_fixed.h>
#define NUM_ITERATIONS 9
//#define s1
//#define s2
#define s3
#if defined s1
typedef float THETA_TYPE;
typedef float COS_SIN_TYPE;
#endif
#if defined s2 || defined s3
typedef ap_fixed<16,8> THETA_TYPE;
typedef ap_fixed<16,2> COS_SIN_TYPE;
#endif
void cordic(THETA_TYPE theta, COS_SIN_TYPE &s, COS_SIN_TYPE &c);
#endif
//cordic.cpp
#include "cordic.h"
const THETA_TYPE cordic_phase[NUM_ITERATIONS] = {
	45, 26.565, 14.036, 7.125, 3.576, 1.790, 0.895, 0.448, 0.224
	};
#if defined s1
void cordic(THETA_TYPE theta, COS_SIN_TYPE &s, COS_SIN_TYPE &c)
{
	COS_SIN_TYPE current_cos = 0.607255; // 6, 1/1.64669
	COS_SIN_TYPE current_sin = 0;
	COS_SIN_TYPE factor = 1.0;
	for(int i=0; i<NUM_ITERATIONS; i++)
	{
		ap_int<2> sigma = (theta < 0)?-1:1;
		COS_SIN_TYPE temp_cos = current_cos;
		current_cos = current_cos-current_sin*sigma*factor;
		current_sin = temp_cos*sigma*factor+current_sin;
		theta = theta-sigma*cordic_phase[i];
		factor = factor/2.0;
	}
	s = current_sin;
	c = current_cos;
}
#endif
#if defined s2 || defined s3
void cordic(THETA_TYPE theta, COS_SIN_TYPE &s, COS_SIN_TYPE &c)
{
	COS_SIN_TYPE current_cos = 0.607255; // 6, 1/1.64669
	COS_SIN_TYPE current_sin = 0;
	COS_SIN_TYPE factor = 1.0;
ITERATIONS_LOOP:
	for(int i=0; i<NUM_ITERATIONS; i++)
	{
		ap_int<2> sigma = (theta < 0)?-1:1;
		COS_SIN_TYPE temp_cos = current_cos;

		current_cos = current_cos-current_sin*sigma*factor;
		current_sin = temp_cos*sigma*factor+current_sin;
		theta = theta-sigma*cordic_phase[i];
		factor >>= 1;
	}
	s = current_sin;
	c = current_cos;
}
#endif

  三个 solution 的资源使用量和计算性能如下图所示。

在这里插入图片描述

2、上板验证

  把 s3 的模块端口设置成 ap_ctrl_none, 重新综合,导出 IP 核。在FPGA的顶层文件里例化 cordic IP 核和一个 ila IP 核,让 cordic 计算 30° 和 60° 角的正余弦值。

module cordic_test_top(
    input resetn,
    input clk
    );

wire [15:0] w_theta;
reg [15:0] r_theta;
reg [31:0] cnt;
always @(posedge clk or negedge resetn) begin
    if(!resetn) begin
        cnt <= 32'd0;
    end
    else begin
        if(cnt == 32'd1000) cnt <= 32'd0;
        else cnt <= cnt+1'd1;
    end
end
always @(posedge clk or negedge resetn) begin
    if(!resetn) begin
        r_theta <= 16'd0;
    end
    else begin
        if(cnt == 32'd500) r_theta <= {8'd30, 8'd0};
        else if(cnt == 32'd1000) r_theta <= {8'd60, 8'd0};
        else r_theta <= r_theta;
    end
end
assign w_theta = r_theta;
wire [15:0] s, c;
wire s_V_ap_vld, c_V_ap_vld;
reg [15:0] r_s, r_c;
cordic_0 cordic_inst (
  .s_V_ap_vld(s_V_ap_vld),  // output wire s_V_ap_vld
  .c_V_ap_vld(c_V_ap_vld),  // output wire c_V_ap_vld
  .ap_clk(clk),          // input wire ap_clk
  .ap_rst(~resetn),          // input wire ap_rst
  .theta_V(w_theta),        // input wire [15 : 0] theta_V
  .s_V(s),                // output wire [15 : 0] s_V
  .c_V(c)                // output wire [15 : 0] c_V
);
always @(posedge clk or negedge resetn) begin
    if(!resetn) begin
        r_s <= 16'd0;
    end
    else begin
        if(s_V_ap_vld) begin
            r_s <= s;
        end
    end
end
always @(posedge clk or negedge resetn) begin
    if(!resetn) begin
        r_c <= 16'd0;
    end
    else begin
        if(c_V_ap_vld) begin
            r_c <= c;
        end
    end
end
ila_0 ila0 (
	.clk(clk), // input wire clk
	.probe0(w_theta), // input wire [15:0]  probe0  
	.probe1(r_s), // input wire [15:0]  probe1 
	.probe2(s_V_ap_vld), // input wire [0:0]  probe2 
	.probe3(r_c), // input wire [15:0]  probe3 
	.probe4(c_V_ap_vld) // input wire [0:0]  probe4
);

   ila 上看到的波形如下图所示。注意要正确设置观测量的数据类型,即定点数和小数点位置。从图中可以看出计算的角度比较准确。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/932167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

思乐直播系统短视频直播系统源码 直播短视频平台系统APP源码多功能后台系统

思乐直播系统&#xff0c;集直播、短视频等功能&#xff0c;根据市场趋势开发并推出思乐直播APP&#xff0c;APP功能丰富且可在后台管理系统进行配置&#xff0c;做到按需求来开启功能。APP使用起来方便快捷&#xff0c;随时随地开启直播、分享短视频。 整个系统具备非常完善、…

【C++杂货铺】探索vector的底层实现

文章目录 一、STL1.1 什么是STL?1.2 STL的版本1.3 STL的六大组件 二、vector的介绍及使用2.1 vector的介绍2.2 vector的使用2.2.1 vector的定义2.2.2 vector iterator2.2.3 vector空间增长问题2.2.4 vector增删查改 2.3 vector\<char\> 可以替代 string 嘛&#xff1f; …

垃圾识别工具箱、ChatGPT聊天微信小程序、大型商城电商源码

一、识别垃圾分类应用 垃圾识别工具箱微信小程序源码 前端&#xff1a;微信小程序 采用 uni-app 开发框架&#xff0c;uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、H5、以及各种小程序&#xff08;微信…

RetNet或成Transformer继承者?通向更快、更强、更经济的基础架构

导读 在计算机科学的发展史上&#xff0c;硬件算力、算法程序与计算数据总是螺旋上升。在硬件相同的条件下&#xff0c;算法的效率和优化程度决定了其利用硬件资源的能力&#xff0c;从而直接影响计算机的算力。因此&#xff0c;为了提升计算机系统带来的综合效益&#xff0c;计…

C++:基础

目录 1.C关键字 2.命名空间 1.命名空间定义 2.命名空间的使用 3.C输入与输出 4.缺省参数 1.缺省参数的概念 2.缺省参数的分类 5.函数重载 1.函数重载概念 2.为什么C支持函数重载&#xff0c;C语言不支持&#xff1f; 6.引用 1.引用的概念 2.引用的特性 3.常引用…

重要通知:9月1日起,微信小程序须完成备案后才可上架

微信官方通知 近日&#xff0c;工信部发布了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;8月9日&#xff0c;微信公众平台也发布了“关于开展微信小程序备案的通知”&#xff1a; 一、备案必要性 在中华人民共和国境内从事互联网信息服务的移动互…

隐式表达的更进一步:基于NeRF的形状可编辑方法

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 [paper]&#xff1a;https://arxiv.org/pdf/2303.09554 [code]&#xff1a;https://ktertikas.github.io/part_nerf 主要贡献&#xff1a; 设计了 PartNeRF&#xff0c;这是一种新颖的部件感知生成模型&…

idea上利用JDBC连接MySQL数据库(8.1.0版)

1.了解jdbc概念 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API&#xff0c;可以为多种 关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准&#xff0c;据此可以构建 更高级的工具和接口&#…

MAVEN利器:一文带你了解IDEA中如何使用Maven

前言&#xff1a; 强大的构建工具——Maven。作为Java生态系统中的重要组成部分&#xff0c;Maven为开发人员提供了一种简单而高效的方式来构建、管理和发布Java项目。无论是小型项目还是大型企业级应用&#xff0c;Maven都能帮助开发人员轻松处理依赖管理、编译、测试和部署等…

《Zookeeper》源码分析(二十二)之 客户端核心类

目录 CliCommand数据结构parse()exec() ZooKeeperHostProviderZKClientConfigClientCnxnSocket数据结构构造函数 ClientCnxn数据结构构造函数start() CliCommand 数据结构 CliCommand定义了两个抽象方法&#xff0c;以CreateCommand为例来看下它的parse()和exec()方法。 先看…

c语言每日一练(11)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

在驱动中创建sysfs接口、procfs接口、debugfs接口

前言 在一些linux开发板中&#xff0c;经常可以看到通过echo的方式来直接控制硬件或者修改驱动&#xff0c;例如&#xff1a; //灯灭 echo 0 >/sys/class/leds/firefly:blue:power/brightness //灯亮 echo 1 >/sys/class/leds/firefly:blue:power/brightness 这是怎么…

老人摔倒智能识别检测算法

老人摔倒智能识别检测算法通过yolov8深度学习算法模型架构&#xff0c;老人摔倒智能识别检测算法能够实时监测老人的活动状态及时发现摔倒事件&#xff0c;系统会立即触发告警&#xff0c;向相关人员发送求助信号&#xff0c;减少延误救援的时间。YOLOv8 算法的核心特性和改动可…

内嵌功能强大、低功耗STM32WB55CEU7、STM32WB55CGU7 射频微控制器 - MCU, 48-UFQFN

一、概述&#xff1a; STM32WB55xx多协议无线和超低功耗器件内嵌功能强大的超低功耗无线电模块&#xff08;符合蓝牙 低功耗SIG规范5.0和IEEE 802.15.4-2011标准&#xff09;。该器件内含专用的Arm Cortex -M0&#xff0c;用于执行所有的底层实时操作。这些器件基于高性能Arm …

分享一种针对uni-app相对通用的抓包方案

PART1&#xff0c;前言 近年来混合开发APP逐渐成为主流的开发模式&#xff0c;与传统的开发模式相比混合开发极大的提升了开发效率&#xff0c;同时跨平台的特性也降低了开发成本&#xff0c;一直以来混合开发被诟病的性能问题随着技术的发展也得到改善。技术的发展往往是一把…

vue3+uni——watch监听props中的数据(组件参数接收与传递defineProps、defineEmits)

案例说明 A页面引用的子组件B A页面 <template><view>//引用组件<serviceOrder change"change" :list"list" :current"type"></serviceOrder></view> </template><script setup>import serviceOrd…

智慧课堂学生行为检测评估算法

智慧课堂学生行为检测评估算法通过yolov5系列图像识别和行为分析&#xff0c;智慧课堂学生行为检测评估算法评估学生的表情、是否交头接耳行为、课堂参与度以及互动质量&#xff0c;并提供相应的反馈和建议。智慧课堂学生行为检测评估算法能够实时监测学生的上课行为&#xff0…

基于Jenkins自动化部署PHP环境---基于rsync部署

基于基于Jenkins自动打包并部署Tomcat环境_学习新鲜事物的博客-CSDN博客环境 准备git仓库 [rootgit ~]# su - git 上一次登录&#xff1a;五 8月 25 15:09:12 CST 2023从 192.168.50.53pts/2 上 [gitgit ~]$ mkdir php.git [gitgit ~]$ cd php.git/ [gitgit php.git]$ git --b…

Heikin-Ashi怎么用,FPmarkets澳福找到3个使用环境

所有赚到钱的交易者都在告诉你Heikin-Ashi是个能赚到钱的交易指标&#xff0c;但是没有一个赚到钱的交易者告诉你如何使用Heikin-Ashi交易指标赚到钱。其实很简单&#xff0c;只要理解Heikin-Ashi的这3个使用环境&#xff0c;如果不好使&#xff0c;FPmarkets澳福帮你账户充值1…

pytest pytest.ini 配置日志输出至文件

创建pytest.ini 文件 [pytest] log_file pytest_log.txt log_file_level INFO log_file_date_format %Y-%m-%d %H:%M:%S log_file_format %(asctime)s | %(filename)s | %(funcName)s | line:%(lineno)d | %(levelname)s | %(message)s import pytest import loggingdef …