addi II 1 October 25 Posted October 25 · Report post Здравствуйте! Прошу посмотреть что не так в коде: reg [28:0] id; wire [7:0] acceptance_code_1; wire [7:0] acceptance_code_2; wire [7:0] acceptance_code_3; wire [7:0] acceptance_mask_1; wire [7:0] acceptance_mask_2; wire [7:0] acceptance_mask_3; always @ (posedge clk )//or posedge rst) begin if (rst) id <= 29'h0; else if (sample_point & (rx_id1 | rx_id2) & (~bit_de_stuff)) id <= {id[27:0], sampled_bit}; end wire match_sf_std; assign match_sf_std = ( (id[3] == acceptance_code_0[0] | acceptance_mask_0[0] ) & (id[4] == acceptance_code_0[1] | acceptance_mask_0[1] ) & (id[5] == acceptance_code_0[2] | acceptance_mask_0[2] ) & (id[6] == acceptance_code_0[3] | acceptance_mask_0[3] ) & (id[7] == acceptance_code_0[4] | acceptance_mask_0[4] ) & (id[8] == acceptance_code_0[5] | acceptance_mask_0[5] ) & (id[9] == acceptance_code_0[6] | acceptance_mask_0[6] ) & (id[10] == acceptance_code_0[7] | acceptance_mask_0[7] ) & (rtr1 == acceptance_code_1[4] | acceptance_mask_1[4] ) & (id[0] == acceptance_code_1[5] | acceptance_mask_1[5] ) & (id[1] == acceptance_code_1[6] | acceptance_mask_1[6] ) & (id[2] == acceptance_code_1[7] | acceptance_mask_1[7] ) ); Проблема в том что при несоответствии id и acception_code и acception_mask match_sf_std всегда остается 1 Quote Share this post Link to post Share on other sites More sharing options...
Zversky 20 October 26 Posted October 26 · Report post 9 часов назад, addi II сказал: Проблема в том что при несоответствии id и acception_code и acception_mask match_sf_std всегда остается 1 Здравствуйте. Проблема доказывается, как минимум тестовым окружением и листингом, выводимым оным (либо временными диаграммами). Приведите их также Quote Share this post Link to post Share on other sites More sharing options...
sazh 9 October 26 Posted October 26 · Report post 11 часов назад, addi II сказал: Здравствуйте! Прошу посмотреть что не так в коде: reg [28:0] id; wire [7:0] acceptance_code_1; wire [7:0] acceptance_code_2; wire [7:0] acceptance_code_3; wire [7:0] acceptance_mask_1; wire [7:0] acceptance_mask_2; wire [7:0] acceptance_mask_3; always @ (posedge clk )//or posedge rst) begin if (rst) id <= 29'h0; else if (sample_point & (rx_id1 | rx_id2) & (~bit_de_stuff)) id <= {id[27:0], sampled_bit}; end wire match_sf_std; assign match_sf_std = ( (id[3] == acceptance_code_0[0] | acceptance_mask_0[0] ) & (id[4] == acceptance_code_0[1] | acceptance_mask_0[1] ) & (id[5] == acceptance_code_0[2] | acceptance_mask_0[2] ) & (id[6] == acceptance_code_0[3] | acceptance_mask_0[3] ) & (id[7] == acceptance_code_0[4] | acceptance_mask_0[4] ) & (id[8] == acceptance_code_0[5] | acceptance_mask_0[5] ) & (id[9] == acceptance_code_0[6] | acceptance_mask_0[6] ) & (id[10] == acceptance_code_0[7] | acceptance_mask_0[7] ) & (rtr1 == acceptance_code_1[4] | acceptance_mask_1[4] ) & (id[0] == acceptance_code_1[5] | acceptance_mask_1[5] ) & (id[1] == acceptance_code_1[6] | acceptance_mask_1[6] ) & (id[2] == acceptance_code_1[7] | acceptance_mask_1[7] ) ); Проблема в том что при несоответствии id и acception_code и acception_mask match_sf_std всегда остается 1 ( id[3] == acceptance_code_0 [0] | acceptance_mask_0[0] ) эквивалентно ( (id[3] == acceptance_code_0 [0]) | acceptance_mask_0[0] ). Наверно нагляднее пользоваться &&, || в данном случае. Смотрите RTL. Если не поможет, наверно надо менять описание вашей функции. Синтезатор не ошибается. Quote Share this post Link to post Share on other sites More sharing options...
Timmy 1 October 26 Posted October 26 · Report post Не вижу деклараций acceptance_code_0 и acceptance_mask_0, странно, что синтезатор не ругается на их индексацию. Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 October 27 Posted October 27 (edited) · Report post 21 hours ago, Timmy said: Не вижу деклараций acceptance_code_0 и acceptance_mask_0, странно, что синтезатор не ругается на их индексацию. код взят отсюда https://github.com/texane/can_controller/blob/master/firmware/hdl/rtl/verilog/can_acf.v Edited October 27 by addi II Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 October 27 Posted October 27 (edited) · Report post исходя из картинки, видно что id 2 не проходит, хотя настроен при этом я сделал более очевидное описание // Working in extended mode. ID match for standard format (11-bit ID). Using single filter. assign match_sf_std = ( (id[3] == acceptance_code_0[0]) && (acceptance_mask_0[0] == 1'b1 ) && (id[4] == acceptance_code_0[1]) && (acceptance_mask_0[1] == 1'b1 ) && (id[5] == acceptance_code_0[2]) && (acceptance_mask_0[2] == 1'b1 ) && (id[6] == acceptance_code_0[3]) && (acceptance_mask_0[3] == 1'b1 ) && (id[7] == acceptance_code_0[4]) && (acceptance_mask_0[4] == 1'b1 ) && (id[8] == acceptance_code_0[5]) && (acceptance_mask_0[5] == 1'b1 ) && (id[9] == acceptance_code_0[6]) && (acceptance_mask_0[6] == 1'b1 ) && (id[10] == acceptance_code_0[7]) && (acceptance_mask_0[7] == 1'b1 ) && (rtr1 == acceptance_code_1[4]) && (acceptance_mask_1[4] == 1'b1 ) && (id[0] == acceptance_code_1[5]) && (acceptance_mask_1[5] == 1'b1 ) && (id[1] == acceptance_code_1[6]) && (acceptance_mask_1[6] == 1'b1 ) && (id[2] == acceptance_code_1[7]) && (acceptance_mask_1[7] == 1'b1 ) /*& Edited October 27 by addi II Quote Share this post Link to post Share on other sites More sharing options...
Timmy 1 October 27 Posted October 27 · Report post 1 hour ago, addi II said: код взят отсюда https://github.com/texane/can_controller/blob/master/firmware/hdl/rtl/verilog/can_acf.v Тем более непонятно, из вашего фрагмента следует, что из оригинала вырезан кусок, с удалением много чего нужного, естественно, так оно не будет работать. А в последнем сообщении ещё и логика перепутана, вместо || поставлены &&. Я бы вообще это всё покороче записал, примерно в таком ключе: wire [11:0] local_id = {id[2:0], rtr1, id[10:3]}; wire [11:0] local_code = {acceptance_code_1[7:4], acceptance_code_0[7:0]}; wire [11:0] local_mask = {acceptance_mask_1[7:4], acceptance_mask_0[7:0]}; assign match_sf_std = ((local_id^local_code) & ~local_mask) == 12'b0; Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 October 27 Posted October 27 · Report post 1 hour ago, Timmy said: Тем более непонятно, из вашего фрагмента следует, что из оригинала вырезан кусок, с удалением много чего нужного, естественно, так оно не будет работать. А в последнем сообщении ещё и логика перепутана, вместо || поставлены &&. Я бы вообще это всё покороче записал, примерно в таком ключе: wire [11:0] local_id = {id[2:0], rtr1, id[10:3]}; wire [11:0] local_code = {acceptance_code_1[7:4], acceptance_code_0[7:0]}; wire [11:0] local_mask = {acceptance_mask_1[7:4], acceptance_mask_0[7:0]}; assign match_sf_std = ((local_id^local_code) & ~local_mask) == 12'b0; я убрал "лишнее" потому что источник передает данные в рамках стандартного сообщения, и приемник принимает данные в рамках сообщения с стандартном идентификатором. С оригинальным кодом в 2 и 3 регистры пишутся первые два байта принятых данных, соотваетственно идентификатор всегда не соответствует. Ваше решение, интересное попробую применть, спасибо Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 October 27 Posted October 27 · Report post 6 hours ago, Timmy said: Тем более непонятно, из вашего фрагмента следует, что из оригинала вырезан кусок, с удалением много чего нужного, естественно, так оно не будет работать. А в последнем сообщении ещё и логика перепутана, вместо || поставлены &&. Я бы вообще это всё покороче записал, примерно в таком ключе: wire [11:0] local_id = {id[2:0], rtr1, id[10:3]}; wire [11:0] local_code = {acceptance_code_1[7:4], acceptance_code_0[7:0]}; wire [11:0] local_mask = {acceptance_mask_1[7:4], acceptance_mask_0[7:0]}; assign match_sf_std = ((local_id^local_code) & ~local_mask) == 12'b0; странно, Ваш код также все пропускает Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 October 28 Posted October 28 · Report post код с гитхаба также не соотвествуюет описанию на SJA1000, когда как предположительно должно быть идентично И я также не понимаю как тут работает маска с фильтром, мне кажется на схеме после исключаюшего ИЛИ должен быть инвертор, а вместо ИЛИ должен быть И Иначе фильтр не работает Quote Share this post Link to post Share on other sites More sharing options...
addi II 1 October 28 Posted October 28 · Report post у MCP2515 более правильная фильтрация но она также не соотвествуюет фильтрации в коде с гитхаба Quote Share this post Link to post Share on other sites More sharing options...
Timmy 1 October 29 Posted October 29 (edited) · Report post On 10/27/2025 at 8:41 PM, addi II said: странно, Ваш код также все пропускает Там же всё замаскировано, только rtr проверяется, которого нет на диаграмме. Это похоже ошибка в коде с гитхаба, по даташиту маскировка нулём, а на гитхабе(и в моём примере) единицей. Edited October 29 by Timmy Quote Share this post Link to post Share on other sites More sharing options...