Перейти к содержанию
    

Имеем такой код:

reg [39:0] main_buffer_ch1

always @(posedge CFGMCLK)

begin

if(RxD_data_ready5)//записываем байт от ЭВМ в сдвиговый буфер

begin

main_buffer_ch1<=main_buffer_ch1<<8;//1

main_buffer_ch1[7:0]<=RxD_data5;//2

end

 

end

данный код работает нормально и в железе и в симуляторе, но стоит поменять две строки://1 и //2 местами, то данная конструкция меняет последовательность действий и сдвиг буфера съедает нулями RxD_data5. Мне всегда казалось, что все выполняется параллельно, поправьте если не прав :05:

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеем такой код:

reg [39:0] main_buffer_ch1

always @(posedge CFGMCLK)

begin

if(RxD_data_ready5)//записываем байт от ЭВМ в сдвиговый буфер

begin

main_buffer_ch1<=main_buffer_ch1<<8;//1

main_buffer_ch1[7:0]<=RxD_data5;//2

end

 

end

данный код работает нормально и в железе и в симуляторе, но стоит поменять две строки://1 и //2 местами, то данная конструкция меняет последовательность действий и сдвиг буфера съедает нулями RxD_data5. Мне всегда казалось, что все выполняется параллельно, поправьте если не прав :05:

 

Хотите персональные занятия по Верилогу?

Свяжитесь со мной по почте или по скайпу...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО совет неправильный. Правильный совет : учите матчасть, IEEE-1800-2012 -> 10. Assignment statements -> 10.4 Procedural assignments -> 10.4.2 Nonblocking procedural assignments -> далее по тексту искать "The order of the execution....." (с)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

main_buffer_ch1<=main_buffer_ch1<<8;//1

main_buffer_ch1[7:0]<=RxD_data5;//2

 

Когда мне надоело бороться с подобными "глюками" я стал писать короче и нагляднее:

 

main_buffer_ch1[39:0]={main_buffer_ch1[31:0],RxD_data5[7:0]};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И снова если не посылать к стандарту,

то под одним always если есть несколько неблокирующих присвоений в одну переменную, то выполниться последние, в вашем коде есть 2 присвоения

в младшие биты

main_buffer_ch1<=main_buffer_ch1<<8

- в этой строке в младшие 7 бит записываются 0

а в следующей строке

main_buffer_ch1[7:0]<=RxD_data5

- записывается данные

выполняется последние присвоение.

 

если строки поменять местами , то последним становиться пихание нулей в младшие биты.

 

Так что вы правы все выполняется параллельно, кроме кода

 

A<=10;

A<=20;

A<=30;

 

ведь надо было как-то понять что же в итоге будет в А?

 

 

то что выполняется последние присвоение позволяет более изящно описывать синхронный сброс

 

вместо

always @(posedge clk)
begin
   if(reset == 1'b1)
       data <= 0;
   else
       begin
         data  <= .....
         ....
       end
end

 

пишите

 

always @(posedge clk)
begin
  data  <= .....
  ....

  if(reset == 1'b1)
     data <= 0;

end

 

и выполниться последние присвоение в данные 0, если будет ресет, и нет громоздкого else begin end....

 

 

Когда мне надоело бороться с подобными "глюками" я стал писать короче и нагляднее:

 

main_buffer_ch1[39:0]={main_buffer_ch1[31:0],RxD_data5[7:0]};

 

все же лучше (если не требуется обратного)

main_buffer_ch1[39:0] <= {main_buffer_ch1[31:0],RxD_data5[7:0]}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...