每路阀添加单独的开启超时机制

改动了固件
This commit is contained in:
Miaow 2022-08-24 22:10:11 +08:00
parent 054f1e9495
commit 6af8dfd09c
10 changed files with 106 additions and 34 deletions

View File

@ -35,5 +35,5 @@ b分支编号-h硬件版本-p协议版本-f固件版本
## 作者 ## 作者
**丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板工程很乱,重新开发了关于阀板的一切,并放到这个仓库里,计划以后就在这个仓库里迭代更新,无论有没有毕业,都很乐意解答关于阀板的所有问题 **丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板工程很乱,重新开发了关于阀板的一切,并放到这个仓库里,计划以后就在这个仓库里迭代更新,作者已经毕业,但很乐意解答关于阀板的所有问题

View File

@ -18,5 +18,5 @@
## 作者 ## 作者
**丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**无论有没有毕业,都很乐意解答关于这份协议的所有问题 **丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**作者已经毕业,但很乐意解答有关的所有问题

View File

@ -12,7 +12,7 @@ Quartus软件
## Changelog ## Changelog
**作者是丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**他是搞嵌入式的自师兄王聪2018年9月入学毕业后硬件领域师门出现空档期被老倪催的没办法了学了硬件并顺手写了这份FPGA代码无论有没有毕业作者都很乐意解答关于固件的所有问题 **作者是丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**他是搞嵌入式的自师兄王聪2018年9月入学毕业后硬件领域师门出现空档期被老倪催的没办法了顺手写了这份FPGA代码作者已经毕业很乐意解答关于固件的所有问题
### v1.0 ### v1.0
@ -31,3 +31,7 @@ Quartus软件
- 添加了高电压抑制,见[issue#4](https://github.com/NanjingForestryUniversity/valveboard/issues/4) - 添加了高电压抑制,见[issue#4](https://github.com/NanjingForestryUniversity/valveboard/issues/4)
- 修正了高电压时间为0.2ms - 修正了高电压时间为0.2ms
### 当前版本
- 暂且添加每路阀独立的开启超时为200ms见[issue#6](https://github.com/NanjingForestryUniversity/valveboard/issues/6)
- 通讯中断超时从原来的1s修改为200ms

View File

@ -1,3 +1,3 @@
Quartus_Version = Version 20.1.1 Build 720 11/11/2020 SJ Lite Edition Quartus_Version = Version 20.1.1 Build 720 11/11/2020 SJ Lite Edition
Version_Index = 520278016 Version_Index = 520278016
Creation_Time = Wed Aug 24 13:05:50 2022 Creation_Time = Wed Aug 24 21:50:38 2022

View File

@ -6,8 +6,8 @@ module tb_valveboard_firmware();
reg line_sen; reg line_sen;
reg line_sdata; reg line_sdata;
wire [48:0] signal_high_voltage; wire [47:0] signal_high_voltage;
wire [48:0] signal_low_voltage; wire [47:0] signal_low_voltage;
valveboard_firmware inst_valveboard_firmware( valveboard_firmware inst_valveboard_firmware(
.sys_clk (sys_clk), .sys_clk (sys_clk),
@ -38,7 +38,7 @@ module tb_valveboard_firmware();
valve_data = valve_data + 1; valve_data = valve_data + 1;
line_sen = 1;#50; line_sen = 1;#50;
for (idx = 0; idx < 48; idx = idx + 1) begin for (idx = 0; idx < 48; idx = idx + 1) begin
if (valve_data[idx] == 0) begin if (valve_data[idx] == 1) begin
line_sdata = 0;#125; line_sdata = 0;#125;
line_sclk = 1;#125; line_sclk = 1;#125;
line_sdata = 1;#125; line_sdata = 1;#125;

View File

@ -262,8 +262,8 @@ set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_
set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_board_design_signal_integrity set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_board_design_signal_integrity
set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_board_design_boundary_scan set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST OFF -section_id eda_board_design_boundary_scan
set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation
set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH normal_test -section_id eda_simulation set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH nnormal_test -section_id eda_simulation
set_global_assignment -name EDA_TEST_BENCH_NAME normal_test -section_id eda_simulation set_global_assignment -name EDA_TEST_BENCH_NAME nnormal_test -section_id eda_simulation
set_global_assignment -name EDA_DESIGN_INSTANCE_NAME NA -section_id normal_test set_global_assignment -name EDA_DESIGN_INSTANCE_NAME NA -section_id nnormal_test
set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME normal_test -section_id normal_test set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME nnormal_test -section_id nnormal_test
set_global_assignment -name EDA_TEST_BENCH_FILE tb_valveboard_firmware.v -section_id normal_test set_global_assignment -name EDA_TEST_BENCH_FILE tb_valveboard_firmware.v -section_id nnormal_test

View File

@ -1,6 +1,5 @@
/* /*
丁坤的阀板程序v1.3 2022/8/24 丁坤的阀板程序v1.4-beta1 2022/8/24
对应b02-h1.3-p1.1-f1.3
经测试高压时间改为0.2ms 经测试高压时间改为0.2ms
使用的是合肥的阀1.5A电流需0.2ms的100V(阀标称100V现场供电为96V)高电压 使用的是合肥的阀1.5A电流需0.2ms的100V(阀标称100V现场供电为96V)高电压
*/ */
@ -21,15 +20,14 @@ module valveboard_firmware(
parameter CHANNEL_NUM_MINUS_1 = CHANNEL_NUM - 1; parameter CHANNEL_NUM_MINUS_1 = CHANNEL_NUM - 1;
parameter HIGH_VOLTAGE_TIME = 32'd4000; // 高压时间HIGH_VOLTAGE_TIME / 20MHz = 0.2ms parameter HIGH_VOLTAGE_TIME = 32'd4000; // 高压时间HIGH_VOLTAGE_TIME / 20MHz = 0.2ms
parameter HIGH_VOLTAGE_TIME_MINUS_1 = HIGH_VOLTAGE_TIME - 1; parameter HIGH_VOLTAGE_TIME_MINUS_1 = HIGH_VOLTAGE_TIME - 1;
parameter FAULT_COUNTER_THRESHOLD = 32'd20_000_000; // 通讯中断超过FAULT_COUNTER_THRESHOLD / 20MHz = 1s就关所有阀 parameter LONGOPEN_COUNTER_THRESHOLD = 7'd20; // 一路阀打开超过LONGOPEN_COUNTER_THRESHOLD * 200_000 / 20MHz = 200ms就关闭
parameter FAULT_COUNTER_THRESHOLD_MINUS_1 = FAULT_COUNTER_THRESHOLD - 1; parameter DISCONNECT_FAULT_COUNTER_THRESHOLD = 32'd4_000_000; // 通讯中断超过FAULT_COUNTER_THRESHOLD / 20MHz = 200ms就关所有阀
parameter FAULT_COUNTER_THRESHOLD_PLUS_1 = FAULT_COUNTER_THRESHOLD + 1; parameter DISCONNECT_FAULT_COUNTER_THRESHOLD_MINUS_1 = DISCONNECT_FAULT_COUNTER_THRESHOLD - 1;
parameter DISCONNECT_FAULT_COUNTER_THRESHOLD_PLUS_1 = DISCONNECT_FAULT_COUNTER_THRESHOLD + 1;
reg [CHANNEL_NUM_MINUS_1:0] cache_signal_high_voltage;
reg [31:0] i; reg [31:0] i;
reg [31:0] fault_counter; reg [31:0] disconnect_fault_counter;
reg [0:0] fault_flag [0:7]; // fault_flag支持8类错误信号 reg [0:0] fault_flag [0:7]; // fault_flag支持8类错误信号
@ -171,27 +169,27 @@ module valveboard_firmware(
end end
/** /**
* 若通讯中断超过FAULT_COUNTER_THRESHOLD个csys_clk就置位fault_flag[1] * 若通讯中断超过DISCONNECT_FAULT_COUNTER_THRESHOLD个csys_clk就置位fault_flag[1]
* fault_flag[1]在posedge_line_sclk上升沿时刻清楚 * fault_flag[1]在posedge_line_sclk上升沿时刻清楚
*/ */
always @(posedge sys_clk or negedge rst_n) begin always @(posedge sys_clk or negedge rst_n) begin
if (!rst_n) begin if (!rst_n) begin
fault_counter <= 0; disconnect_fault_counter <= 0;
fault_flag[1] <= 0; fault_flag[1] <= 0;
end end
else if ({cache_line_sclk, line_sclk} == 6'b011111) begin else if ({cache_line_sclk, line_sclk} == 6'b011111) begin
fault_counter <= 0; disconnect_fault_counter <= 0;
fault_flag[1] <= 0; fault_flag[1] <= 0;
end end
else begin else begin
if (fault_counter >= FAULT_COUNTER_THRESHOLD_PLUS_1) if (disconnect_fault_counter >= DISCONNECT_FAULT_COUNTER_THRESHOLD_PLUS_1)
fault_flag[1] <= 1; fault_flag[1] <= 1;
else if (fault_counter >= FAULT_COUNTER_THRESHOLD_MINUS_1) begin else if (disconnect_fault_counter >= DISCONNECT_FAULT_COUNTER_THRESHOLD_MINUS_1) begin
fault_counter <= fault_counter + 1; disconnect_fault_counter <= disconnect_fault_counter + 1;
fault_flag[1] <= 1; fault_flag[1] <= 1;
end end
else begin else begin
fault_counter <= fault_counter + 1; disconnect_fault_counter <= disconnect_fault_counter + 1;
fault_flag[1] <= 0; fault_flag[1] <= 0;
end end
end end
@ -282,13 +280,79 @@ module valveboard_firmware(
end end
end end
/**
* 对系统时钟做分频得到100Hz的脉冲信号后续用于判断阀是否长时间开启
* 这样是不严谨的应当以数据接收完成时刻开始计时但CPLD资源不够了
*/
reg [17:0] sys_clk_divider;
reg sys_clk_div;
always @(posedge sys_clk or negedge rst_n) begin
if (!rst_n) begin
sys_clk_divider <= 0;
sys_clk_div <= 0;
end
else if (total_fault_flag) begin
sys_clk_divider <= 0;
sys_clk_div <= 0;
end
else begin
if (sys_clk_divider == 199_999) begin
sys_clk_divider <= 0;
sys_clk_div <= 1;
end
else begin
sys_clk_divider <= sys_clk_divider + 1;
sys_clk_div <= 0;
end
end
end
/*
* 在100Hz的脉冲信号时更新每路阀的开启时间计数器
* 到达超时时间后暂停计数
* 用100Hz的信号的原因是资源不够必须减少计数器位宽
* 这导致计数器存在随机的单周期不稳定时间
*/
reg [7:0] longopen_counter [0:CHANNEL_NUM_MINUS_1];
integer k;
always @(posedge sys_clk or negedge rst_n) begin
if (!rst_n) begin
for (k = 0; k < CHANNEL_NUM; k = k + 1) begin
longopen_counter[k] <= 0;
end
end
else if (total_fault_flag) begin
for (k = 0; k < CHANNEL_NUM; k = k + 1) begin
longopen_counter[k] <= 0;
end
end
else begin
for (k = 0; k < CHANNEL_NUM; k = k + 1) begin
if (cache2_line_sdata[k] == 0) begin
if (sys_clk_div && (longopen_counter[k] < LONGOPEN_COUNTER_THRESHOLD))
longopen_counter[k] <= longopen_counter[k] + 7'd1;
else
longopen_counter[k] <= longopen_counter[k];
end
else begin
longopen_counter[k] <= 0;
end
end
end
end
/** /**
* 高电压时间内(is_high_voltage_time高电平时)按cache2_line_sdata打开所需高电压高电压时间后关闭 * 高电压时间内(is_high_voltage_time高电平时)按cache2_line_sdata打开所需高电压高电压时间后关闭
* 需要注意的是已经开着的喷阀 在高压时间内不会再次使用高电压只是保持低电压
* 按cache2_line_sdata打开低电压 * 按cache2_line_sdata打开低电压
* 需要注意的是已经开着的喷阀 在高压时间内不会再次使用高电压只是保持低电压
* 此外根据开启时间计数器是否超时来决定是否关闭某路阀
* total_fault_flag会关闭所有喷阀 * total_fault_flag会关闭所有喷阀
*/ */
integer m;
// 已经开着的喷阀在高压时间内不会再次使用高电压只是保持低电压
wire [CHANNEL_NUM_MINUS_1:0] signal_high_voltage_wire = ~last_line_sdata | cache2_line_sdata;
always @ (posedge sys_clk or negedge rst_n) begin always @ (posedge sys_clk or negedge rst_n) begin
if (!rst_n) begin if (!rst_n) begin
signal_low_voltage <= ~0; signal_low_voltage <= ~0;
@ -299,13 +363,17 @@ module valveboard_firmware(
signal_high_voltage <= ~0; signal_high_voltage <= ~0;
end end
else if (is_high_voltage_time) begin else if (is_high_voltage_time) begin
// 已经开着的喷阀在高压时间内不会再次使用高电压只是保持低电压 // 阀的开启时间不超过LONGOPEN_COUNTER_THRESHOLD
signal_high_voltage <= ~last_line_sdata | cache2_line_sdata; for (m = 0; m < CHANNEL_NUM; m = m + 1) begin
signal_low_voltage <= cache2_line_sdata; signal_high_voltage[m] <= signal_high_voltage_wire[m] | ~(longopen_counter[m] < LONGOPEN_COUNTER_THRESHOLD);
signal_low_voltage[m] <= cache2_line_sdata[m] | ~(longopen_counter[m] < LONGOPEN_COUNTER_THRESHOLD);
end
end end
else begin else begin
signal_high_voltage <= ~0; signal_high_voltage <= ~0;
signal_low_voltage <= cache2_line_sdata; for (m = 0;m < CHANNEL_NUM; m = m + 1) begin
signal_low_voltage[m] <= cache2_line_sdata[m] | ~(longopen_counter[m] < LONGOPEN_COUNTER_THRESHOLD);
end
end end
end end

View File

@ -51,7 +51,7 @@ CPLD烧录口为简牛口用USB Blaster烧录的开发软件为Quartus。
## Changelog ## Changelog
丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156他刚入学时就被师兄叫去焊接汪学良的阀板后来接替师兄做了这个仓库里的阀板无论有没有毕业,都很乐意解答关于板子的所有问题 丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156他刚入学时就被师兄叫去焊接汪学良的阀板后来接替师兄做了这个仓库里的阀板作者已经毕业,但很乐意解答有关的所有问题
### v1.0 ### v1.0

View File

@ -69,5 +69,5 @@ DS90LV048具有内置终端电阻电路设计和布局布线只需注意匹
## 作者 ## 作者
**丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板的协议不明确(其实就没有协议,逆向工程后改进出来的这份协议),所以就大概描述了一下协议相关信息,无论有没有毕业,都很乐意解答关于这份协议的所有问题 **丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板的协议不明确(其实就没有协议,逆向工程后改进出来的这份协议),所以就大概描述了一下协议相关信息,作者已经毕业,但很乐意解答关于这份协议的所有问题

Binary file not shown.