- 2023-02-26
-
回复了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】六、上位机通信代码编写
火辣西米秀 发表于 2023-2-26 08:48
想知道代码实际验证的结果如何
角位置及角速度是否能控制住
之前用xilinx的片子验证过,没啥问题。后续可能需要再加一些故障检测相关的功能,完善一下配置,但是基本功能是没问题的。
- 2023-02-25
-
发表了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】六、上位机通信代码编写
本帖最后由 Jimmy_Arareb 于 2023-2-25 13:23 编辑
# 六、 上位机通信代码编写
## 1.SPI接口代码
RDC解算出当前角位置及角速度后,需要通过指定接口传输给上位机,用于后续外环的运动控制等功能。
一般的伺服电机应用中,位置传感器的更新频率与电流环调制频率同步,最高20KHz,按照角位置及角速度均为32位计算,最小带宽约为1.28Mbps。采用相对简易的SPI接口即可满足通信需求。
SPI接口的具体实现思路为:将需要读取的数据映射到对应的寄存器地址,角位置及角速度分为16位一组共4个地址,由于SPI时钟频率相比FPGA内部时钟频率较低,可以将使能、输入时钟及数据信号同步采样至内部时钟域后,利用状态机控制读写时序及完成串并转换。
> SPI时序图,截取自TMS320F2837xD Dual-Core Microcontrollers Technical Reference Manual
采用图中Falling edge without delay选项对应的时序,具体代码如下:
```verilog
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2023/02/24 21:34:54
// Design Name:
// Module Name: spi
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module spi (
input clk,
input rst,
input simo,
output somi,
input sck,
input cs,
input [31:0] data1,
input [31:0] data2
);
localparam idle = 8'b1;
localparam cs_down = 8'b10;
localparam trans_start = 8'b100;
localparam trans_finish = 8'b1000;
localparam addr_data1_31_16 = 16'd0;
localparam addr_data1_15_0 = 16'd1;
localparam addr_data2_31_16 = 16'd2;
localparam addr_data2_15_0 = 16'd3;
reg [ 7:0] state = idle;
reg [ 7:0] next_state;
reg [15:0] addr = addr_data1_31_16;
reg [15:0] addr_buf = addr_data1_31_16;
reg [15:0] data1_31_16 = 16'b0;
reg [15:0] data1_15_0 = 16'b0;
reg [15:0] data2_31_16 = 16'b0;
reg [15:0] data2_15_0 = 16'b0;
reg [15:0] data_buf = 16'b0;
reg [ 4:0] bit_cnt = 5'b0;
reg [12:0] watchdog_cnt = 13'b0;
reg [ 1:0] sck_buf = 2'b0;
reg sck_down_flag = 1'b0;
reg sck_up_flag = 1'b0;
assign somi = data_buf[15];
always @(rst, state) begin
if (~rst) begin
next_state = cs_down;
end else begin
case (state)
idle: next_state = cs_down;
cs_down: next_state = trans_start;
trans_start: next_state = trans_finish;
trans_finish: next_state = idle;
default: begin
next_state = idle;
end
endcase
end
end
always @(posedge clk) begin
if (~rst) begin
state
- 2023-02-23
-
发表了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】五、鉴相器代码编写
# 五、 鉴相器代码编写
## 1.鉴相器原理
在之前的帖子中实现的乘积检波器可以从旋转变压器的两路输出中提取出正余弦包络,为了实现旋转变压器作为角度传感器测量角度和角速度的功能,还需要进一步从正余弦包络中提取角度和角速度信息。
由于正余弦包络的数学表达式为角度的正余弦值,因此最直接的鉴相方法为计算正余弦包络的反正切函数得到角度,再取微分得到角速度。但实际信号中存在噪声,反正切函数对噪声非常敏感,并且微分操作会进一步放大高频噪声。反正切法仅适用于不需要获取角速度且对精度要求不高的场合。
实际工程中一般使用II型锁相环从包络中提取角度和角速度,其传递函数分别为二阶系统,可以通过选择合适的参数获得合适的带宽和阻尼比,抑制噪声的同时实现对角度和角速度的快速跟踪。
## 2.鉴相器仿真
在Simulink中搭建鉴相器模型,输入两路正余弦信号,观察输出,角度及角速度均收敛至目标值。
> 鉴相器Simulink仿真模型
在鉴相器内部,利用正余弦关系$$ sin\theta cos\hat{\theta}-cos\theta sin\hat{\theta}=sin(\theta -\hat{\theta})\approx \theta -\hat{\theta} $$小角度下近似得到角度跟踪误差,送入PI控制器中。仿真中控制器为离散形式,系统为II型系统,一般取阻尼比为0.707,带宽取系统最大带宽的5-10倍左右,整定锁相环参数。
> Simulink仿真结果
跟踪角度及角速度在第一圈以内收敛到实际值,且无稳态误差。
## 3.鉴相器代码
将上述模型定点化后,使用HDL Coder输出代码并做修改,代码如下:
```verilog
// -------------------------------------------------------------
//
// File Name: hdl_prj\hdlsrc\pll_hdl_fixed\PLL.v
// Created: 2023-02-12 17:26:10
//
// Generated by MATLAB 9.13 and HDL Coder 4.0
//
//
// -- -------------------------------------------------------------
// -- Rate and Clocking Details
// -- -------------------------------------------------------------
// Model base rate: 5e-06
// Target subsystem base rate: 5e-06
//
// -------------------------------------------------------------
// -------------------------------------------------------------
//
// Module: PLL
// Source Path: pll_hdl_fixed/PLL
// Hierarchy Level: 0
//
// -------------------------------------------------------------
`timescale 1 ns / 1 ns
module PLL (
clk,
rst,
sin_in,
cos_in,
theta,
omega,
update
);
input clk;
input rst;
input update;
input signed [15:0] sin_in; // sfix16_En15
input signed [15:0] cos_in; // sfix16_En15
output signed [31:0] theta; // sfix32_En32
output signed [31:0] omega; // sfix32_En21
reg signed [15:0] epsilon; // sfix16_En15
reg signed [31:0] p_e_kt; // sfix32_En21
wire signed [31:0] p_e_kt_p; // sfix32_En21
reg signed [31:0] Discrete_Time_Integrator1_x_reg; // sfix32_En32
reg signed [16:0] sin_theta; // sfix17_En15
wire signed [16:0] sin_theta_p; // sfix17_En15
wire signed [32:0] Product1_mul_temp; // sfix33_En30
reg signed [15:0] p_cos_sin; // sfix16_En15
wire signed [15:0] p_cos_sin_p; // sfix16_En15
reg signed [16:0] cos_theta; // sfix17_En15
wire signed [16:0] cos_theta_p; // sfix17_En15
wire signed [32:0] Product_mul_temp; // sfix33_En30
reg signed [15:0] p_sin_cos; // sfix16_En15
wire signed [15:0] p_sin_cos_p; // sfix16_En15
wire signed [15:0] Discrete_Time_Integrator_indtc; // sfix16
wire signed [31:0] gain_mul_temp; // sfix32_En8
wire signed [31:0] Discrete_Time_Integrator_u_gain; // sfix32
wire signed [31:0] Discrete_Time_Integrator_u_dtc; // sfix32_En21
wire signed [31:0] omega_1; // sfix32_En21
wire signed [31:0] Discrete_Time_Integrator_u_add; // sfix32_En21
reg signed [31:0] Discrete_Time_Integrator_x_reg; // sfix32_En21
reg signed [31:0] s_o_p; // sfix32_En21
wire signed [31:0] Discrete_Time_Integrator1_indtc; // sfix32
wire signed [63:0] gain1_mul_temp; // sfix64_En35
wire signed [31:0] Discrete_Time_Integrator1_u_gain; // sfix32
wire signed [31:0] Discrete_Time_Integrator1_u_dtc; // sfix32_En32
wire signed [31:0] theta_1; // sfix32_En32
wire signed [31:0] Discrete_Time_Integrator1_u_add; // sfix32_En32
reg [ 7:0] cnt = 0;
Sine_HDL_Optimized u_Sine_HDL_Optimized (
.u(Discrete_Time_Integrator1_x_reg), // sfix32_En32
.x(sin_theta_p) // sfix17_En15
);
assign Product1_mul_temp = cos_in * sin_theta;
assign p_cos_sin_p = Product1_mul_temp[30:15];
Cosine_HDL_Optimized u_Cosine_HDL_Optimized (
.u(Discrete_Time_Integrator1_x_reg), // sfix32_En32
.x(cos_theta_p) // sfix17_En15
);
assign Product_mul_temp = cos_theta * sin_in;
assign p_sin_cos_p = Product_mul_temp[30:15];
always @(posedge clk) begin
if (~rst) begin
cnt
- 2023-01-25
-
发表了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】四、检波器代码编写
本帖最后由 Jimmy_Arareb 于 2023-1-25 23:21 编辑
# 四、 检波器代码编写
[TOC]
## 1.旋转变压器原理
### 旋转变压器简介
旋转变压器是一种电磁式角度传感器,用来测量旋转轴的角位置和角速度,具有结构简单,可靠性高,耐振动、耐高低温的特点,广泛应用于以航空航天为代表的国防及工业产品中。
> 旋转变压器结构示意图
近年来电动汽车快速发展,旋转变压器由于其适用于汽车行驶过程中的恶劣工况的独特优势,开始进入民用领域。
旋转变压器的工作原理与普通变压器类似,在初级线圈通入励磁电压,通过旋转改变耦合进入次级绕组的磁链,对次级输出电压进行调制,得到包含角度信息的调幅信号。其中次级绕组有两组,分别称为正、余弦绕组,输出两路正交角度信号。通过对两路输出信号进行检波和鉴相,可以提取出当前转轴的角度和角速度。
### 数学模型
在理想条件下,旋转变压器的数学模型为:
其中$V_r$是激磁信号,$V_a$是余弦绕组输出,$V_b$是正弦绕组输出,$\omega$为激磁角频率,$\theta$为转轴角位置。
> 旋转变压器信号示意图
### RDC介绍
旋转变压器数字变换器(Resolver to Digital Converter, RDC)可以提供旋转变压器所需的激磁信号,并将旋转变压器输出的正余弦调制信号转化为角位置和角速度的数字信号并输出至数字控制器。
对于一般精度要求的应用,通常选用成品RDC芯片,如ADI公司的AD2S1210等。对于特殊应用,可以采用软件方式实现定制的RDC算法,有效补偿各类误差。软件实现RDC一般使用DSP或FPGA,其中DSP开发相对容易,但并行化程度与FPGA相比有一定差距,对于较为复杂的补偿算法不能满足实时性要求。FPGA开发周期较长,但硬件配置更加灵活,可以实时完成复杂算法。
RDC一般由三大主要部分组成:
1. 激磁信号源
* 提供激磁信号,驱动电流放大器。
2. 检波器
* 从正余弦调制信号中提取包络。
3. 鉴相器
* 从正余弦包络中提取角度和角速度。
## 2.检波器原理
### 检波方法
旋转变压器的输出本质上是双边带调幅信号。激磁信号由FPGA自身通过DDS及SPWM给出,可以直接进行相干解调。
使用乘积检波,将载波信号与两路旋变输出信号相乘,得到包含两个频率分量的信号。以正弦输出为例:
相乘后的信号经过低通滤波器后滤除高频部分:
得到包络信号:
余弦输出同理,归一化后得到两路正余弦包络,检波完成。
## 3.检波器实现
### 混频器
混频器直接例化PDS提供的乘法器IP即可,注意定点数相乘后的小数位数为相加关系。
为了节省APM资源,使用状态机控制两路信号依次进入乘法器,进行运算后输出。
```verilog
module mixer (
input clk_50m,
input rst_n,
input [15:0] sync_carrier,
input [15:0] ch_sin,
input [15:0] ch_cos,
input data_valid,
output reg [15:0] sin_mixed,
output reg [15:0] cos_mixed,
output reg data_ready
);
reg [15:0] ch_in = 16'b0;
wire [31:0] mult_out;
detector_multiplier u_detector_multiplier (
.a (sync_carrier), // input [15:0]
.b (ch_in), // input [15:0]
.clk(clk_50m), // input
.rst(~rst_n), // input
.ce (1'b1), // input
.p (mult_out) // output [31:0]
);
localparam IDLE = 6'b1
- 2023-01-24
-
回复了主题帖:
C语言设置/获取某一个变量中某一位的值
lugl4313820 发表于 2023-1-24 12:49
用位操作,是不是速度快一些。现在有些hal库,要判断好多次,编程速度高,效率不高。
hal库效率低是老黄历了,现代的编译器开o1局部优化之后,hal库内部这些表达式都会被优化掉,效率跟直接写寄存器基本没啥区别,反而hal库的可移植性和可读性比标准库和寄存器好得多。另外如果对io操作时序要求比较高的话,支持位带操作的单片机可以用位带操作,比读取寄存器做位运算再写入要快得多。
- 2023-01-16
-
回复了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】三、 AD7606驱动编写
本帖最后由 Jimmy_Arareb 于 2023-1-16 16:38 编辑
yyliu 发表于 2023-1-16 09:19 请教下,硬件如何连接。AD7606是开发板资源吗,还是通过排针IO引脚去驱动AD7606
不是开发板上的,是外接的。其实想给正点原子提点小建议,开发板两侧的排针只有边上有地线,在连接并口外设的时候容易串扰,希望以后的fpga开发板引出的排针能每隔几个io加一个地,保证信号完整性。
另外我现在手头没有ad7606,是拿另一块fpga模拟ad7606的时序。
- 2023-01-14
-
发表了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】三、 AD7606驱动编写
# 三、 AD7606驱动编写
[TOC]
## 1. AD7606驱动程序
AD7606是ADI公司出品的一款4/6/8通道同步采样,200kSPS,16位,$\pm$5、$\pm$15V双极性输入的ADC芯片。
### 芯片时序
参考数据手册,采用读取后转换,并口模式。芯片时序如下:
注意上电后需要先拉高`RESET`对芯片进行复位,否则芯片会工作异常。
开始转换时拉低`CONVST A/B`引脚,等待`BUSY`拉低后转换完成。注意从开始转换到`BUSY`拉高之间的间隔最大为45ns,需要单独设置状态进行处理,否则可能出现误触发。
转换完成后先拉低`CS`再输入时钟`RD`,完成读取后再拉高`CS`,一个采样周期完成。注意数据在`RD`下降沿更新,上升沿读取。
### 程序编写
采用状态机控制读取,上电及复位时进入`RESET`状态,先对AD7606进行复位。
复位完成后进入`IDLE`状态,等待数据采集开始标志输入。
开始采集后进入`WAIT_1`状态,完成计时后进入`WAIT_BUSY`状态,等待转换完成。
`BUSY`拉低后依次进入`READ_CH1`至`READ_CH4`状态,完成读取后进入`READ_STOP`状态,发出读取完成信号后回到`IDLE`状态,等待下一次触发。
```verilog
`timescale 1ns / 1ps
module ad7606_4 (
input clk,
input rst,
input [15:0] data_in, //ad7606通道a输入并行读取数据
input ad_busy, //ad7606输入busy信号
input capture_flag, //外界输入开始数据采集的标志
output reg ad_cs, //读ad7606的使能信号
output reg ad_rd, //读ad7606的时钟信号
output reg ad_convstab, //ad7606开始转换信号,低电平有效
output reg ad_reset, //ad7606复位信号
output reg [15:0] data_ch1,
output reg [15:0] data_ch2,
output reg [15:0] data_ch3,
output reg [15:0] data_ch4,
output wire capture_over
);
localparam RESET = 10'b0_000_000_001;
localparam IDLE = 10'b0_000_000_010;
localparam AD_CONV = 10'b0_000_000_100;
localparam WAIT_1 = 10'b0_000_001_000;
localparam WAIT_BUSY = 10'b0_000_010_000;
localparam READ_CH1 = 10'b0_000_100_000;
localparam READ_CH2 = 10'b0_001_000_000;
localparam READ_CH3 = 10'b0_010_000_000;
localparam READ_CH4 = 10'b0_100_000_000;
localparam READ_STOP = 10'b1_000_000_000;
localparam RESET_TIME = 5; //reset高电平持续时间
localparam CONV_TIME = 5; //AD_CONV状态持续时间等价转换信号低电平持续时间
localparam WAIT_TIME = 5; //WAIT_1状态持续时间
localparam FIV_CLK = 2;
reg [ 9:0] state;
reg [ 5:0] cnt; //在数据读取状态表示分频系数
reg [2 : 0] over;
always @(posedge clk)
if (!rst) cnt
- 2023-01-11
-
回复了主题帖:
02、国产FPGA 正点原子DFPGL22G开发板测评【学习篇】软件安装+流水灯
秦天qintian0303 发表于 2023-1-9 09:47
用单片机单线程的思维还是不太清楚,多线程的运行之间会有共用部分吗?比如同一个变量
fpga里面没有线程一说,你的代码会被综合成实际的数字电路,对于异步双口存储器一般直接调用IP核,自己写的话要做跨时钟域和访问冲突处理。
- 2023-01-03
-
发表了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】二、 DDS及SPWM实现
本帖最后由 Jimmy_Arareb 于 2023-1-3 16:43 编辑
# 二、 DDS及SPWM实现
[TOC]
## 1. DDS模块
### DDS原理
直接数字合成(Direct Digital Synthesizer, DDS)是一种使用单一固定时钟生成任意频率波形的技术。DDS由参考时钟、频率控制字、相位控制字、相位累加器、波形存储器及DAC组成,通过改变频率控制字及相位控制字对波形存储器中的数据进行抽样和偏移,更改输出信号的频率及相位。
### DDS代码实现
驱动旋转变压器需要频率为10KHz的正弦信号,由于没有更改频率的需求,设定参考时钟为50M,相位累加器宽度为20,正弦查找表深度为1024,宽度为16位,计算得到频率控制字为``20'd2097``。
```verilog
`timescale 1ns / 1ps
module dds #(
parameter phase_inc = 20'd2097
) (
input clk_50m,
input rst_n,
input [19:0] offset,
output wire [15:0] sin
);
reg [19:0] phase;
reg [19:0] offset_buf;
wire [19:0] addr;
assign addr = phase + offset_buf;
always @(posedge clk_50m) begin
if (~rst_n) begin
phase
- 2023-01-01
-
回复了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】一、 开箱,环境配置及示例工程运行
火辣西米秀 发表于 2022-12-30 09:07
用片上逻辑分析仪Debug Core可以捕捉FPGA运行过程中的信号确实效率高
目前发现Debug Core似乎会导致局部布线拥塞,不知道后续有没有优化。
- 2022-12-28
-
发表了主题帖:
【国产FPGA 正点原子DFPGL22G开发板】一、 开箱,环境配置及示例工程运行
本帖最后由 Jimmy_Arareb 于 2022-12-29 00:17 编辑
# 一、 开箱,环境配置及示例工程运行
[TOC]
## 1. 开箱
感谢EEWORLD论坛,正点原子以及紫光同创提供了本次测评机会。这也是我本人第一次进行开发板测评,请大家多多指教。
### 外观及包装
收到开发板时包装完好,配件齐全:
开发板本体:
开发板正反面均有亚克力板保护,防止磕碰。正点原子出品的开发板一如既往的外设丰富,使用方便。
### 配件
* FPGA 开发板 PGL22G
* 12V 1A 电源适配器
* 红外遥控器
* USB Type-C 线
* 收纳盒
* 紫光下载器 Usb Cable
### 功能验证
上电测试Flash中烧写的出厂测试程序,观察到LED及数码管正常显示,说明开发板工作正常。
## 2. 环境配置
紫光同创提供了一套完善的开发环境,除IP库有待进一步丰富外实际开发体验良好。
### Pango Design Suite
直接双击安装包进行安装即可,注意中途会安装USB Cable驱动及依赖库。
安装完毕后需要创建环境变量 `PANGO_LICENSE_FILE` 并添加License文件所在路径。
个人习惯使用VS Code进行文本编辑,在菜单栏中点击 `Edit -> Preferences` 进入 `Preferences` 窗口,选择 `Integrated Tools` 后编辑 `Text Editor` 栏,填写 `Code.exe` 所在路径,点击 `OK` 即可在编辑文本时自动调用VS Code。
在VS Code中,Verilog、System Verilog及VHDL均可通过插件可以实现代码高亮,代码跳转,代码自动补全,自动例化,测试模板生成,语法检查,代码格式化,版本管理等功能。
### ModelSim
本次测评所用计算机由于先前的项目开发,已提前安装ModelSim SE-64 10.5。
## 3. 示例工程运行
以正点原子提供的流水灯工程为例。
### 创建工程
按照PDS提供的新建工程向导进行即可,与其它FPGA开发环境操作基本一致。
1. 工程命名及工程路径
2. 添加工程文件
3. 指定器件型号
注意,由于没有Synplify Pro的证书,在器件型号页面中,综合工具需要选择ADS。
### 导入设计文件
流水灯例程如下:
```verilog
//****************************************Copyright (c)***********************************//
//技术支持:www.openedv.com
//淘宝店铺:http://openedv.taobao.com
//关注微信公众平台微信号:"正点原子",免费获取FPGA & STM32资料。
//版权所有,盗版必究。
//Copyright(C) 正点原子 2018-2028
//All rights reserved
//----------------------------------------------------------------------------------------
// File name: flow_led
// Last modified Date: 2018/7/11 11:12:36
// Last Version: V1.1
// Descriptions: 流水灯
//----------------------------------------------------------------------------------------
// Created by: 正点原子
// Created date: 2018/1/29 10:55:56
// Version: V1.0
// Descriptions: The original version
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//
module flow_led(
input sys_clk , //系统时钟
input sys_rst_n, //系统复位,低电平有效
output reg [3:0] led //4个LED灯
);
//reg define
reg [23:0] counter;
//*****************************************************
//** main code
//*****************************************************
//计数器对系统时钟计数,计时0.2秒
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
counter
- 2022-12-19
-
回复了主题帖:
测评入围名单:国产FPGA 紫光同创DFPGL22G开发板,正点原子出品
nmg 发表于 2022-12-19 17:35
测评预计是2月22日结束,期待这期间疫情状况能好转
具体会影响你哪部分的测评?
原计划在实验室进行评测,由于疫情原因不能去实验室,现在没有旋转变压器以及配套的ad和信号调理电路。
现在的备用计划是先用我手头其它的fpga开发板模拟旋转变压器及ad的输入输出,暂时替换掉传感器实物,对于开发板的评测部分和原计划没有区别,如果后续可以回到实验室进行实物验证就补上,您看要是没问题的话就先这么定了。
- 2022-12-15
-
回复了主题帖:
测评入围名单:国产FPGA 紫光同创DFPGL22G开发板,正点原子出品
个人信息无误,由于疫情原因缺少仪器设备,只能进行部分评测计划。