входные порты для передачи данных между модулями - PullRequest
0 голосов
/ 27 октября 2018

Я новичок в Verilog. Мне нужно обмениваться данными между модулями (экземпляры одного и того же модуля и экземпляры другого модуля). Чтобы начать с более простого примера, я попытался иметь один модуль арбитра, который перемещает ввод на выход, только когда он включен, и другой модуль для чтения этого вывода. Следующий код компилируется и запускается в симуляторе, но он не отправляет данные на выход. Спасибо за вашу помощь и предложения.

Модули: MyBidirModule.v и SenderModule.v (который использует MyBidirModule и создается из верхнего модуля). [Этот код не изменяет вывод при изменении ввода].

Кроме того, в случае успеха мне потребуется массив двунаправленных сигналов, каждый из которых обеспечивает канал связи между отправителем и одним экземпляром модуля получателя. Как создать массив с переменным количеством входных портов 8 бит?

Спасибо, -BReddy

module MyBidirModule(
    input oe,
    input clk,
    input [7:0] inp,
    output [7:0] outp,
    inout [7:0] bidir
    );

reg [7:0] a;
reg [7:0] b;

assign bidir = oe ? a : 8'bz;
assign outp = b;

always @ (posedge clk)
begin
    b <= bidir;
    a <= inp;
end

endmodule


module SenderModule(
    input clk,
    output reg [7:0] led
   );

wire [7:0] input_value;
wire [7:0] bidir_signal;
wire [7:0] output_value;
reg move_input_output;

reg [7:0] myValue = 8'b00001111;

assign input_value = myValue;

MyBidirModule bidirModule(
    .oe(move_input_output),
    .clk(clk),
    .inp(input_value),
    .bidir(bidir_signal),
    .outp(output_value)
    );

initial begin
    #100;
    move_input_output = 1'b0; // Disable output on the bidir module
    #100;
    // read its current values
    $display("MyBidirModule: 1 input value: %x\n", input_value);
    $display("MyBidirModule: 1 output value: %x\n", output_value);
    $display("MyBidirModule: 1 bidir signal: %x\n", bidir_signal);

    // enable moving the input to the output: 
    // we write the current value 11110000 (x0f) in it
    move_input_output = 1'b1; // Enable output on the bidir module
    #100;
    $display("MyBidirModule: 2 input value: %x\n", input_value);
    $display("MyBidirModule: 2 output value: %x\n", output_value);
    $display("MyBidirModule: 2 bidir signal: %x\n", bidir_signal);

    myValue = 8'b11110000; // write (xf0)

    #200;

    // Check if output_value on the bidir_signal is as expected
    if (output_value == 8'b11110000) begin
        led[0] <= 1'b1;
        $display("MyBidirModule: 3 input value: %x\n", input_value);
        $display("MyBidirModule: 3 output value: %x\n", output_value);
        $display("MyBidirModule: 3 bidir signal: %x\n", bidir_signal);
    end else begin
        led[7] <= 1'b1;
        $display("MyBidirModule: 4 input value: %x\n", input_value);
        $display("MyBidirModule: 4 output value: %x\n", output_value);
        $display("MyBidirModule: 4 bidir signal: %x\n", bidir_signal);
    end
    #100;

    move_input_output = 0; // Disable output on the bidir module
    $display("MyBidirModule: 5 input value: %x\n", input_value);
    $display("MyBidirModule: 5 output value: %x\n", output_value);
    $display("MyBidirModule: 5 bidir signal: %x\n", bidir_signal);

end

endmodule

Выход:

MyBidirModule: 1 входное значение: 0f

MyBidirModule: 1 выходное значение: xx

MyBidirModule: 1 двунаправленный сигнал: zz

MyBidirModule: 2 входных значения: 0f

MyBidirModule: 2 выходных значения: xx

MyBidirModule: 2 двунаправленных сигнала: xx

MyBidirModule: 4 входных значения: f0

MyBidirModule: 4 выходных значения: xx

MyBidirModule: 4 двунаправленных сигнала: xx

MyBidirModule: 5 входных значений: f0

MyBidirModule: 5 выходных значений: xx

MyBidirModule: 5 двунаправленных сигналов: xx

...