Jump to content
    

комбинаторная схема не работает

Здравствуйте!

Прошу посмотреть что не так в коде:

 

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

Share this post


Link to post
Share on other sites

9 часов назад, addi II сказал:

Проблема в том что при несоответствии id и acception_code и acception_mask match_sf_std всегда остается 1

Здравствуйте. Проблема доказывается, как минимум тестовым окружением и листингом, выводимым оным (либо временными диаграммами). Приведите их также

Share this post


Link to post
Share on other sites

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.

Если не поможет, наверно надо менять описание вашей функции. Синтезатор не ошибается.

Share this post


Link to post
Share on other sites

Не вижу деклараций acceptance_code_0 и acceptance_mask_0, странно, что синтезатор не ругается на их индексацию.

Share this post


Link to post
Share on other sites

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 by addi II

Share this post


Link to post
Share on other sites

image.thumb.png.f8055b109109d3b5f529324ec779d76b.png

исходя из картинки, видно что 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 by addi II

Share this post


Link to post
Share on other sites

1 hour ago, addi II 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;

 

Share this post


Link to post
Share on other sites

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 регистры пишутся первые два байта принятых данных, соотваетственно идентификатор всегда не соответствует. Ваше решение, интересное попробую применть, спасибо

Share this post


Link to post
Share on other sites

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;

 

странно, Ваш код также все пропускает

image.thumb.png.d028701552419bbc538ebba25050d530.png

Share this post


Link to post
Share on other sites

код с гитхаба также не соотвествуюет описанию на SJA1000, когда как предположительно должно быть идентично

image.thumb.png.0fe1c81f2d1ef77c530f003d9db3a079.png

И я также не понимаю как тут работает маска с фильтром, мне кажется на схеме после исключаюшего ИЛИ должен быть инвертор, а вместо ИЛИ должен быть И

Иначе фильтр не работает

 

Share this post


Link to post
Share on other sites

у MCP2515 более правильная фильтрация 

image.thumb.png.a246afcc145f14f9f5e85030178a72da.png

 

но она также не соотвествуюет фильтрации в коде с гитхаба

 

Share this post


Link to post
Share on other sites

On 10/27/2025 at 8:41 PM, addi II said:

странно, Ваш код также все пропускает

Там же всё замаскировано, только rtr проверяется, которого нет на диаграмме.

 

Это похоже ошибка в коде с гитхаба, по даташиту маскировка нулём, а на гитхабе(и в моём примере) единицей.

Edited by Timmy

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...