在代码中,您可以看到状态寄存器( 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发布于 2015-03-14 15:53:16
在设计组合逻辑时,应该使用assign和阻塞赋值(=),即:
assign Fgf8 = State[9]; 应仅在时钟always块中使用非阻塞分配(<=),即:
always @(posedge Clock)
Fgf8 <= F & (~E) & S; 还有一件事,记住你不能在两个不同的地方驱动相同的信号(在这个例子中是Fgf8)。
发布于 2015-03-14 19:46:56
语法错误是,您只能将网络或变量作为并发赋值语句(assign)或过程语句(always、initial等)的一部分进行分配。简单地说
var <= value;out本身是一个语法错误。在您的示例中,最好的解决方案可能是将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进行组合逻辑,并完全跳过显式敏感度列表。
在简单的情况下,您也许能够不受影响地使用非阻塞赋值(<=),但不建议这样做。所有其他@ you的评论也同样适用,你也应该注意它们。
https://stackoverflow.com/questions/29045500
复制相似问题