我为 Mealy 状态机定义了一个模块,用于检测特定序列。我没有对状态进行编码,因为这通常是更好的选择,因为我想以其他方式进行编码(我在一本书中看到了类似的示例,但代码是用 VHDL 编写的)。
module seq_detector(y_out,Clk,x_in);
output y_out;
reg y_out;
input x_in, Clk;
reg Q1,Q2,Q3,Q4;
always @(posedge Clk)
Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in));
Q2 <= ((!Q3)&&Q4;&&(!x_in))||(Q1&&Q2;&&(!Q3)&&(!Q4)&&x_in);
Q3 <= Q1&&Q2;&&(!Q3)&&(x_in);
Q4 <= (Q1&&Q2;&&(x_in))||(Q1&&(!Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(x_in))||((!Q1)&&(!Q3)&&Q4;&&x_in)||(Q1&&Q2;&&(!Q4)&&x_in);
always @(x_in or Q1 or Q2 or Q3 or Q4)
y_out <= Q3||(Q2&&(!Q4)&&x_in);
endmodule
编译代码时,出现以下错误。
mini_project.v:8: syntax error
mini_project.v:8: error: Invalid module instantiation
mini_project.v:9: error: Invalid module instantiation
mini_project.v:10: error: Invalid module instantiation
我看不出任何错误消息。有人可以解释一下错误消息并建议如何纠正它吗?
您的always 块中缺少开始和结束关键字。 该代码认为您正在尝试实例化模块而不是进行信号分配。 在always 块(Q1 分配)下仅捕获第一行。 其他人不会。 试试这个:
always @(posedge Clk)
begin
Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in));
Q2 <= ((!Q3)&&Q4;&&(!x_in))||(Q1&&Q2;&&(!Q3)&&(!Q4)&&x_in);
Q3 <= Q1&&Q2;&&(!Q3)&&(x_in);
Q4 <= (Q1&&Q2;&&(x_in))||(Q1&&(!Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(x_in))||((!Q1)&&(!Q3)&&Q4;&&x_in)||(Q1&&Q2;&&(!Q4)&&x_in);
end
顺便说一句,这段代码真的非常非常难看。 有更好的方法吗?
巧合的是,这是我的 CPE166 高级逻辑设计课程中当前的作业。 作业的主要思想是正确合成寄存器。 像这样的东西(尽管我们的分配要复杂得多,有多个可能的输入、更长的序列、重置、可编程序列和需要去抖的按钮):
module sequence_detector(
input wire x_in,clk,
output wire y_out
);
reg [3:0] seq, seq_nxt;
parameter correct_sequence = 4'b1001;
always @(posedge clk)
seq <= seq_nxt;
always @(*)
seq_nxt = {seq[2:0] , x_in};
assign y_out = (seq == correct_sequence);
endmodule
这将创建一个 4 位移位寄存器,该寄存器将在每个正时钟边沿移位。 x_in 的最新值将移入一侧,而 x_in 的最旧值将移出。 移位寄存器的当前值不断与参数
correct_sequence
进行比较,当该参数为真时,将使 y_out 变高。
您有多个语法错误。
您的
begin/end
块中需要有一个 always
。
always @(posedge Clk) begin
Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in));
Q2 <= ((!Q3)&&Q4;&&(!x_in))||(Q1&&Q2;&&(!Q3)&&(!Q4)&&x_in);
Q3 <= Q1&&Q2;&&(!Q3)&&(x_in);
Q4 <= (Q1&&Q2;&&(x_in))||(Q1&&(!Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(Q4)&&(!x_in))||((!Q1)&&(!Q2)&&(x_in))||((!Q1)&&(!Q3)&&Q4;&&x_in)||(Q1&&Q2;&&(!Q4)&&x_in);
end
即使修复了这个问题,你的代码中仍然有杂散的分号:
Q1 <= (Q1&&(!Q3))||((!Q1)&&Q2;&&(!Q3)&&(!Q4)&&(x_in));
// ---------------------------
上一行(末尾)只能有一个分号。 分号用于结束语句。