Jump to content

    
Sign in to follow this  
jenya7

Конструкция while - loop

Recommended Posts

Приветствую!

5 minutes ago, Pavia said:

Смешивать в одном блоке блокирующее и неблокирующее присвоение не допускается. 

:biggrin: 

Это более актуально для Verilog. А тут пример на VHDL :unknw:.

Да и фразу надо полную приводить "... для одной переменной ... не допускается"  - А для разных переменных мешайте на здоровье (с пониманием того что делаете).

Удачи! Rob.

Share this post


Link to post
Share on other sites

Приветствую!

12 minutes ago, andrew_b said:

Сам компилятор не даст вам прострелить ногу.

Да как же не даст! - Смотря какой компилятор. Может просто поворчать для вежливости warning-ом a потом еще и контрольный в голову добавит :mega_shok:.  

module shot_to_legs (
  input  wire        Clk,  
  input  wire  [1:0] a, b, c, d,
  output logic [1:0] ou
);

always_ff @(posedge Clk) begin
  ou = '0;

  case (a)
    2'b00: begin
      ou <= b;
    end
    2'b01: begin
      ou =  c;
    end
    2'b10: begin
      ou <= d;
    end
    default: begin
      //
    end
  endcase // a
end
endmodule

// Vivado 
WARNING: [Synth 8-6090] variable 'ou' is written by both blocking and non-blocking assignments, entire logic could be removed [..../src/test.sv:12]
WARNING: [Synth 8-6090] variable 'ou' is written by both blocking and non-blocking assignments, entire logic could be removed [..../src/test.sv:18]
....
Synthesis finished with 0 errors, 0 critical warnings and 0 warnings. // !!!

Удачи! Rob.

Share this post


Link to post
Share on other sites
23 hours ago, Nick_K said:

Во-вторых, если пролистать чуточку выше, то найдёте забавный комментарий в тексте:


...
--wait for 60 ns;
del := del + 1;
if (del = 6) then
	del := 0;
...

Из чего следует, что:

1. Нужно синтезировать задержку, а значит это клоковый модуль.

2. Частота работы блока 100MHz

С этим я не соглашусь.

 

Во-первых, этот код:

On 7/16/2019 at 8:44 AM, jenya7 said:

Вопрос можно ли сделать так


when ST_CHIP_ERASE_2 =>
    while(ready='0') loop  --read until rdy_by=1
        wb_stb_i <='1';		
        wb_we_i  <='0';       --read
        wb_addr_i <= "0100";  --rdy_by register address
        --wait for 60 ns;
        del := del + 1;
        if (del = 6) then
            del := 0;
            ready <= wb_dat_o(0);
            wb_stb_i <= '0';
        end if;	  
    end loop;

не синтезируемый, по крайней мере в FPGA, т.к. , например, Вивада вообще не поддерживает синтез while-loop, а только for-loop (см. https://www.xilinx.com/support/documentation/sw_manuals/xilinx2019_1/ug901-vivado-synthesis.pdf), а Квартус поддерживает, но только если кол-во итераций задано константой (см. https://www.intel.com/content/www/us/en/programmable/quartushelp/current/index.htm#hdl/vhdl/vhdl_list_support_d1537e1623.htm).

А в данном случае (while(ready='0')) кол-во итераций совсем не константа.

Я полагаю, что --wait for 60 ns; это закоментированная задержка типа wait for time_expression, потому что только с ней этот код имеет смысл, например в тетстбенче для симуляции.

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.

Sign in to follow this