Jump to content

    

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

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

Share this post


Link to post
Share on other sites

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

5 minutes ago, Pavia said:

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

:biggrin: 

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
1 час назад, RobFPGA сказал:

"... для одной переменной ... не допускается"

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

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
7 минут назад, RobFPGA сказал:

Да как же не даст! - Смотря какой компилятор.

Вроде бы речь идёт о коде на VHDL.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now