diff --git a/README.md b/README.md index 51ceea0..f652656 100644 --- a/README.md +++ b/README.md @@ -35,5 +35,5 @@ b分支编号-h硬件版本-p协议版本-f固件版本 ## 作者 -**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板工程很乱,重新开发了关于阀板的一切,并放到这个仓库里,计划以后就在这个仓库里迭代更新,无论有没有毕业,都很乐意解答关于阀板的所有问题 +**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板工程很乱,重新开发了关于阀板的一切,并放到这个仓库里,计划以后就在这个仓库里迭代更新,作者已经毕业,但很乐意解答关于阀板的所有问题 diff --git a/examples/README.md b/examples/README.md index b458ced..cea0a56 100644 --- a/examples/README.md +++ b/examples/README.md @@ -18,5 +18,5 @@ ## 作者 -**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,无论有没有毕业,都很乐意解答关于这份协议的所有问题 +**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,作者已经毕业,但很乐意解答有关的所有问题 diff --git a/firmware/README.md b/firmware/README.md index 808a80b..0b2dada 100644 --- a/firmware/README.md +++ b/firmware/README.md @@ -12,7 +12,7 @@ Quartus软件 ## Changelog -**作者是丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他是搞嵌入式的,自师兄王聪(2018年9月入学)毕业后硬件领域师门出现空档期,被老倪催的没办法了,就学了硬件并顺手写了这份FPGA代码,无论有没有毕业,作者都很乐意解答关于固件的所有问题 +**作者是丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他是搞嵌入式的,自师兄王聪(2018年9月入学)毕业后硬件领域师门出现空档期,被老倪催的没办法了,就顺手写了这份FPGA代码,作者已经毕业,但很乐意解答关于固件的所有问题 ### v1.0 @@ -31,3 +31,7 @@ Quartus软件 - 添加了高电压抑制,见[issue#4](https://github.com/NanjingForestryUniversity/valveboard/issues/4) - 修正了高电压时间为0.2ms +### 当前版本 + +- 暂且添加每路阀独立的开启超时为200ms,见[issue#6](https://github.com/NanjingForestryUniversity/valveboard/issues/6) +- 通讯中断超时从原来的1s修改为200ms diff --git a/firmware/db/valveboard_firmware.db_info b/firmware/db/valveboard_firmware.db_info index 6c54329..8b2948e 100644 --- a/firmware/db/valveboard_firmware.db_info +++ b/firmware/db/valveboard_firmware.db_info @@ -1,3 +1,3 @@ Quartus_Version = Version 20.1.1 Build 720 11/11/2020 SJ Lite Edition Version_Index = 520278016 -Creation_Time = Wed Aug 24 13:05:50 2022 +Creation_Time = Wed Aug 24 21:50:38 2022 diff --git a/firmware/tb_valveboard_firmware.v b/firmware/tb_valveboard_firmware.v index deaa60f..f3c9b95 100644 --- a/firmware/tb_valveboard_firmware.v +++ b/firmware/tb_valveboard_firmware.v @@ -6,8 +6,8 @@ module tb_valveboard_firmware(); reg line_sen; reg line_sdata; - wire [48:0] signal_high_voltage; - wire [48:0] signal_low_voltage; + wire [47:0] signal_high_voltage; + wire [47:0] signal_low_voltage; valveboard_firmware inst_valveboard_firmware( .sys_clk (sys_clk), @@ -38,7 +38,7 @@ module tb_valveboard_firmware(); valve_data = valve_data + 1; line_sen = 1;#50; 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_sclk = 1;#125; line_sdata = 1;#125; diff --git a/firmware/valveboard_firmware.qsf b/firmware/valveboard_firmware.qsf index d8fcd76..5f43187 100644 --- a/firmware/valveboard_firmware.qsf +++ b/firmware/valveboard_firmware.qsf @@ -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_boundary_scan 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_TEST_BENCH_NAME normal_test -section_id eda_simulation -set_global_assignment -name EDA_DESIGN_INSTANCE_NAME NA -section_id normal_test -set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME normal_test -section_id normal_test -set_global_assignment -name EDA_TEST_BENCH_FILE tb_valveboard_firmware.v -section_id normal_test \ No newline at end of file +set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH nnormal_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 nnormal_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 nnormal_test \ No newline at end of file diff --git a/firmware/valveboard_firmware.v b/firmware/valveboard_firmware.v index 773b569..04bf1c5 100644 --- a/firmware/valveboard_firmware.v +++ b/firmware/valveboard_firmware.v @@ -1,6 +1,5 @@ /* -丁坤的阀板程序v1.3 2022/8/24 -对应b02-h1.3-p1.1-f1.3 +丁坤的阀板程序v1.4-beta1 2022/8/24 经测试,高压时间改为0.2ms 使用的是合肥的阀,1.5A电流需0.2ms的100V(阀标称100V,现场供电为96V)高电压 */ @@ -21,15 +20,14 @@ module valveboard_firmware( parameter CHANNEL_NUM_MINUS_1 = CHANNEL_NUM - 1; parameter HIGH_VOLTAGE_TIME = 32'd4000; // 高压时间HIGH_VOLTAGE_TIME / 20MHz = 0.2ms parameter HIGH_VOLTAGE_TIME_MINUS_1 = HIGH_VOLTAGE_TIME - 1; - parameter FAULT_COUNTER_THRESHOLD = 32'd20_000_000; // 通讯中断超过FAULT_COUNTER_THRESHOLD / 20MHz = 1s,就关所有阀 - parameter FAULT_COUNTER_THRESHOLD_MINUS_1 = FAULT_COUNTER_THRESHOLD - 1; - parameter FAULT_COUNTER_THRESHOLD_PLUS_1 = FAULT_COUNTER_THRESHOLD + 1; + parameter LONGOPEN_COUNTER_THRESHOLD = 7'd20; // 一路阀打开超过LONGOPEN_COUNTER_THRESHOLD * 200_000 / 20MHz = 200ms就关闭 + parameter DISCONNECT_FAULT_COUNTER_THRESHOLD = 32'd4_000_000; // 通讯中断超过FAULT_COUNTER_THRESHOLD / 20MHz = 200ms,就关所有阀 + 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] fault_counter; + reg [31:0] disconnect_fault_counter; reg [0:0] fault_flag [0:7]; // fault_flag支持8类错误信号 @@ -171,27 +169,27 @@ module valveboard_firmware( end /** - * 若通讯中断,超过FAULT_COUNTER_THRESHOLD个csys_clk就置位fault_flag[1] + * 若通讯中断,超过DISCONNECT_FAULT_COUNTER_THRESHOLD个csys_clk就置位fault_flag[1] * fault_flag[1]在posedge_line_sclk上升沿时刻清楚 */ always @(posedge sys_clk or negedge rst_n) begin if (!rst_n) begin - fault_counter <= 0; + disconnect_fault_counter <= 0; fault_flag[1] <= 0; end else if ({cache_line_sclk, line_sclk} == 6'b011111) begin - fault_counter <= 0; + disconnect_fault_counter <= 0; fault_flag[1] <= 0; end else begin - if (fault_counter >= FAULT_COUNTER_THRESHOLD_PLUS_1) + if (disconnect_fault_counter >= DISCONNECT_FAULT_COUNTER_THRESHOLD_PLUS_1) fault_flag[1] <= 1; - else if (fault_counter >= FAULT_COUNTER_THRESHOLD_MINUS_1) begin - fault_counter <= fault_counter + 1; + else if (disconnect_fault_counter >= DISCONNECT_FAULT_COUNTER_THRESHOLD_MINUS_1) begin + disconnect_fault_counter <= disconnect_fault_counter + 1; fault_flag[1] <= 1; end else begin - fault_counter <= fault_counter + 1; + disconnect_fault_counter <= disconnect_fault_counter + 1; fault_flag[1] <= 0; end end @@ -282,13 +280,79 @@ module valveboard_firmware( 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打开所需高电压;高电压时间后关闭 - * 需要注意的是,已经开着的喷阀, 在高压时间内,不会再次使用高电压,只是保持低电压 * 按cache2_line_sdata打开低电压 + * 需要注意的是,已经开着的喷阀, 在高压时间内,不会再次使用高电压,只是保持低电压 + * 此外,根据开启时间计数器是否超时来决定是否关闭某路阀 * 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 if (!rst_n) begin signal_low_voltage <= ~0; @@ -299,13 +363,17 @@ module valveboard_firmware( signal_high_voltage <= ~0; end else if (is_high_voltage_time) begin - // 已经开着的喷阀,在高压时间内,不会再次使用高电压,只是保持低电压 - signal_high_voltage <= ~last_line_sdata | cache2_line_sdata; - signal_low_voltage <= cache2_line_sdata; + // 阀的开启时间不超过LONGOPEN_COUNTER_THRESHOLD + for (m = 0; m < CHANNEL_NUM; m = m + 1) begin + 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 else begin 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 diff --git a/hardware/README.md b/hardware/README.md index f64ae98..4960b15 100644 --- a/hardware/README.md +++ b/hardware/README.md @@ -51,7 +51,7 @@ CPLD烧录口为简牛口,用USB Blaster烧录的,开发软件为Quartus。 ## Changelog -丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156,他刚入学时就被师兄叫去焊接汪学良的阀板,后来接替师兄做了这个仓库里的阀板,无论有没有毕业,都很乐意解答关于板子的所有问题 +丁坤2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156,他刚入学时就被师兄叫去焊接汪学良的阀板,后来接替师兄做了这个仓库里的阀板,作者已经毕业,但很乐意解答有关的所有问题 ### v1.0 diff --git a/protocol/README.md b/protocol/README.md index f26af68..ed06727 100644 --- a/protocol/README.md +++ b/protocol/README.md @@ -69,5 +69,5 @@ DS90LV048具有内置终端电阻,电路设计和布局布线只需注意匹 ## 作者 -**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板的协议不明确(其实就没有协议,逆向工程后改进出来的这份协议),所以就大概描述了一下协议相关信息,无论有没有毕业,都很乐意解答关于这份协议的所有问题 +**丁坤,2019年9月入学、丁坤QQ1091546069、丁坤电话17761700156**,他觉得老阀板的协议不明确(其实就没有协议,逆向工程后改进出来的这份协议),所以就大概描述了一下协议相关信息,作者已经毕业,但很乐意解答关于这份协议的所有问题 diff --git a/protocol/阀板通信协议.pdf b/protocol/阀板通信协议.pdf deleted file mode 100644 index 7c89496..0000000 Binary files a/protocol/阀板通信协议.pdf and /dev/null differ