【【迭代16次的CORDIC算法-verilog实现】】
迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现
CORDIC.v
module cordic32#(parameter DATA_WIDTH = 8'd32 , // we set data widthparameter PIPELINE = 5'd16 // Optimize waveform)(input clk ,input rst_n ,input signed [DATA_WIDTH - 1 : 0] phase ,input ena ,output reg signed [DATA_WIDTH - 1 : 0] sin_out ,output reg signed [DATA_WIDTH - 1 : 0] cos_out);// ----------------------------------------------- \\// next is define and parameter \\// ------------------------------------------------- \\
reg signed [DATA_WIDTH - 1 : 0] phase_reg ;reg signed [DATA_WIDTH - 1 : 0] phase_reg1 ;reg signed [DATA_WIDTH - 1 : 0] X0 ;reg signed [DATA_WIDTH - 1 : 0] Y0 ;reg signed [DATA_WIDTH - 1 : 0] Z0 ;wire signed [DATA_WIDTH - 1 : 0] X1 , Y1 , Z1 ;wire signed [DATA_WIDTH - 1 : 0] X2 , Y2 , Z2 ;wire signed [DATA_WIDTH - 1 : 0] X3 , Y3 , Z3 ;wire signed [DATA_WIDTH - 1 : 0] X4 , Y4 , Z4 ;wire signed [DATA_WIDTH - 1 : 0] X5 , Y5 , Z5 ;wire signed [DATA_WIDTH - 1 : 0] X6 , Y6 , Z6 ;wire signed [DATA_WIDTH - 1 : 0] X7 , Y7 , Z7 ;wire signed [DATA_WIDTH - 1 : 0] X8 , Y8 , Z8 ;wire signed [DATA_WIDTH - 1 : 0] X9 , Y9 , Z9 ;wire signed [DATA_WIDTH - 1 : 0] X10 , Y10 , Z10 ;wire signed [DATA_WIDTH - 1 : 0] X11 , Y11 , Z11 ;wire signed [DATA_WIDTH - 1 : 0] X12 , Y12 , Z12 ;wire signed [DATA_WIDTH - 1 : 0] X13 , Y13 , Z13 ;wire signed [DATA_WIDTH - 1 : 0] X14 , Y14 , Z14 ;wire signed [DATA_WIDTH - 1 : 0] X15 , Y15 , Z15 ;wire signed [DATA_WIDTH - 1 : 0] X16 , Y16 , Z16 ;reg signed [DATA_WIDTH - 1 : 0] XN15 , YN15 ;reg [1:0] quadrant[PIPELINE : 0] ;integer i ;// We will convert all new angles to the first quadrant//always@(posedge clk or negedge rst_n)beginif( rst_n == 0 )beginphase_reg <= 0 ;phase_reg1 <= 0 ;endelse if( ena == 1)beginphase_reg1 <= phase ;case(phase[DATA_WIDTH - 1 : DATA_WIDTH - 2])2'b00 :phase_reg <= phase ;2'b01 :phase_reg <= phase - 32'h40000000 ; // -902'b10 :phase_reg <= phase - 32'h80000000 ; // -1802'b11 :phase_reg <= phase - 32'hC0000000 ; // -270default :phase_reg <= 32'h00 ; endcaseendend// We begin the initialization operation// we set 0.607253*???2^31-1???,32'h4DBA775Falways@(posedge clk or negedge rst_n)beginif(rst_n == 0 )beginX0 <= 0 ;Y0 <= 0 ;Z0 <= 0 ;endelse if(ena == 1)beginX0 <= 32'h4DBA775F ;Y0 <= 0 ;Z0 <= phase_reg ;endend// for instantiation - 16
INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd0 ),.ANGLE ( 32'h20000000 )
)u_INTERATION0(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X0 ),.Y0 ( Y0 ),.Z0 ( Z0 ),.X1 ( X1 ),.Y1 ( Y1 ),.Z1 ( Z1 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd1 ),.ANGLE ( 32'h12E4051D )
)u_INTERATION1(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X1 ),.Y0 ( Y1 ),.Z0 ( Z1 ),.X1 ( X2 ),.Y1 ( Y2 ),.Z1 ( Z2 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd2 ),.ANGLE ( 32'h09FB385B )
)u_INTERATION2(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X2 ),.Y0 ( Y2 ),.Z0 ( Z2 ),.X1 ( X3 ),.Y1 ( Y3 ),.Z1 ( Z3 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd3 ),.ANGLE ( 32'h051111D4 )
)u_INTERATION3(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X3 ),.Y0 ( Y3 ),.Z0 ( Z3 ),.X1 ( X4 ),.Y1 ( Y4 ),.Z1 ( Z4 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd4 ),.ANGLE ( 32'h028B0D43 )
)u_INTERATION4(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X4 ),.Y0 ( Y4 ),.Z0 ( Z4 ),.X1 ( X5 ),.Y1 ( Y5 ),.Z1 ( Z5 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd5 ),.ANGLE ( 32'h0145D7E1 )
)u_INTERATION5(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X5 ),.Y0 ( Y5 ),.Z0 ( Z5 ),.X1 ( X6 ),.Y1 ( Y6 ),.Z1 ( Z6 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd6 ),.ANGLE ( 32'h00A2F61E )
)u_INTERATION6(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X6 ),.Y0 ( Y6 ),.Z0 ( Z6 ),.X1 ( X7 ),.Y1 ( Y7 ),.Z1 ( Z7 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd7 ),.ANGLE ( 32'h00517C55 )
)u_INTERATION7(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X7 ),.Y0 ( Y7 ),.Z0 ( Z7 ),.X1 ( X8 ),.Y1 ( Y8 ),.Z1 ( Z8 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd8 ),.ANGLE ( 32'h0028BE53 )
)u_INTERATION8(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X8 ),.Y0 ( Y8 ),.Z0 ( Z8 ),.X1 ( X9 ),.Y1 ( Y9 ),.Z1 ( Z9 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd9 ),.ANGLE ( 32'h00145F2F )
)u_INTERATION9(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X9 ),.Y0 ( Y9 ),.Z0 ( Z9 ),.X1 ( X10 ),.Y1 ( Y10 ),.Z1 ( Z10 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd10 ),.ANGLE ( 32'h000A2F98 )
)u_INTERATION10(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X10 ),.Y0 ( Y10 ),.Z0 ( Z10 ),.X1 ( X11 ),.Y1 ( Y11 ),.Z1 ( Z11 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd11 ),.ANGLE ( 32'h000517CC )
)u_INTERATION11(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X11 ),.Y0 ( Y11 ),.Z0 ( Z11 ),.X1 ( X12 ),.Y1 ( Y12 ),.Z1 ( Z12 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd12 ),.ANGLE ( 32'h00028BE6 )
)u_INTERATION12(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X12 ),.Y0 ( Y12 ),.Z0 ( Z12 ),.X1 ( X13 ),.Y1 ( Y13 ),.Z1 ( Z13 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd13 ),.ANGLE ( 32'h000145F3 )
)u_INTERATION13(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X13 ),.Y0 ( Y13 ),.Z0 ( Z13 ),.X1 ( X14 ),.Y1 ( Y14 ),.Z1 ( Z14 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd14 ),.ANGLE ( 32'h0000A2FA )
)u_INTERATION14(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X14 ),.Y0 ( Y14 ),.Z0 ( Z14 ),.X1 ( X15 ),.Y1 ( Y15 ),.Z1 ( Z15 )
);INTERATION#(.DATA_WIDTH ( 8'd32 ),.shift ( 5'd15 ),.ANGLE ( 32'h0000517D )
)u_INTERATION15(.clk ( clk ),.rst_n ( rst_n ),.ena ( ena ),.X0 ( X15 ),.Y0 ( Y15 ),.Z0 ( Z15 ),.X1 ( X16 ),.Y1 ( Y16 ),.Z1 ( Z16 )
);// iteration over always@(posedge clk or negedge rst_n)
beginif(rst_n == 0)for(i = 0 ; i < PIPELINE ; i=i+1)quadrant[i] <= 0 ;elseif(ena == 1)beginfor(i = 0 ; i < PIPELINE ; i=i+1)quadrant[i+1] <= quadrant[i] ;quadrant[0] <= phase_reg1[DATA_WIDTH - 1 : DATA_WIDTH - 2] ;end
end//------------------------------------------ \\//------------------------------------------ \\
// Prevent overflow caused by small decimals and negative complement
//always @(posedge clk or negedge rst_n)if(rst_n == 0)XN15<=0;else if(X15[31:30] == 2'b11)//小于0XN15<=~X15 + 1'b1;else if(X15[31:30] == 2'b10)//大于1XN15<=32'h80000000 - X15 + 32'h80000000;else XN15 <= X15;always @(posedge clk or negedge rst_n )if(rst_n == 0)YN15 <=0;else if(Y15[31:30] == 2'b11)//小于0 YN15 <=~Y15 + 1'b1;else if(Y15[31:30] == 2'b10)//大于1YN15 <=32'h80000000 -Y15 + 32'h80000000;else YN15 <=Y15;//
// The results of different phases are also different// phase[DATA_WIDTH -1 : DATA_WIDTH -2]// 00 first quadrant// 01 second quadrant// 10 third quadrant// 11 Fourth Quadrantalways@(posedge clk or negedge rst_n)
beginif(rst_n == 0)begincos_out <= 0 ;sin_out <= 0 ;endelse if( ena == 1)begincase(quadrant[16]) 2'b00 :begincos_out <= XN15 ;sin_out <= YN15 ;end2'b01 :begincos_out <= ~YN15 + 1'b1;sin_out <= XN15 ;end2'b10 :begincos_out <= ~XN15 + 1'b1 ;sin_out <= ~YN15 + 1'b1 ;end2'b11 :begincos_out <= YN15 ;sin_out <= ~XN15 + 1'b1 ;endendcaseend
end
endmodule
ITERATION.v
module INTERATION #(parameter DATA_WIDTH = 8'd32 ,parameter shift = 5'd0 ,parameter ANGLE = 32'h20000000)(input clk ,input rst_n ,input ena ,input signed [DATA_WIDTH - 1 : 0] X0 ,input signed [DATA_WIDTH - 1 : 0] Y0 ,input signed [DATA_WIDTH - 1 : 0] Z0 ,output reg signed [DATA_WIDTH - 1 : 0] X1 ,output reg signed [DATA_WIDTH - 1 : 0] Y1 ,output reg signed [DATA_WIDTH - 1 : 0] Z1);always@(posedge clk or negedge rst_n)beginif( rst_n == 0)beginX1 <= 0 ;Y1 <= 0 ;Z1 <= 0 ;endelse if( ena == 1)beginif(Z0[DATA_WIDTH - 1] == 0 )begin// X1 <= X0 - {{shift{ Y0[DATA_WIDTH - 1] }} ,Y0[DATA_WIDTH - 1 : shift] } ;// Y1 <= Y0 + {{shift{ X0[DATA_WIDTH - 1] }} ,X0[DATA_WIDTH - 1 : shift] } ;X1 <= X0 - (Y0>>>shift);Y1 <= Y0 + (X0>>>shift);Z1 <= Z0 - ANGLE ;endelse if(Z0[DATA_WIDTH - 1] == 1 )begin//X1 <= X0 + {{shift{ Y0[DATA_WIDTH - 1 ] }} ,Y0[DATA_WIDTH - 1 : shift] } ;// Y1 <= Y0 - {{shift{ X0[DATA_WIDTH - 1 ] }} ,X0[DATA_WIDTH - 1 : shift] } ;X1 <= X0 + (Y0>>>shift) ;Y1 <= Y0 - {X0>>>shift} ;Z1 <= Z0 + ANGLE ;endendendendmodule
CORDIC_tb.v
module cordic_tb #(parameter DATA_WIDTH = 8'd32 , // we set data widthparameter PIPELINE = 5'd16 // Optimize waveform
);
reg clk ;
reg rst_n ;
reg [DATA_WIDTH - 1 : 0] phase ;
reg ena ;
wire [DATA_WIDTH - 1 : 0] sin_out ;
wire [DATA_WIDTH - 1 : 0] cos_out ;integer i;
cordic32#(.DATA_WIDTH ( DATA_WIDTH ),.PIPELINE ( PIPELINE )
)u_cordic32(.clk ( clk ),.rst_n ( rst_n ),.phase ( phase ),.ena ( ena ),.sin_out ( sin_out ),.cos_out ( cos_out )
);initial
begin#0 clk = 1'b0;ena = 1'b1 ;#10 rst_n = 1'b0;#10 rst_n = 1'b1;#20000000 $stop;
end initial
beginrepeat(10)begin#0 phase = 32'd0;for(i=0;i<131072;i=i+1)begin#10;phase <= phase + 32'h8000;endend
end
always #10
beginclk = ~clk;
endendmodule
README.md
在完成CORDIC的7次迭代之后 我在思考一个问题 8位进行了7次迭代 最后迭代至0号称没有误差了
我们是否可以通过 扩展至32位 进行多次迭代 将误差不断的缩小 本次数据参考至 网上的其他教程 我并没有自己去计算 我把结构优化一下 修改成更加便于理解使用的形式还有一件事 是 进制 与 Π 转化的问题
对于 8位 其实我们 一开始将Π 设定为 1000_0000
那么对于 Π/4 是否就是1000_0000 的 四分之一 对于二进制 其实就是整体的数字进行移位
我们将1000_0000 移动至 0010_0000 于此 而对于 32位我们32'h8000000 就是一个Π
而 32’h2000_0000 就是四分之Π 还有一件事 说明 我在写例化的时候 将数据完全完整的例化了下来 写的很长 这样并不是很好
后面学习中 我看别人是 这么处理的
genvar die;
generatefor (die = 0; die <Pipeline; die=die+1)begin: dieLoopalways @(posedge CLK_SYS or negedge RST_N)if (!RST_N) beginxn[die+1] <= 32'h0;yn[die+1] <= 32'h0;zn[die+1] <= 32'h0;endelse begin if(zn[die][31]==1'b0)//角度符号判断beginxn[die+1] <= xn[die] - (yn[die]>>>die);yn[die+1] <= yn[die] + (xn[die]>>>die);zn[die+1] <= zn[die] - rot[die]; endelse beginxn[die+1] <= xn[die] + (yn[die]>>>die);yn[die+1] <= yn[die] - (xn[die]>>>die);zn[die+1] <= zn[die] + rot[die]; endendend
endgenerate# 还有一件事 对于溢出的考量
我们所作溢出的考量 其实我们设定了32'h8000_0000 这既是Π的值 也是 1的设定
但是在实际的运用和计算中 我们其实永远也达不到1 嘿嘿
因为我们把最高位设计成了 符号位
那么最大 也就是1 我们约等于 32'h7fff_ffff
这里需要注意的是[31:28] 是 7 也就是0111 非常重要的一个结论 我们最高位0代表了符号位
那么对于设计到第一象限的[31:30] 的值可以取 00 01 但是 10 11我们要对其进行合适的转化
所以便有了我们 对溢出的操作 always @(posedge clk or negedge rst_n)if(rst_n == 0)XN15<=0;else if(X15[31:30] == 2'b11)//小于0XN15<=~X15 + 1'b1;else if(X15[31:30] == 2'b10)//大于1XN15<=32'h80000000 - X15 + 32'h80000000;else XN15 <= X15;always @(posedge clk or negedge rst_n )if(rst_n == 0)YN15 <=0;else if(Y15[31:30] == 2'b11)//小于0 YN15 <=~Y15 + 1'b1;else if(Y15[31:30] == 2'b10)//大于1YN15 <=32'h80000000 -Y15 + 32'h80000000;else YN15 <=Y15;注意在设计的时候 定义成reg signed 的形式 将其设计为有符号位
相关文章:

【【迭代16次的CORDIC算法-verilog实现】】
迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …...

IntelliJ IDEA 2023.3 安装教程
引言 IntelliJ IDEA,通常简称为 IDEA,是由 JetBrains 开发的一款强大的集成开发环境,专为提升开发者的生产力而设计。它支持多种编程语言,包括 Java、Kotlin、Scala 和其他 JVM 语言,同时也为前端开发和移动应用开发提…...
Go 错误处理
Go 错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error类型是一个接口类型,这是它的定义: type error interface {Error() string }我们可以在编码中通过实现 error 接口类型来生成错误信息。 函数通常在最后的返回值中返回错误…...

HarmonyOS构建第一个ArkTS应用(Stage模型)
构建第一个ArkTS应用(Stage模型) 创建ArkTS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发…...
故障排查利器-错误日志详解
目录 什么是错误日志 错误日志的作用 错误日志的内容 错误日志的格式 错误日志的生成方式 错误日志的解析和处理 错误日志的最佳实践 小结 错误日志是软件开发和运维中非常重要的一部分,记录了应用程序运行过程中发生的错误和异常信息,如错误类型…...

微信小程序(uniapp)api讲解
Uniapp是一个基于Vue.js的跨平台开发框架,可以同时开发微信小程序、H5、App等多个平台的应用。下面是Uniapp常用的API讲解: Vue.js的API Uniapp采用了Vue.js框架,因此可以直接使用Vue.js的API。例如:v-show、v-if、v-for、comput…...
overtureDNS使用介绍
Overture是一个定制的DNS中继服务器。 在此下在二进制版本 https://github.com/shawn1m/overture/releases默认配置文件./config.yml bindAddress: :53 debugHTTPAddress: 127.0.0.1:5555 dohEnabled: false primaryDNS:- name: DNSPodaddress: 119.29.29.29:53protocol: udp…...

平衡二叉树的构建(递归
目录 1.概念:2.特点:3.构建方法:4.代码:小结: 1.概念: 平衡二叉树(Balanced Binary Tree),也称为AVL树,是一种二叉树,它满足每个节点的左子树和右…...

flutter开发实战-设置bottomNavigationBar中间按钮悬浮效果
flutter开发实战-设置bottomNavigationBar中间按钮悬浮的效果 在使用tabbar时候,可以使用bottomNavigationBar来设置中间凸起的按钮,如下 一、效果图 中间按钮凸起的效果图如下 二、实现代码 我们使用BottomAppBar 一个容器,通常与[Sscaf…...

不同参数规模大语言模型在不同微调方法下所需要的显存总结
原文来自DataLearnerAI官方网站: 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…...
Crow:Middlewares 庖丁解牛6 middleware_call_helper
Crow:http请求到Rule绑定的handler_的调用链-CSDN博客 介绍了handler_的调用顺序,其中的一个调用过程是Connection::->handle void handle() {...ctx_ = detail::context<Middlewares...>();req_.middleware_context = static_cast<void*>(&ctx_);req_.m…...

MyBatis:Generator
MyBatis Generator附批量操作分页查询存储过程 Generator 介绍网址:Introduction to MyBatis Generator Generator ,一个用于 MyBatis 的代码生成工具,可以根据数据库表结构自动生成对应的实体类、DAO 接口和 SQL 映射文件,提高…...
rabbitmq的事务实现、消费者的事务实现
RabbitMQ提供了事务机制,可以确保消息在发送和确认过程中的一致性。使用事务机制可以将一系列的消息操作(发送、确认、回滚)作为一个原子操作,要么全部执行成功,要么全部回滚。 下面是使用RabbitMQ事务的一般步骤&…...

龙芯杯个人赛串口——做一个 UART串口——RS-232
文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码: 4.RS-232 receiver…...

验证码服务使用指南
验证码服务使用指南 1 部署验证码服务 1.1 基础环境 Java 1.8 Maven3.3.9 1.2 安装Redis 参考“Redis安装指南” 1.3 部署验证码服务 1.3.1 下载源码 使用git从远程下载验证码服务代码(开源)。 1.3.2 使用idea打开项目 使用idea打开上一步下载的sailing目录…...

js中Math.min(...arr)和Math.max(...arr)的注意点
当arr变量为空数组时,这两个函数和不传参数时的结果是一样的 Math.max() // -Infinity Math.max(...[]) // -InfinityMath.min() // Infinity Math.min(...[]) // Infinity...
【zookeeper特点和集群架构】
文章目录 1. Zookeeper介绍2、ZooKeeper数据结构3、Zookeeper集群架构 1. Zookeeper介绍 ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分 布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易…...

MySQL集群架构搭建以及多数据源管理实战
MySQL集群架构搭建以及多数据源管理实战 数据库的分库分表操作,是互联网大型应用所需要面对的最核心的问题。因为数据往往是一个应用最核心的价值所在。但是,在最开始的时候,需要强调下,在实际应用中,对于数据库&a…...

C# WPF上位机开发(从demo编写到项目开发)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 C# WPF编程,特别是控件部分,其实学起来特别快。只是后面多了多线程、锁、数据库、网络这部分稍微复杂一点,不过…...

微信小程序引入 vant组件(详细步骤)
vant官方地址 https://vant-contrib.gitee.io/vant-weapp/#/quickstart 步骤一、 通过 npm 安装 # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i vant-weapp -S --production步骤二 修改 app.js…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...