我正在写一些Verilog代码和我不断收到错误代码“无法解析多常数驱动程序”?

问题描述 投票:0回答:1

我想实现我的FPGA一个摩尔斯电码显示。我已经写了很多的代码,但我不断收到同样的错误消息。在我进入,虽然,请看一看分配。需要明确的是,我不要求别人为我做了分配。我只是需要帮助调试我的代码。

“第四部分在此部分练习使用的是FSM实现莫尔斯码编码器。莫尔斯电码使用短和长脉冲的图案来表示信息。每一个字母被表示为点的序列(短脉冲。),和短划线(长脉冲)例如,字母表中的第一八个字母具有以下表示:

一种 • -

乙 - •••

C - • - •

d - ••

•电子

F • • - •

G - - •

H • • • •

设计并实现了使用FSM莫尔斯电码编码器电路。你的电路应为字母的前八个字母输入一个和上一个红色的LED显示它的莫尔斯电码。使用交换机SW2-0和按钮KEY1-0作为输入。当用户按下KEY1,电路应显示用于通过SW2-0(000 A,001 B,等)中指定的字母的莫尔斯电码,使用0.5秒的脉冲来表示的点,和1.5秒的脉冲来表示破折号。按键KEY0应异步复位功能。

这是我写的代码:

module part4 (SELECT, button, CLOCK_50, RESET, led);
input [2:0]SELECT;
input RESET, button, CLOCK_50;
output reg led=0;
reg [26:0] COUNT=0; //register that keeps track of count
reg [1:0] COUNT2=0; //keeps track of half seconds
reg halfsecflag=0; //goes high every time half second passes
reg dashflag=0; // goes high every time 1 and half second passes
reg [3:0] code; //1 is dot and 0 is dash. There are 4 total
reg [1:0] c3=2'b00; //keeps track of the index we are on in the code.
reg [2:0] STATE; //register to keep track of states in the state machine
wire done=0; //a flag that goes up when one morse pulse is done.
reg ending=0; //another flag that goes up when a whole morse letter has 
flashed
reg [1:0] length; //This is the length of the morse letter. It varies from 1 
to 4
wire i; // if i is 1, then the state machine goes to "dot". if 0 "dash"

assign i = code[c3];
assign done= (halfsecflag)&&(~ending)&&~led;

parameter START= 3'b000, DOT= 3'b001, DASH= 3'b010, DELAY= 3'b011, IDLE= 
3'b100;

parameter A= 3'b000, B=3'b001, C=3'b010, D=3'b011, E=3'b100, F=3'b101, 
G=3'b110, H=3'b111;


always @(posedge CLOCK_50 or posedge RESET) //making counter
begin
if (RESET == 1)
COUNT <= 0;
else if (COUNT==25'd25000000)
begin
COUNT <= 0;
halfsecflag <= 1;
end
else
begin
COUNT <= COUNT+1;
halfsecflag <=0;
end
end

always @(posedge CLOCK_50 or posedge RESET)
begin
if (RESET == 1)
begin
COUNT2 <= 2'd00;
dashflag<=1'b0;
end
else if ((COUNT2==2)&&(halfsecflag))
begin
COUNT2 <= 2'd0;
dashflag<=1'b1;
end
else if ((halfsecflag)&&(COUNT2!=2))
begin
COUNT2<= COUNT2+2'd1;
dashflag<=1'b0;
end
end


always @(posedge button or RESET) //asynchronous reset
begin
STATE<=IDLE;
end


always@(*) begin //State machine
case (STATE)

START: begin
led <= 1;
if (i) STATE <= DOT;
else STATE <= DASH;
end

DOT: begin
if (halfsecflag && ~ending) STATE <= DELAY;
else if (ending) STATE<= IDLE;
else STATE<=DOT;
end

DASH: begin
if ((dashflag)&& (~ending))
STATE <= DELAY;
else if (ending)
STATE <= IDLE;
else STATE <= DASH;
end

DELAY: begin
led <= 0;
if ((halfsecflag)&&(ending))
STATE<=IDLE;
else if ((halfsecflag)&&(~ending))
STATE<=START;
else STATE <= DELAY;
end

IDLE: begin
c3<=2'b00;
if (button) STATE<=START;
STATE<=IDLE;
end

default: STATE <= IDLE;

endcase
end


always @(posedge button)
begin
case (SELECT)
A: length<=2'b01;
B: length<=2'b11;
C: length<=2'b11;
D: length<=2'b10;
E: length<=2'b00;
F: length<=2'b11;
G: length<=2'b10;
H: length<=2'b11;
default: length<=2'bxx;
endcase
end

always @(posedge button)
begin
case (SELECT)
A: code<= 4'b0001;
B: code<= 4'b1110;
C: code<= 4'b1010;
D: code<= 4'b0110;
E: code<= 4'b0001;
F: code<= 4'b1011;
G: code<= 4'b0100;
H: code<= 4'b1111;
default: code<=4'bxxxx;
endcase
end

always @(*)
begin 
if (c3==length) 
begin
c3=2'b00; ending<=1;
end
else if (done)
c3= c3+2'b01;
end 

endmodule 

错误代码我不断收到错误(10028):无法解析净多恒司机“C3 [1]”在part4.v(68)

另外,在绿色上面这个错误代码,它说推断锁几个不同的时间。这似乎并不好!你可以看看我的代码,看看你能弄清楚为什么我收到此错误消息?

更新:这不是我的前一个问题的副本。之前,我询问关于如何创建用Verilog延迟的提示。在这个问题上,我要求帮助调试我的代码。我得到的错误信息没有决策意识给我。我看了一下有关该错误代码堆栈交换其他的答案,但没有人对我有意义。

verilog state-machine
1个回答
1
投票

你错过了几个(非常)基本原则 - 你不能代码的硬件没有他们。请注意,我用VHDL术语在这里(“信号” /“过程”的/ etc),但这个想法是完全以Verilog一样的,如果有点困难找到合适的词语。

  1. 您只能从一个单一的过程驱动的信号(如果你合成,反正),或者你会得到多个驱动器。看看C3 - 它在哪儿驱动?你从2组合always块驾驶它。同样是国家的事实。
  2. 在组合的过程中,如果你读你的一个输出(驱动)信号分配给它(驾驶它),你推断内存之前。这是你的推断锁存器的来源。想想看 - 一个过程“唤醒”当事情是要更改/火灾敏感。如果然后读取它本身驱动信号的值,这必定意味着信号必须以便它有一个电流值的地方记录;它必须知道它有什么价值,当处理最后完成的。这是存储装置。你为国有和C3做到这一点(if(c3==length)必须阅读C3,case STATE必须阅读状态)。

你通过重新编码,使得所有信号从只有一个“所有者”过程驱动的固定(1)。

定影(2)是比较困难的。在组合过程中(alway @*)确保你无论是先给所有输出的默认值,或确保你从来不看什么,你已经写之前,所以,有没有关于内存是否被推断混乱。你的组合过程推导状态是错误的。你读状态,然后写出来。你应该有2个信号:当前的状态和未来状态。你应该阅读的当前状态,并创造下一个。

你有其他的问题,但你必须先解决这些2。

© www.soinside.com 2019 - 2024. All rights reserved.