Как обрабатывать двунаправленный штифт (inout) в задании Verilog
Я хочу использовать двунаправленную шину данных в моем контроллере. Вот код
module controller ( clk, data_out);
// Port Declaration
input clk;
inout [7:0] data_out;
reg [7:0] a;
reg [7:0] b;
wire [7:0] c;
// data should write to data_out (data_out act as output)
task write;
input c;
begin
assign data_out = a;
data_out <= c;
end
endtask
// data should read from data_out (data_out act as input)
task read;
output b;
begin
assign data_out = 8'bz;
b <= data_out;
end
endtask
endmodule
когда я компилирую это, я получаю сообщение об ошибке
LHS в процедурном непрерывном назначении не может быть net: data_out.
он говорит, что есть ошибка в assign data_out = a;
а также assign data_out = 8'bz;
Я знаю, что назначение должно быть сделано всегда или в начальном блоке, но в задаче, использующей эти блоки, бесполезны / дают эру
Тогда, как мы можем изменить направление автобуса в сторону задачи?
1 ответ
Вы не должны использовать assign в начальных и всегда блоках. Я не понимаю, почему вы обязательно хотите это в задании? Просто используйте назначить в одиночку. При присвоении значения двунаправленному порту необходим флаг, который указывает, какие действия - чтение или запись - должны быть выполнены. Синтаксис похож на:
assign bidir_port = [flag] ? a : 1'bz;