2015-12-01 672 views
0

我试图在Verilog中编写一个顶级模块,只要传感器读取的值低于某个数值就会打开水阀。Verilog错误:赋值左侧的对象必须具有可变数据类型

这里是我的代码:

module ProjectDSD(alteraClock, sensorInput, openValve); 

input sensorInput, alteraClock; 
output openValve; 

always @(sensorInput) 
begin 

if(sensorInput < 100)  //sensor value to irrigate at 
begin 

openValve <= 1; //here 

end 

else 
begin 

openValve <= 0; //here 

end 
end  
endmodule 

即时得到一个错误说:

Object "openValve" on left-hand side of assignment must have a variable data type

我缺少什么?另外,我可以在Altera DE2-155电路板上使用哪些引脚输出数字信号,只有1和0表示阀门打开/关闭?

回答

0

S /输出openValve /输出REG openValve/

输出默认为wire;你需要一个reg。另请参阅this的问题。

0

尝试output reg openValve;

对于您的问题的后半部分(这应该是一个单独的问题)import this QSF file到您的项目。任何GPIO都可以配置为输出,并且可以通过侧面的40针头访问。

+0

根据任何IEEE1364或IEEE1800,这不是有效的语法。有些工具允许它,但这是一个不好的做法。我解释了另一个问题[这里](http://stackoverflow.com/a/33747519/1959732) – Greg

+0

公平点,我的坏。我(几乎)总是写ANSI,所以我错过了OP没有。 – wilcroft

+0

嗨格雷格 - 我找不到任何1364-2005这将使这个代码(或我的)无效。事实上,12.3.3明确允许它 - 注意“在模块的主体”和“输出reg”的生产。这种混淆可能是由于12.3.3底部的文本引起的,该文指出,如果decl不包含净或变量类型,则可以用净变量或变量decl再次声明它,并且p175上的示例显示这一点。 – EML

0

openValve目前被推断为wire。在output openValve;以下添加reg openValve;,您的代码将可以正常工作。


建议:它看起来像您遵循IEEE1364-1995非ANSI编码风格。仍然合法,您可能想要更改为IEEE 1364-2001及更高版本支持的ANSI编码风格。

非ANSI:

module ProjectDSD(alteraClock, sensorInput, openValve); 

input sensorInput, alteraClock; 
output openValve; 
reg openValve; 

ANSI:

module ProjectDSD(
    input alteraClock, sensorInput, 
    output reg openValve); 

对于组合块,它建议使用always @*(或同义always @(*))代替always @(sensorInput)@*是在IEEE1364-2001中也添加的自动灵敏度列表

相关问题