2016-09-06 13 views
1
  • создать этот код из этого Curcuit Image Here
  • И это изображение Ошибка Image Here
  • Этот Curcuit является четырехместный автобус Transcievers с 3-выходами

Verilog кодПочему я не могу ввести значение для inout-типа?

module Q52QuadrupleBus3Stlate(GAB,GBA,A,B); 
    inout [3:0] A,B; 
    input GAB,GBA; 
    reg winA,winB; 
    assign B = (GAB==1&&GBA==0) ? winA : 4'hz; 
    assign A = (GAB==0&&GBA==1) ? winB : 4'hz; 
    always @ (GAB or GBA) 
    begin 
     winA <= A; 
     winB <= B; 
    end 
endmodule 

Испытательный стенд

`timescale 1ps/1ps 
module Q52TestBench; 
    reg GAB; 
    reg GBA; 
    // Bidirs 
    wire [3:0] A; 
    wire [3:0] B; 
    parameter step = 10000; 
    Q52QuadrupleBus3Stlate uut (GAB,GBA,A,B); 
    initial begin 
      GAB = 0; 
      GBA = 0; 
      A = 0; B = 0; 
    #step GAB = 1; 
    #step GBA = 0; 
    #step GAB = 0; 
    #step GBA = 1; 
    #step GAB = 1; 
    #step GBA = 0; 
    #step GAB = 0; 
    #step GBA = 1; 
    #(step*10) $finish; 
    end 
endmodule 
+2

Вы не сможете приводной провод из процедурных блоков.Вам нужно что-то вроде: 'reg A1; назначить A = (some_condition)? A1: «hz;» и диск «A1» из процедурного блока. – sharvil111

+0

Thx очень много. verilog так сложно. –

ответ

1

В Verilog:

  • wire должны приводиться в действие output (или inout) из реализованным модуля или assign заявление

  • reg должен быть приводимой в always или initial блок.

Решение о том, должен ли сигнал быть режником или проводником, в основном определяется тем, какой код управляет сигналом. Ваши сигналы A и B управляются как выходом экземпляра модуля (uut), так и блоком initial. Итак, у вас есть дилемма. К счастью, это простое решение, которое обычно используется в Verilog.

возбуждающие inout из блока initial или always, вам потребуются некоторые дополнительные сигналы, в дополнение к проводам, подключенных к портам вашего модуля inout (A и B в вашем случае). Вы должны reg соответствовать друг:

reg [3:0] Ain; 
reg [3:0] Bin; 

и разрешающий сигнал, чтобы соответствовать друг:

reg  Aen; 
reg  Ben; 

Тогда вам нужно реализовать некоторые три-государственные драйверы, используя assign заявления:

assign A = Aen ? Ain : 'bz; 
assign B = Ben ? Bin : 'bz; 

Вам необходимо управлять reg с блока initial, а не wire s:

 Ain = 0; Bin = 0; 

и, наконец, вы также должны управлять разрешающий сигнал из одного initial блока:

 Aen = 1; Ben = 1; 

Вот законченный код:

`timescale 1ps/1ps 
module Q52TestBench; 
    reg GAB; 
    reg GBA; 
    // Bidirs 
    wire [3:0] A; 
    wire [3:0] B; 
    reg [3:0] Ain; 
    reg [3:0] Bin; 
    reg  Aen; 
    reg  Ben; 
    parameter step = 10000; 
    Q52QuadrupleBus3Stlate uut (GAB,GBA,A,B); 
    assign A = Aen ? Ain : 'bz; 
    assign B = Ben ? Bin : 'bz; 
    initial begin 
      GAB = 0; 
      GBA = 0; 
      Ain = 0; Bin = 0; 
      Aen = 1; Ben = 1; 
    #step GAB = 1; 
    #step GBA = 0; 
    #step GAB = 0; 
    #step GBA = 1; 
    #step GAB = 1; 
    #step GBA = 0; 
    #step GAB = 0; 
    #step GBA = 1; 
    #(step*10) $finish; 
    end 
endmodule 

https://www.edaplayground.com/x/5biz

+0

Я понял. thx очень Мэтью Тейлор. –