Я новичок в 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