【问题标题】:How to handle bidirectional pin (inout) in a verilog task如何在verilog任务中处理双向引脚(inout)
【发布时间】:2017-03-15 10:38:06
【问题描述】:

我想在我的控制器中使用双向数据总线。这是代码

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 可能不是网:data_out。

assign data_out = a;assign data_out = 8'bz; 有错误 我知道分配应该在始终或初始块中完成,但在使用这些块的任务中是无用的/给 eroor

那么,我们如何在任务中改变公交车的方向呢?

【问题讨论】:

    标签: task verilog bidirectional inout


    【解决方案1】:

    您不应该在 initial 和 always 块中使用 assign。我不明白你为什么一定要在任务中使用它? 只需单独使用assign。将值分配给双向端口需要一个标志,该标志指定应该执行什么操作 - 读取或写入。语法如下:

      assign bidir_port = [flag] ? a : 1'bz;
    

    【讨论】:

    • can't 应该替换为 shouldn't。尽管计划弃用,但程序分配(始终/初始内部分配)目前是合法的。 IEEE1800-2012 附件 C.4.2 “程序分配和取消分配语句可能是设计错误的来源,并且可能成为工具实施的障碍。程序分配和取消分配语句不提供无法通过另一种方法避免的能力。这些问题。因此,程序分配和取消分配语句在弃用列表中。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多