Làm thế nào để gán giá trị cho cổng hai chiều trong Verilog?


7

Tôi đang cố gắng sử dụng cổng hai chiều trong Verilog để tôi có thể gửi dữ liệu nhận qua nó. Vấn đề của tôi là khi tôi cố gắng gán một giá trị cho cổng bên trong một tác vụ, nhưng tôi cứ bị lỗi.

Đâu là cách chính xác để gán giá trị cho các loại biến này?

Mã của tôi là như sau:

    module test(value,var);

    inout value;
    output var;
    reg var,value;

    task sendValue;
      begin
        var = 1;
        value = 1;
      end
    endtask

   endmodule

và lỗi mà tôi nhận được là: ** Lỗi: C: / [...]: (vlog-2110) Tham chiếu bất hợp pháp đến một "giá trị" ròng.

Cảm ơn.

Câu trả lời:


14

Nếu bạn phải sử dụng bất kỳ cổng nào khi vào, Dưới đây là một số điều cần nhớ:

  1. Bạn không thể đọc và viết cổng đầu vào đồng thời, do đó giữ highZ để đọc.
  2. cổng vào không bao giờ có thể là loại reg.
  3. Cần có một điều kiện để viết. (dữ liệu trong mem nên được ghi khi Write = 1 và có thể đọc khi Write = 0).

Ví dụ: tôi sẽ viết mã của bạn theo cách sau.

module test (value, var);
  inout value;
  output reg var;

  assign value = (condition) ? <some value / expression> : 'bz;

  always @(<event>)
    var = value;

endmodule

BTW Khi var thuộc loại dây, bạn có thể đọc nó theo kiểu sau:

assign var = (different condition than writing) ? value : [something else];

Do đó như bạn có thể thấy, không có giới hạn nào về cách đọc nhưng cổng đầu vào PHẢI được viết theo cách hiển thị ở trên.

Tôi hy vọng điều đó giải thích cho bạn.


0

Kiểm tra xem thư viện bạn đang sử dụng có bao gồm bất kỳ trình điều khiển tristate nào không - chúng là những gì tôi luôn sử dụng trong tình huống này.

Nếu bạn buộc phải cố gắng thiết kế trình điều khiển tristate của riêng mình, hãy nhớ rằng đầu ra của nó phải là Z bất cứ khi nào nó nên cho phép đầu vào thay thế.


0

Đây 2cents của tôi,

wire [32-1:0] DATA;//bidireccional port in VERILOG/VHDL
logic put_input_in_bidi;

assign m_sram_if.SRAM_DATA_READ = DATA;//read from inout port
assign DATA = (put_input_in_bidi==1'b1)? m_sram_if.SRAM_DATA_WRITE : 32'hZZZZ_ZZZZ;//write in bidi iout port
assign put_input_in_bidi =     (blabla == 0)  &&  (bobbob == 1);//control write in bidi using master information
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.