怎么管理网站/网络营销策划书800字
FPGA实现Cordic算法——向量模式
- FPGA实现Cordic算法——向量模式
- 1.cordic算法基本原理
- 2.FPGA实现cordic算法向量模式
- i、FPGA串行实现cordic
- ii、FPGA流水线实现cordic
- iii、实验结果
FPGA实现Cordic算法——向量模式
1.cordic算法基本原理
FPGA中运算三角函数,浮点数的能力有限,而cordic算法能够将三角函数运算转换为简单的移位和加减法进行迭代得到近似结果,能够有效降低运算代价,提升运算效率。
如上图所示,若已知点矢量终点A 0 _0 0 (x 0 _0 0,y 0 _0 0) ,若将该矢量逆时针旋转 θ \theta θ 可以根据三角运算得到B 0 _0 0 (x 1 _1 1,y 1 _1 1)点坐标:
{ x 0 = l ∗ c o s ψ y 0 = l ∗ s i n ψ { x 1 = l ∗ c o s ( θ + ψ ) = l ∗ ( c o s θ c o s ψ − s i n θ s i n ψ ) = x 0 c o s θ − y 0 s i n θ y 1 = l ∗ s i n ( θ + ψ ) = l ∗ ( s i n θ c o s ψ + c o s θ s i n ψ ) = x 0 s i n θ + y 0 c o s θ \begin{cases} x_0 = l*cos\psi \\ y_0 = l*sin\psi \\ \end{cases} \\ \begin{cases} x_1 = l*cos(\theta+\psi)=l*(cos\theta cos\psi -sin\theta sin\psi) = x_0 cos\theta - y_0 sin\theta\\ y_1 = l*sin(\theta+\psi)=l*(sin\theta cos\psi +cos\theta sin\psi) = x_0 sin\theta + y_0 cos\theta\\ \end{cases} {x0=l∗cosψy0=l∗sinψ{x1=l∗cos(θ+ψ)=l∗(cosθcosψ−sinθsinψ)=x0cosθ−y0sinθy1=l∗sin(θ+ψ)=l∗(sinθcosψ+cosθsinψ)=x0sinθ+y0cosθ
令 θ 1 = − θ \theta_1 = -\theta θ1=−θ,即顺时针旋转 θ \theta θ 角度,则:
{ x 0 c o s θ 1 − y 0 s i n θ 1 = x 0 c o s θ + y 0 s i n θ x 0 s i n θ 1 + y 0 c o s θ 1 = y 0 c o s θ − x 0 s i n θ \\ \begin{cases} x_0 cos\theta_1 - y_0 sin\theta_1 = x_0 cos\theta + y_0 sin\theta \\ x_0 sin\theta_1 + y_0 cos\theta_1 = y_0 cos\theta - x_0 sin\theta \\ \end{cases} {x0cosθ1−y0sinθ1=x0cosθ+y0sinθx0sinθ1+y0cosθ1=y0cosθ−x0sinθ
联立上述两个式子,引入常数$ d (d=-1,+1)$ ,因此可得:
{ x 0 c o s θ − d y 0 s i n θ = c o s θ ( x 0 − d y 0 t a n θ ) y 0 c o s θ + d x 0 s i n θ = c o s θ ( y 0 + d x 0 t a n θ ) \\ \begin{cases} x_0 cos\theta - dy_0 sin\theta = cos\theta(x_0 - dy_0 tan\theta) \\ y_0 cos\theta + dx_0 sin\theta = cos\theta(y_0 + dx_0 tan\theta) \\ \end{cases} {x0cosθ−dy0sinθ=cosθ(x0−dy0tanθ)y0cosθ+dx0sinθ=cosθ(y0+dx0tanθ)
这个算法的核心在于将一系列已知的 t a n θ tan\theta tanθ作为表格键值进行存储,而 t a n θ tan\theta tanθ可以约等于 1 2 n \frac{1}{2^n} 2n1并且。 1 2 n \frac{1}{2^n} 2n1在FPGA中可以通过右移进行快速运算。 t a n θ tan\theta tanθ各个已知存储值如下:
i i i | θ \theta θ | t a n θ tan\theta tanθ | c o s θ cos\theta cosθ | ∏ c o s θ \prod cos\theta ∏cosθ |
---|---|---|---|---|
0 | 45 | 1 | 0.707106781186548 | 0.707106781186548 |
1 | 25.56505 | 0.50 | 0.894427190999916 | 0.632455532033676 |
2 | 14.03243 | 0.25 | 0.970142500145332 | 0.613571991077897 |
3 | 7.125016 | 0.125000000000000 | 0.992277876713668 | 0.608833912517753 |
4 | 3.576334 | 0.0625000000000000 | 0.998052578482889 | 0.607648256256168 |
5 | 1.789910 | 0.0312500000000000 | 0.999512076087079 | 0.607351770141296 |
6 | 0.895173 | 0.0156250000000000 | 0.999877952034695 | 0.607277644093526 |
7 | 0.447614 | 0.00781250000000000 | 0.999969483818788 | 0.607259112298893 |
8 | 0.223810 | 0.00390625000000000 | 0.999992370692779 | 0.607254479332563 |
9 | 0.111905 | 0.00195312500000000 | 0.999998092656824 | 0.607253321089875 |
10 | 0.055952 | 0.000976562500000000 | 0.999999523163183 | 0.607253031529135 |
11 | 0.027976 | 0.000488281250000000 | 0.999999880790732 | 0.607252959138945 |
12 | 0.013988 | 0.000244140625000000 | 0.999999970197679 | 0.607252941041397 |
13 | 0.006994 | 0.000122070312500000 | 0.999999992549420 | 0.607252936517011 |
14 | 0.003497 | 6.10351562500000e-05 | 0.999999998137355 | 0.607252935385914 |
15 | 0.001748 | 3.05175781250000e-05 | 0.999999999534339 | 0.607252935103140 |
而多次旋转过程中,每次旋转的 c o s θ cos\theta cosθ需要连续相乘,而多次相乘极限也趋近与0.607252这一个常数,因此也可做近似处理。那么现在还有最后一个问题,这一系列角度能够通过多次旋转得到任意的角度吗?可以看到每个角度是不断降低减半的,呈递减的分布,从宏观上观察大致是可以进行趋近到某一个常数的。
cordic算法有两个模式:
1)向量模式,已知点坐标(x0,y0),可以求得该向量的角度即arctan(y0/x0)。这种可以理解为需要通过多次旋转,将该向量旋转至x轴上,即y0 = 0,此时旋转过的角度即为向量角度,x最终坐标即为向量的长度。
2)旋转模式,已知角度 θ \theta θ ,求 s i n θ sin\theta sinθ及 c o s θ cos\theta cosθ
{ x 0 c o s θ − d y 0 s i n θ = c o s θ ( x 0 − d y 0 t a n θ ) y 0 c o s θ + d x 0 s i n θ = c o s θ ( y 0 + d x 0 t a n θ ) \\ \begin{cases} x_0 cos\theta - dy_0 sin\theta = cos\theta(x_0 - dy_0 tan\theta) \\ y_0 cos\theta + dx_0 sin\theta = cos\theta(y_0 + dx_0 tan\theta) \\ \end{cases} {x0cosθ−dy0sinθ=cosθ(x0−dy0tanθ)y0cosθ+dx0sinθ=cosθ(y0+dx0tanθ)
令y0 = 0
{ c o s θ ( x 0 − d y 0 t a n θ ) = c o s θ x 0 c o s θ ( y 0 + d x 0 t a n θ ) = s i n θ y 0 \begin{cases} cos\theta(x_0 - dy_0 tan\theta) = cos\theta x_0\\ cos\theta(y_0 + dx_0 tan\theta) = sin\theta y_0\\ \end{cases} {cosθ(x0−dy0tanθ)=cosθx0cosθ(y0+dx0tanθ)=sinθy0
什么意思呢,类似当前有个单位圆,初始点在A(x,0)这一点,经过旋转多次可以得到B(x1,y1)。此时
{ x 1 = c o s ( θ ) y 1 = s i n ( θ ) \begin{cases} x_1 = cos(\theta)\\ y_1 = sin(\theta) \end{cases} {x1=cos(θ)y1=sin(θ)
但是因为这个旋转变换是伪旋转变换,需要乘以一个 c o s θ cos\theta cosθ的系数。
2.FPGA实现cordic算法向量模式
这里以向量模式为例子进行FPGA实现,首先构建matlab仿真程序
function [len,theta] = cordic_theat(x_in,y_in)
clc;
clear x y z;z_ref=[ 45,...26.56505113840103,...14.036243438720703,...7.1250163316726685,...3.5763343572616577,...1.7899105548858643,...0.8951736688613892,...0.4476141333580017,...0.22381049394607544,...0.11190563440322876,...0.05595284700393677,...0.027976393699645996,...0.013988196849822998,...0.006994098424911499,... 0.0034970492124557495,...0.00174852460622787475].*2^(24);times = 16;%迭代次数
x = zeros(times+1,1);
y = zeros(times+1,1);
z = zeros(times+1,1);
d = 1;y(1,1) = abs(y_in)*2^(12);
x(1,1) = abs(x_in)*2^(12);
z(1,1) = 0;for i = 1: timesif( y(i,1) < 0 )
% d = 1;x(i+1,1) = x(i,1) - d/2^(i-1)*y(i,1);y(i+1,1) = y(i,1) + d/2^(i-1)*x(i,1);z(i+1,1) = z(i,1) - d*( z_ref(i) );else
% d = -1;x(i+1,1) = x(i,1) + d/2^(i-1)*y(i,1);y(i+1,1) = y(i,1) - d/2^(i-1)*x(i,1);z(i+1,1) = z(i,1) + d*( z_ref(i) );endendmy_z = z(times+1,1)/2^(24);
my_x = x(times+1,1)/2^(12) * 0.607253;len = my_x;if( x_in >= 0 && y_in>=0)theta = my_z;
elseif (x_in <= 0 && y_in >=0)theta = 180 - my_z;
elseif (x_in <= 0 && y_in <=0)theta = 180 + my_z;
elseif (x_in>= 0 && y_in<= 0)theta = 360 - my_z;
endend
实际值比对程序:
t = 0:0.01:2*pi;
x=cos(t);
y=sin(t);
len = zeros( 1,length(t));
theta = zeros(1,length(t));for i = 1:length(t)[len(i),theta(i)] = cordic_theat( x(i),y(i) );
endplot( abs(theta-t/pi*180) );
axis([0 640 -0.5e-3 2e-3]);
运行结果显示,与真实值相比16次迭代基本上可以满足使用需要
i、FPGA串行实现cordic
FPGA流水线实现和串行实现,大概的区别是。假如工厂需要加工一个零件,这个零件需要六个步骤完成,每个步骤10s,每个步骤不能同时进行[步骤前后有先后关系]。如果是串行,是一个工人完成六道工序,也就是每60s加工完成一个零件,然后取新的物料进行完成。而流水线实现是安排六个人,每个人只完成一道工序,也就是正常运行过程中,每10s就能取一次物料。从吞吐率来说,串行每60s取一次数据而流水线每10s便能取一次数据,相应的输出也会更加快。串行速度慢,但消耗人工少;流水线速度快但,消耗六倍人工,这是FPGA中典型的空间换取时间的例子。
实现代码如下:
module cordic_serial(input sys_clk,input sys_rst_n,input user_data_valid,input [31:0] user_x,input [31:0] user_y,output reg user_data_out_valid,output reg [31:0] user_theat,output [31:0] user_len
);//输入为有符号数(定点数) 高12位[整数] 低12位[小数] 即放大2^(12) - 整数部分最大为 2 ^12 -1 [最高位为符号位]
//角度标幺 按 高8位[整数] 低24位[小数] 即放大2^(24) 进行标幺
//一共迭代16次/****************************************************************************\Parameter/Define
\****************************************************************************/
wire [31:0] ang_p [15:0];
wire [31:0] ang_n [15:0];
localparam K = 32'h9b74ee; //K=0.607253*2^24,32'h9b74ee,assign ang_p[0] = 32'b0_0101101_000000000000000000000000; //2D00 0000 45
assign ang_p[1] = 32'b0_0011010_100100001010011100110001; //1A90 A731 26.56505113840103 445,687,601
assign ang_p[2] = 32'b0_0001110_000010010100011101000000; //0E09 4740 14.036243438720703
assign ang_p[3] = 32'b0_0000111_001000000000000100010010; //0720 0112 7.1250163316726685
assign ang_p[4] = 32'b0_0000011_100100111000101010100110; //0393 8AA6 3.5763343572616577
assign ang_p[5] = 32'b0_0000001_110010100011011110010100; //01CA 3794 1.7899105548858643
assign ang_p[6] = 32'b0_0000000_111001010010101000011010; //00E5 2A1A 0.8951736688613892
assign ang_p[7] = 32'b0_0000000_011100101001011011010111; //0072 96D7 0.4476141333580017
assign ang_p[8] = 32'b0_0000000_001110010100101110100101; //0039 4BA5 0.22381049394607544
assign ang_p[9] = 32'b0_0000000_000111001010010111011001; //001C A5D9 0.11190563440322876
assign ang_p[10] = 32'b0_0000000_000011100101001011101101; //000E 52ED 0.05595284700393677
assign ang_p[11] = 32'b0_0000000_000001110010100101110110; //0007 2976 0.027976393699645996
assign ang_p[12] = 32'b0_0000000_000000111001010010111011; //0003 94BB 0.013988196849822998
assign ang_p[13] = 32'b0_0000000_000000011100101001011101; //0001 CA5D 0.006994098424911499
assign ang_p[14] = 32'b0_0000000_000000001110010100101110; //0000 E52E 0.0034970492124557495
assign ang_p[15] = 32'b0_0000000_000000000111001010010111; //0000 7297 0.00174852460622787475assign ang_n[0] = 32'b1_1010011_000000000000000000000000; //complement code -45
assign ang_n[1] = 32'b1_1100101_011011110101100011001111; //complement code -26.56505113840103
assign ang_n[2] = 32'b1_1110001_111101101011100011000000; //complement code -14.036243438720703
assign ang_n[3] = 32'b1_1111000_110111111111111011101110; //complement code -7.1250163316726685
assign ang_n[4] = 32'b1_1111100_011011000111010101011010; //complement code -3.5763343572616577
assign ang_n[5] = 32'b1_1111110_001101011100100001101100; //complement code -1.7899105548858643
assign ang_n[6] = 32'b1_1111111_000110101101010111100110; //complement code -0.8951736688613892
assign ang_n[7] = 32'b1_1111111_100011010110100100101001; //complement code -0.4476141333580017
assign ang_n[8] = 32'b1_1111111_110001101011010001011011; //complement code -0.22381049394607544
assign ang_n[9] = 32'b1_1111111_111000110101101000100111; //complement code -0.11190563440322876
assign ang_n[10] = 32'b1_1111111_111100011010110100010011; //complement code -0.05595284700393677
assign ang_n[11] = 32'b1_1111111_111110001101011010001010; //complement code -0.027976393699645996
assign ang_n[12] = 32'b1_1111111_111111000110101101000101; //complement code -0.013988196849822998
assign ang_n[13] = 32'b1_1111111_111111100011010110100011; //complement code -0.006994098424911499
assign ang_n[14] = 32'b1_1111111_111111110001101011010010; //complement code -0.0034970492124557495
assign ang_n[15] = 32'b1_1111111_111111111000110101101001; //complement code -0.00174852460622787475localparam ang_180_p = 32'b0_1011_0100_0000_0000_0000_0000_0000_000; //+180 - Q23
//localparam ang_180_n = 32'b ; //-180reg [31:0] z_theat;
reg [4:0] iterate_times; //迭代次数最大16次数
reg cordic_start_flag;
reg signed [31:0] cordic_x;
reg signed [31:0] cordic_y;
reg signed [31:0] cordic_z;always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_start_flag <= 1'd0;end else if(iterate_times == 5'd15) begincordic_start_flag <= 1'd0;end else if(user_data_valid == 1'b1) begincordic_start_flag <= 1'd1;end
endalways @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginiterate_times <= 5'd0;end if(user_data_out_valid == 1'b1)beginiterate_times <= 5'd0;end if(cordic_start_flag == 1'b1)beginiterate_times <= iterate_times + 5'd1;end
endreg [1:0] quadrant; //象限判断标志 I-00 II-10 III-11 IV-01
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginquadrant <= 2'd0;end else if( user_data_valid == 1'b1 && iterate_times == 5'd0)beginquadrant <= {user_x[31],user_y[31]};end
endalways @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x <= 32'd0;cordic_y <= 32'd0;cordic_z <= 32'd0;end else if( user_data_valid == 1'b1 && iterate_times == 5'd0)begincase ({user_x[31],user_y[31]})2'b00: {cordic_x,cordic_y} <= {user_x, user_y};2'b10: {cordic_x,cordic_y} <= {{1'b0,~user_x[30:0]}+1'b1, user_y};2'b11: {cordic_x,cordic_y} <= {{1'b0,~user_x[30:0]}+1'b1, {1'b0,~user_y[30:0]}+1'b1};2'b01: {cordic_x,cordic_y} <= {user_x, {1'b0,~user_y[30:0]}+1'b1};endcasecordic_z <= 32'd0;end else if( cordic_start_flag == 1'b1 && cordic_y[31] == 1 ) begincordic_x <= cordic_x - ({{cordic_y >>> iterate_times}});cordic_y <= cordic_y + ({{cordic_x >>> iterate_times}});cordic_z <= cordic_z + ang_n[iterate_times];end else if( cordic_start_flag == 1'b1 && cordic_y[31] == 0 ) begincordic_x <= cordic_x + ({{cordic_y >>> iterate_times}});cordic_y <= cordic_y - ({{cordic_x >>> iterate_times}});cordic_z <= cordic_z + ang_p[iterate_times];endendalways @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginuser_data_out_valid <= 1'b0;end else if(iterate_times == 5'd15)beginuser_data_out_valid <= 1'b1;end else beginuser_data_out_valid <= 1'b0;end
endalways @(*) beginif(user_data_out_valid == 1'b1)begincase (quadrant)2'b00 : user_theat = (cordic_z >>>24);2'b10 : user_theat = (ang_180_p - (cordic_z >>>1)) >>> 23;2'b11 : user_theat = (ang_180_p + (cordic_z >>>1)) >>> 23;2'b01 : user_theat = (~(cordic_z>>>24)) + 1'b1 ;endcaseendend//输出*0.607253
assign user_len =(user_data_out_valid == 1'b1)? ( (cordic_x >>> 1) + (cordic_x >>> 4) + (cordic_x >>> 5) +(cordic_x >>> 7) + (cordic_x >>> 8) + (cordic_x >>> 10)+(cordic_x >>> 11) + (cordic_x >>> 12)):32'd0; endmodule
ii、FPGA流水线实现cordic
module cordic_parallel(input sys_clk ,input sys_rst_n ,input user_data_valid,input [31:0] user_x,input [31:0] user_y,output reg user_data_out_valid,output reg [31:0] user_theat,output [31:0] user_len);//输入为有符号数(定点数) 高12位[整数] 低12位[小数] 即放大2^(12) - 整数部分最大为 2 ^12 -1 [最高位为符号位]
//角度标幺 按 高8位[整数] 低24位[小数] 即放大2^(24) 进行标幺
//一共迭代16次/****************************************************************************\Parameter/Define
\****************************************************************************/
wire [31:0] ang_p [15:0];
wire [31:0] ang_n [15:0];
localparam K = 32'h9b74ee; //K=0.607253*2^24,32'h9b74ee,assign ang_p[0] = 32'b0_0101101_000000000000000000000000; //2D00 0000 45
assign ang_p[1] = 32'b0_0011010_100100001010011100110001; //1A90 A731 26.56505113840103 445,687,601
assign ang_p[2] = 32'b0_0001110_000010010100011101000000; //0E09 4740 14.036243438720703
assign ang_p[3] = 32'b0_0000111_001000000000000100010010; //0720 0112 7.1250163316726685
assign ang_p[4] = 32'b0_0000011_100100111000101010100110; //0393 8AA6 3.5763343572616577
assign ang_p[5] = 32'b0_0000001_110010100011011110010100; //01CA 3794 1.7899105548858643
assign ang_p[6] = 32'b0_0000000_111001010010101000011010; //00E5 2A1A 0.8951736688613892
assign ang_p[7] = 32'b0_0000000_011100101001011011010111; //0072 96D7 0.4476141333580017
assign ang_p[8] = 32'b0_0000000_001110010100101110100101; //0039 4BA5 0.22381049394607544
assign ang_p[9] = 32'b0_0000000_000111001010010111011001; //001C A5D9 0.11190563440322876
assign ang_p[10] = 32'b0_0000000_000011100101001011101101; //000E 52ED 0.05595284700393677
assign ang_p[11] = 32'b0_0000000_000001110010100101110110; //0007 2976 0.027976393699645996
assign ang_p[12] = 32'b0_0000000_000000111001010010111011; //0003 94BB 0.013988196849822998
assign ang_p[13] = 32'b0_0000000_000000011100101001011101; //0001 CA5D 0.006994098424911499
assign ang_p[14] = 32'b0_0000000_000000001110010100101110; //0000 E52E 0.0034970492124557495
assign ang_p[15] = 32'b0_0000000_000000000111001010010111; //0000 7297 0.00174852460622787475assign ang_n[0] = 32'b1_1010011_000000000000000000000000; //complement code -45
assign ang_n[1] = 32'b1_1100101_011011110101100011001111; //complement code -26.56505113840103
assign ang_n[2] = 32'b1_1110001_111101101011100011000000; //complement code -14.036243438720703
assign ang_n[3] = 32'b1_1111000_110111111111111011101110; //complement code -7.1250163316726685
assign ang_n[4] = 32'b1_1111100_011011000111010101011010; //complement code -3.5763343572616577
assign ang_n[5] = 32'b1_1111110_001101011100100001101100; //complement code -1.7899105548858643
assign ang_n[6] = 32'b1_1111111_000110101101010111100110; //complement code -0.8951736688613892
assign ang_n[7] = 32'b1_1111111_100011010110100100101001; //complement code -0.4476141333580017
assign ang_n[8] = 32'b1_1111111_110001101011010001011011; //complement code -0.22381049394607544
assign ang_n[9] = 32'b1_1111111_111000110101101000100111; //complement code -0.11190563440322876
assign ang_n[10] = 32'b1_1111111_111100011010110100010011; //complement code -0.05595284700393677
assign ang_n[11] = 32'b1_1111111_111110001101011010001010; //complement code -0.027976393699645996
assign ang_n[12] = 32'b1_1111111_111111000110101101000101; //complement code -0.013988196849822998
assign ang_n[13] = 32'b1_1111111_111111100011010110100011; //complement code -0.006994098424911499
assign ang_n[14] = 32'b1_1111111_111111110001101011010010; //complement code -0.0034970492124557495
assign ang_n[15] = 32'b1_1111111_111111111000110101101001; //complement code -0.00174852460622787475localparam ang_180_p = 32'b0_1011_0100_0000_0000_0000_0000_0000_000; //+180 - Q23//象限判断标志 I-00 II-10 III-11 IV-01
//16-level-pipelevel
reg signed [31:0] cordic_x0 ,cordic_y0 ,cordic_z0 ,quadrant_0 ;
reg signed [31:0] cordic_x1 ,cordic_y1 ,cordic_z1 ,quadrant_1 ;
reg signed [31:0] cordic_x2 ,cordic_y2 ,cordic_z2 ,quadrant_2 ;
reg signed [31:0] cordic_x3 ,cordic_y3 ,cordic_z3 ,quadrant_3 ;
reg signed [31:0] cordic_x4 ,cordic_y4 ,cordic_z4 ,quadrant_4 ;
reg signed [31:0] cordic_x5 ,cordic_y5 ,cordic_z5 ,quadrant_5 ;
reg signed [31:0] cordic_x6 ,cordic_y6 ,cordic_z6 ,quadrant_6 ;
reg signed [31:0] cordic_x7 ,cordic_y7 ,cordic_z7 ,quadrant_7 ;
reg signed [31:0] cordic_x8 ,cordic_y8 ,cordic_z8 ,quadrant_8 ;
reg signed [31:0] cordic_x9 ,cordic_y9 ,cordic_z9 ,quadrant_9 ;
reg signed [31:0] cordic_x10,cordic_y10,cordic_z10,quadrant_10;
reg signed [31:0] cordic_x11,cordic_y11,cordic_z11,quadrant_11;
reg signed [31:0] cordic_x12,cordic_y12,cordic_z12,quadrant_12;
reg signed [31:0] cordic_x13,cordic_y13,cordic_z13,quadrant_13;
reg signed [31:0] cordic_x14,cordic_y14,cordic_z14,quadrant_14;
reg signed [31:0] cordic_x15,cordic_y15,cordic_z15,quadrant_15;
reg signed [31:0] cordic_x16,cordic_y16,cordic_z16,quadrant_16;//reg [1:0] quadrant; //象限判断标志 I-00 II-10 III-11 IV-01
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginquadrant_0 <= 2'd0;end else if( user_data_valid == 1'b1)beginquadrant_0 <= {user_x[31],user_y[31]};end
endalways @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x0 <= 32'd0;cordic_y0 <= 32'd0;cordic_z0 <= 32'd0;end else if( user_data_valid == 1'b1)begincase ({user_x[31],user_y[31]})2'b00: {cordic_x0,cordic_y0} <= {user_x, user_y};2'b10: {cordic_x0,cordic_y0} <= {{1'b0,~user_x[30:0]}+1'b1, user_y};2'b11: {cordic_x0,cordic_y0} <= {{1'b0,~user_x[30:0]}+1'b1, {1'b0,~user_y[30:0]}+1'b1};2'b01: {cordic_x0,cordic_y0} <= {user_x, {1'b0,~user_y[30:0]}+1'b1};endcasecordic_z0 <= 32'd0;endend//iterate 1
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x1 <= 32'd0;cordic_y1 <= 32'd0;cordic_z1 <= 32'd0;end else if(cordic_y0[31] == 1) begincordic_x1 <= cordic_x0 - ({{cordic_y0 >>> 0}});cordic_y1 <= cordic_y0 + ({{cordic_x0 >>> 0}});cordic_z1 <= cordic_z0 + ang_n[0];end else if(cordic_y0[31] == 0) begincordic_x1 <= cordic_x0 + ({{cordic_y0 >>> 0}});cordic_y1 <= cordic_y0 - ({{cordic_x0 >>> 0}});cordic_z1 <= cordic_z0 + ang_p[0];endend//iterate 2
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x2 <= 32'd0;cordic_y2 <= 32'd0;cordic_z2 <= 32'd0;end else if(cordic_y1[31] == 1) begincordic_x2 <= cordic_x1 - ({{cordic_y1 >>> 1}});cordic_y2 <= cordic_y1 + ({{cordic_x1 >>> 1}});cordic_z2 <= cordic_z1 + ang_n[1];end else if(cordic_y1[31] == 0) begincordic_x2 <= cordic_x1 + ({{cordic_y1 >>> 1}});cordic_y2 <= cordic_y1 - ({{cordic_x1 >>> 1}});cordic_z2 <= cordic_z1 + ang_p[1];endend//iterate 3
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x3 <= 32'd0;cordic_y3 <= 32'd0;cordic_z3 <= 32'd0;end else if(cordic_y2[31] == 1) begincordic_x3 <= cordic_x2 - ({{cordic_y2 >>> 2}});cordic_y3 <= cordic_y2 + ({{cordic_x2 >>> 2}});cordic_z3 <= cordic_z2 + ang_n[2];end else if(cordic_y2[31] == 0) begincordic_x3 <= cordic_x2 + ({{cordic_y2 >>> 2}});cordic_y3 <= cordic_y2 - ({{cordic_x2 >>> 2}});cordic_z3 <= cordic_z2 + ang_p[2];endend//iterate 4
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x4 <= 32'd0;cordic_y4 <= 32'd0;cordic_z4 <= 32'd0;end else if(cordic_y3[31] == 1) begincordic_x4 <= cordic_x3 - ({{cordic_y3 >>> 3}});cordic_y4 <= cordic_y3 + ({{cordic_x3 >>> 3}});cordic_z4 <= cordic_z3 + ang_n[3];end else if(cordic_y3[31] == 0) begincordic_x4 <= cordic_x3 + ({{cordic_y3 >>> 3}});cordic_y4 <= cordic_y3 - ({{cordic_x3 >>> 3}});cordic_z4 <= cordic_z3 + ang_p[3];endend//iterate 5
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x5 <= 32'd0;cordic_y5 <= 32'd0;cordic_z5 <= 32'd0;end else if(cordic_y4[31] == 1) begincordic_x5 <= cordic_x4 - ({{cordic_y4 >>> 4}});cordic_y5 <= cordic_y4 + ({{cordic_x4 >>> 4}});cordic_z5 <= cordic_z4 + ang_n[4];end else if(cordic_y4[31] == 0) begincordic_x5 <= cordic_x4 + ({{cordic_y4 >>> 4}});cordic_y5 <= cordic_y4 - ({{cordic_x4 >>> 4}});cordic_z5 <= cordic_z4 + ang_p[4];endend//iterate 6
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x6 <= 32'd0;cordic_y6 <= 32'd0;cordic_z6 <= 32'd0;end else if(cordic_y5[31] == 1) begincordic_x6 <= cordic_x5 - ({{cordic_y5 >>> 5}});cordic_y6 <= cordic_y5 + ({{cordic_x5 >>> 5}});cordic_z6 <= cordic_z5 + ang_n[5];end else if(cordic_y5[31] == 0) begincordic_x6 <= cordic_x5 + ({{cordic_y5 >>> 5}});cordic_y6 <= cordic_y5 - ({{cordic_x5 >>> 5}});cordic_z6 <= cordic_z5 + ang_p[5];endend//iterate 7
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x7 <= 32'd0;cordic_y7 <= 32'd0;cordic_z7 <= 32'd0;end else if(cordic_y6[31] == 1) begincordic_x7 <= cordic_x6 - ({{cordic_y6 >>> 6}});cordic_y7 <= cordic_y6 + ({{cordic_x6 >>> 6}});cordic_z7 <= cordic_z6 + ang_n[6];end else if(cordic_y6[31] == 0) begincordic_x7 <= cordic_x6 + ({{cordic_y6 >>> 6}});cordic_y7 <= cordic_y6 - ({{cordic_x6 >>> 6}});cordic_z7 <= cordic_z6 + ang_p[6];endend//iterate 8
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x8 <= 32'd0;cordic_y8 <= 32'd0;cordic_z8 <= 32'd0;end else if(cordic_y7[31] == 1) begincordic_x8 <= cordic_x7 - ({{cordic_y7 >>> 7}});cordic_y8 <= cordic_y7 + ({{cordic_x7 >>> 7}});cordic_z8 <= cordic_z7 + ang_n[7];end else if(cordic_y7[31] == 0) begincordic_x8 <= cordic_x7 + ({{cordic_y7 >>> 7}});cordic_y8 <= cordic_y7 - ({{cordic_x7 >>> 7}});cordic_z8 <= cordic_z7 + ang_p[7];endend//iterate 9
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x9 <= 32'd0;cordic_y9 <= 32'd0;cordic_z9 <= 32'd0;end else if(cordic_y8[31] == 1) begincordic_x9 <= cordic_x8 - ({{cordic_y8 >>> 8}});cordic_y9 <= cordic_y8 + ({{cordic_x8 >>> 8}});cordic_z9 <= cordic_z8 + ang_n[8];end else if(cordic_y8[31] == 0) begincordic_x9 <= cordic_x8 + ({{cordic_y8 >>> 8}});cordic_y9 <= cordic_y8 - ({{cordic_x8 >>> 8}});cordic_z9 <= cordic_z8 + ang_p[8];endend//iterate 10
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x10 <= 32'd0;cordic_y10 <= 32'd0;cordic_z10 <= 32'd0;end else if(cordic_y9[31] == 1) begincordic_x10 <= cordic_x9 - ({{cordic_y9 >>> 9}});cordic_y10 <= cordic_y9 + ({{cordic_x9 >>> 9}});cordic_z10 <= cordic_z9 + ang_n[9];end else if(cordic_y9[31] == 0) begincordic_x10 <= cordic_x9 + ({{cordic_y9 >>> 9}});cordic_y10 <= cordic_y9 - ({{cordic_x9 >>> 9}});cordic_z10 <= cordic_z9 + ang_p[9];endend//iterate 11
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x11 <= 32'd0;cordic_y11 <= 32'd0;cordic_z11 <= 32'd0;end else if(cordic_y10[31] == 1) begincordic_x11 <= cordic_x10 - ({{cordic_y10 >>> 10}});cordic_y11 <= cordic_y10 + ({{cordic_x10 >>> 10}});cordic_z11 <= cordic_z10 + ang_n[10];end else if(cordic_y10[31] == 0) begincordic_x11 <= cordic_x10 + ({{cordic_y10 >>> 10}});cordic_y11 <= cordic_y10 - ({{cordic_x10 >>> 10}});cordic_z11 <= cordic_z10 + ang_p[10];endend//iterate 12
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x12 <= 32'd0;cordic_y12 <= 32'd0;cordic_z12 <= 32'd0;end else if(cordic_y11[31] == 1) begincordic_x12 <= cordic_x11 - ({{cordic_y11 >>> 11}});cordic_y12 <= cordic_y11 + ({{cordic_x11 >>> 11}});cordic_z12 <= cordic_z11 + ang_n[11];end else if(cordic_y11[31] == 0) begincordic_x12 <= cordic_x11 + ({{cordic_y11 >>> 11}});cordic_y12 <= cordic_y11 - ({{cordic_x11 >>> 11}});cordic_z12 <= cordic_z11 + ang_p[11];endend//iterate 13
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x13 <= 32'd0;cordic_y13 <= 32'd0;cordic_z13 <= 32'd0;end else if(cordic_y12[31] == 1) begincordic_x13 <= cordic_x12 - ({{cordic_y12 >>> 12}});cordic_y13 <= cordic_y12 + ({{cordic_x12 >>> 12}});cordic_z13 <= cordic_z12 + ang_n[12];end else if(cordic_y12[31] == 0) begincordic_x13 <= cordic_x12 + ({{cordic_y12 >>> 12}});cordic_y13 <= cordic_y12 - ({{cordic_x12 >>> 12}});cordic_z13 <= cordic_z12 + ang_p[12];endend//iterate 14
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x14 <= 32'd0;cordic_y14 <= 32'd0;cordic_z14 <= 32'd0;end else if(cordic_y13[31] == 1) begincordic_x14 <= cordic_x13 - ({{cordic_y13 >>> 13}});cordic_y14 <= cordic_y13 + ({{cordic_x13 >>> 13}});cordic_z14 <= cordic_z13 + ang_n[13];end else if(cordic_y13[31] == 0) begincordic_x14 <= cordic_x13 + ({{cordic_y13 >>> 13}});cordic_y14 <= cordic_y13 - ({{cordic_x13 >>> 13}});cordic_z14 <= cordic_z13 + ang_p[13];endend//iterate 15
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x15 <= 32'd0;cordic_y15 <= 32'd0;cordic_z15 <= 32'd0;end else if(cordic_y14[31] == 1) begincordic_x15 <= cordic_x14 - ({{cordic_y14 >>> 14}});cordic_y15 <= cordic_y14 + ({{cordic_x14 >>> 14}});cordic_z15 <= cordic_z14 + ang_n[14];end else if(cordic_y14[31] == 0) begincordic_x15 <= cordic_x14 + ({{cordic_y14 >>> 14}});cordic_y15 <= cordic_y14 - ({{cordic_x14 >>> 14}});cordic_z15 <= cordic_z14 + ang_p[14];endend//iterate 16
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincordic_x16 <= 32'd0;cordic_y16 <= 32'd0;cordic_z16 <= 32'd0;end else if(cordic_y15[31] == 1) begincordic_x16 <= cordic_x15 - ({{cordic_y15 >>> 15}});cordic_y16 <= cordic_y15 + ({{cordic_x15 >>> 15}});cordic_z16 <= cordic_z15 + ang_n[15];end else if(cordic_y15[31] == 0) begincordic_x16 <= cordic_x15 + ({{cordic_y15 >>> 15}});cordic_y16 <= cordic_y15 - ({{cordic_x15 >>> 15}});cordic_z16 <= cordic_z15 + ang_p[15];endendalways @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begin{quadrant_1, quadrant_2, quadrant_3, quadrant_4} <= 4'b0;{quadrant_5, quadrant_6, quadrant_7, quadrant_8} <= 4'b0;{quadrant_9, quadrant_10, quadrant_11, quadrant_12} <= 4'b0;{quadrant_13, quadrant_14, quadrant_15, quadrant_16} <= 4'b0;end else begin{quadrant_1, quadrant_2, quadrant_3, quadrant_4 } <= {quadrant_0, quadrant_1, quadrant_2, quadrant_3 };{quadrant_5, quadrant_6, quadrant_7, quadrant_8 } <= {quadrant_4, quadrant_5, quadrant_6, quadrant_7 };{quadrant_9, quadrant_10, quadrant_11, quadrant_12} <= {quadrant_8, quadrant_9, quadrant_10, quadrant_11};{quadrant_13, quadrant_14, quadrant_15, quadrant_16} <= {quadrant_12, quadrant_13, quadrant_14, quadrant_15};end
endreg [4:0] iterate_times;
reg start_flag;always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginstart_flag <= 1'd0;end else if(user_data_valid == 1'b1) begin start_flag = 1'd1;end
endalways @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginiterate_times <= 5'd0;end else if(iterate_times >= 5'd17) begin iterate_times = 5'd17;end else if(user_data_valid == 1'b1 || start_flag == 1'b1 ) beginiterate_times <= iterate_times + 5'd1;end
endalways @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginuser_data_out_valid <= 1'b0;end else if(iterate_times >= 5'd16)beginuser_data_out_valid <= 1'b1;end else beginuser_data_out_valid <= 1'b0;end
endalways @(*) beginif(user_data_out_valid == 1'b1)begincase (quadrant_16)2'b00 : user_theat = (cordic_z16 >>>24);2'b10 : user_theat = (ang_180_p - (cordic_z16 >>>1)) >>> 23;2'b11 : user_theat = (ang_180_p + (cordic_z16 >>>1)) >>> 23;2'b01 : user_theat = (~(cordic_z16>>>24)) + 1'b1 ;endcaseendend//输出*0.607253
assign user_len =(user_data_out_valid == 1'b1)? ( (cordic_x16 >>> 1) + (cordic_x16 >>> 4) + (cordic_x16 >>> 5) +(cordic_x16 >>> 7) + (cordic_x16 >>> 8) + (cordic_x16 >>> 10)+(cordic_x16 >>> 11) + (cordic_x16 >>> 12)):32'd0; endmodule
以上实现一定要注意不能运算溢出,一旦溢出将影响相应判断。
iii、实验结果
相关文章:

FPGA实现Cordic算法——向量模式
FPGA实现Cordic算法——向量模式 FPGA实现Cordic算法——向量模式1.cordic算法基本原理2.FPGA实现cordic算法向量模式i、FPGA串行实现cordicii、FPGA流水线实现cordiciii、实验结果 FPGA实现Cordic算法——向量模式 1.cordic算法基本原理 FPGA中运算三角函数,浮点数…...

【常用代码14】el-input输入框内判断正则,只能输入数字,过滤汉字+字母。
问题描述: el-input输入框,只能输入数字,但是不能显示输入框最右边的上下箭头, <el-input v-model"input" type"number" placeholder"请输入内容" style"width: 200px;margin: 50px 0;&…...

[NLP]LLM--使用LLama2进行离线推理
一 模型下载 二 模型推理 本文基于Chinese-LLaMA-Alpaca-2项目代码介绍,使用原生的llama2-hf 克隆好了Chinese-LLaMA-Alpaca-2 项目之后,基于GPU的部署非常简单。下载完成以后的模型参数(Hugging Face 格式)如下: 简单说明一下各个文件的作…...

初始化一个Gin框架的Go-Web项目
使用到的第三方库 gin Gin 框架viper 配置文件管理cors 跨域资源请求配置gorm ORM 库zap 日志记录 main 包 Go 语言程序的入口点 main.go 文件 使用 flag 读取配置文件路径参数,默认当前目录下使用 viper 读取 config.ini 配置文件初始化初始数据初始化随机数种子初…...

Mybatis日期检索格式报错
问题复现 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String ##…...

如何把Android Framework学彻底?一条龙学习
Framework通俗易懂 平时学习 Android 开发的第一步就是去学习各种各样的 API,如 Activity,Service,Notification 等。其实这些都是 Framework 提供给我们的。Framework 层为开发应用程序提供了非常多的API,我们通过调用这些 API …...

uview indexList 按字母跳转不了
点击字母跳转不到位的问题:在<u-index-list>添加方法select“clickSelect“ 锚点要加id,用对应的字母做为id值, <u-index-anchor :id"key" :index"key"/> <template><view><view class&qu…...

安全模型中的4个P
引言:在安全模型中,经常会碰到PDR,PPDR,IPDRR,CARTA-PPDR等模型,其中的P,是predict?是prevent?还是protect?还是policy呢? 一、4P字典意思解释 1、predict&a…...

网站优化搜索引擎与关键词
网站优化搜索引擎与关键词 人们不应该高估搜索引擎的智商。这不利于seo的研究,事实上,搜索引擎是非常愚蠢的,让我们举一个非常简单的例子,你在搜索引擎中输入“教师”这个词,搜索引擎就会给出一个准确的搜索列表。我们…...

aws-msk-托管kafka集群的简单使用(VPC内部访问:无验证和SASL认证)
1.使用控制台创建即可 根据实例类型创建需要至少15分以上,可以提前创建好ec2实例和Secrets Manager,一会会使用到 2. 创建Secrets Manager (使用无认证时请跳过) 官方文档:https://docs.aws.amazon.com/zh_cn/msk/latest/deve…...

Unity UGUI(二)核心组件
Unity Canvas相关知识学习 文章目录 Unity Canvas相关知识学习1. Canvas:1.1 Render Mode1.2 多个Canvas的显示顺序 2.Canvas Scaler:屏幕分辨率自适应2.1 UI Scale Mode 3. EventSystem4. Standalone Input Module5. Graphic Raycaster:图形…...

代码随想录二刷第二天(Python)
27. 移除元素 题目链接:https://leetcode.cn/problems/remove-element/ 题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必…...

Mybatis学习笔记1 Mybatis入门
差不多根据mybatis中文文档:创建第一个mybatismaven项目,将它跑起来 入门_MyBatis中文网 新建库 建表 创建项目 重启之后 配置下Maven与encoding 成习惯了 新建模块 注意:这个GroupId和ArtifactId version是之后,你用Maven install时候后存放的包路径和包名 目录结构:虽然换…...

Spark 管理和更新Hadoop token 流程
Hadoop Token 管理 AM 通过 kerberos authenticationAM 获取 Yarn 和 HDFS TokenAM send tokens to containersContainers load tokens Enable debug message log4j.logger.org.apache.hadoop.securityDEBUG AM Generate tokens Logs: 23/09/07 22:38:50,375 INFO [main]…...

Android文件关联
用户需求:Android在系统文件夹找到一个文件想发送自己开发的app进行处理该怎么办? 这时候可以采用两个Activity,一个Activity用作Launcher,一个用于处理发送的文件;具体Activity intent-filter该怎么写了?可以参考下面的代码: <intent-filter><action androi…...

java操作adb查看apk安装包包名【搬代码】
Testpublic static void findadb() throws InterruptedException {String apkip"E:\\需求\\2023\\gql_1.0.1.apk";String findname1"cmd /c cd E:\\appium\\android-sdk\\build-tools\\27.0.2";//没有进到这里String s1 Cmd.exeCmd(findname1);System.out…...

【JAVA】Object类与抽象类
作者主页:paper jie_的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和…...

【设计模式】二、UML 类图概述
文章目录 常见含义含义依赖关系(Dependence)泛化关系(Generalization)实现关系(Implementation)关联关系(Association)聚合关系(Aggregation)组合关系&#x…...

百望云亮相服贸会 重磅发布业财税融Copilot
小望小望,我要一杯拿铁! 好的,已下单成功,请问要开具发票嘛? 在获得确认的指令后, 百小望AI智能助手 按用户要求成功开具了一张电子发票! 这是2023年服贸会国家会议中心成果发布现场&#x…...

vue 项目代码混淆配置(自定义插件适用)带配置项注释
文章目录 vue 项目代码混淆配置(自定义插件适用)带配置项注释一、概要二、混淆步骤1. 引入混淆插件2. 添加混淆配置3. 执行代码混淆 vue 项目代码混淆配置(自定义插件适用)带配置项注释 一、概要 本文章适用 vue-cli3/webpack4 …...

手写Spring:第7章-实现应用上下文
文章目录 一、目标:实现应用上下文二、设计:实现应用上下文三、实现:实现应用上下文3.1 工程结构3.2 Spring应用上下文和Bean对象扩展类图3.3 对象工厂和对象扩展接口3.3.1 对象工厂扩展接口3.3.2 对象扩展接口 3.4 定义应用上下文3.4.1 定义…...

Java(三)逻辑控制(if....else,循环语句)与方法
逻辑控制(if....else,循环语句)与方法 四、逻辑控制1.if...else(常用)1.1表达格式(三种) 2.switch...case(用的少)2.1表达式 3.while(常用)3.1语法格式3.2关键字beak:3.3关键字 continue: 4.for…...

通过API接口实现数据实时更新的方案(InsCode AI 创作助手)
要实现实时数据更新,需要采用轮询或者长连接两种方式。 1. 轮询方式 轮询方式指的是客户端定时向服务器请求数据的方式,通过一定的时间间隔去请求最新数据。具体的实现方法包括: 客户端定时向服务器发送请求,获取最新数据&…...

分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测
分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测 目录 分类预测 | MATLAB实现PCA-GRU(主成分门控循环单元)分类预测预测效果基本介绍程序设计参考资料致谢 预测效果 基本介绍 Matlab实现基于PCA-GRU主成分分析-门控循环单元多输入分类预测(完整程序和数据…...

el-dialog无法关闭
代码如下,:visible.sync"result2DeptVisible"来控制dialog的隐显问题,但当点击关闭的时候 ,无法关闭!! <el-dialog :visible.sync"result2DeptVisible" class"el-dialog-view">&…...

MATLAB算法实战应用案例精讲-【大模型】LLM算法(最终篇)
目录 前言 知识储备 1).通讯原语操作: 2).并行计算技术: 算法原理...

Mac brew -v 报错 fatal: detected dubious ownership in repository
Mac 电脑查询 brew版本时报错,如下错误: Last login: Fri Sep 8 14:56:21 on ttys021 sunshiyusunshiyudeMacBook-Pro-2 ~ % brew -v Homebrew 4.0.3-30-g7ac31f7 fatal: detected dubious ownership in repository at /usr/local/Homebrew/Library/Ta…...

Docker镜像、容器、仓库及数据管理
使用Docker镜像 获取镜像 使用docker pull命令,使用docker search命令可以搜索远端仓库中共享的镜像。 运行容器 使用docker run [OPTIONS] IMAGE [COMMAND] [ARG...]命令,如:docker run --name ubuntu_test --rm -it ubuntu:test /bin/b…...

Java的选择排序、冒泡排序、插入排序
不爱生姜不吃醋 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始,不如现在行动! 文章目录 🌴前言🌴一、选择排序1.原理2.时间复杂度3.代码实现 🌴二、冒泡排序1. 原理2. 时间复杂度3.代码实现 🌴三…...

Vagrant + VirtualBox + CentOS7 + WindTerm 5分钟搭建本地linux开发环境
1、准备阶段 将环境搭建所需要的工具和文件下载好(页面找不到可参考Tips部分) Vagrant 版本:vagrant_2.2.18_x86_64.msi 链接:https://developer.hashicorp.com/vagrant/downloads VirtualBox 版本:VirtualBox-6.1.46…...