在代码中,您可以看到有状态寄存器(reg [N-1] State)。我想在10个不同的信号或寄存器中访问10位状态,或者我们可以说有线。这怎么可能。 ?? 我使用了assign语句,但我想制作一个时钟逻辑。 这给出了错误
第33行:“< =”
附近的语法错误module Genes_Network #(
N =10 //
)
( input Clock ,
input Reset ,
// input reg [N-1:0] Satein,
output reg [N-1 : 0] State_Gene
);
reg [N-1:0] State ;
reg Fgf8,Emx2, Pax6,Coup_tfi,Sp8; // Genes
reg F,E,P,C,S ; // Proteins
//
Fgf8 <= State[9] ;
F <= State[N-2] ;
E <= State[N-4] ;
Pax6 <= State[N-5] ;
Emx2 <= State[N-3] ;
P <= State[N-6] ;
Coup_tfi<= State[N-7] ;
C <= State[N-8] ;
Sp8 <= State[N-8] ;
S <= State[N-9] ;
always @(posedge Clock )
//Network LOgic
Fgf8 <= F & (~E) & S;
endmodule
答案 0 :(得分:0)
当您设计组合逻辑时,您应该使用assign
并阻止分配(=
),即:
assign Fgf8 = State[9];
非阻塞分配(<=
)只能在时钟always
块中使用,即:
always @(posedge Clock)
Fgf8 <= F & (~E) & S;
另外一件事,请记住,你不能在两个不同的地方驱动相同的信号(在这种情况下为Fgf8
)。
答案 1 :(得分:0)
语法错误是您只能将网络或变量分配为并发赋值语句(assign
)或过程语句(always
,initial
等)的一部分。简单地说
var <= value;
单独出现语法错误。对于您的示例,最佳解决方案可能是将reg
声明更改为wire
,然后执行
assign Fgf8 = State[9] ;
assign F = State[N-2] ;
// etc.
您也可以按照
的方式做点什么always @(State)
begin
Fgf8 = State[9] ;
F = State[N-2] ;
// etc.
end
但是我似乎记得灵敏度列表(@(State)
)可能比使用矢量更棘手(就像它可能需要分解为@( State[9] or @State[8] or @State[7] or ...)
才能正常工作)。我已经使用SystemVerilog多年了,所以我不记得那些细节。这是SystemVerilog可以提供帮助的另一个领域 - 人们可以使用SV always_comb
代替always
进行组合逻辑,并完全跳过显式敏感列表。
在您的简单情况下,您可以放弃非阻止分配(<=
)而不会造成任何伤害,但不建议这样做。 @ Qiu的所有其他评论也适用,你也应该注意它们。