我正在编写一些Verilog代码,并且不断收到错误代码“无法解析多个常量驱动程序”?

时间:2019-02-04 09:36:05

标签: verilog state-machine

我正在尝试在我的FPGA上实现摩尔斯电码显示。我写了很多代码,但我不断收到相同的错误消息。在开始之前,请先看一下作业。明确一点,我并不是要有人替我做作业。我只需要帮助调试我的代码。

“第四部分 在练习的这一部分中,您将使用FSM实现摩尔斯电码编码器。摩尔斯电码使用短脉冲和长脉冲模式来表示一条消息。每个字母表示为一系列点(短 脉冲)和破折号(长脉冲)。例如,字母表的前八个字母具有以下表示形式:

A•—

B —•••

C —•—•

D —••

E•

F••-•

G — —•

H••••

使用FSM设计和实现摩尔斯电码编码器电路。您的电路应将以下一项作为输入 字母的前八个字母,并在红色LED上显示摩尔斯电码。使用开关SW2-0和 按钮KEY1-0作为输入。用户按下KEY1时,电路应显示字母的摩尔斯电码 由SW2-0指定(A为000,B为001等),使用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):在part4.v(68)处无法解析网络“ c3 [1]”的多个常量驱动程序

在此错误代码上方也以绿色表示,它表示推断出的锁存器有不同的时间。这似乎不好!您可以看一下我的代码,看看是否能弄清楚为什么我收到此错误消息?

更新:这与我之前的问题不重复。在我询问有关如何使用Verilog创建延迟的提示之前。在这个问题中,我正在寻求调试代码的帮助。我收到的错误消息对我来说没有意义。我查看了有关该错误代码的堆栈交换上的其他答案,但是对我来说,这些答案都没有道理。

1 个答案:

答案 0 :(得分:1)

您缺少一些(非常)基本原则-没有它们,就无法编写硬件代码。请注意,我在这里使用的是VHDL术语(“信号” /“过程” /等),但是如果很难找到正确的词,在Verilog中的想法是完全相同的。

  1. 您只能从单个进程驱动信号(如果正在合成,无论如何),否则您将获得多个驱动程序。看c3-它在哪里驱动?您从2个组合始终块驱动它。 STATE也是如此。
  2. 在组合过程中,如果您在分配(驱动)输出之前先读取输出(驱动)信号之一,则表示在推断内存。这就是您推断出的闩锁的来源。考虑一下-当某个进程对更改/火灾敏感时,它就会“唤醒”。然后,如果它读取其自身驱动的信号的值,则必须表示该信号必须记录在某处,以使其具有当前值。它必须知道该过程最后完成时的值。这就是记忆的意义。您对STATE和c3都执行此操作(if(c3==length)必须 read c3,case STATE必须 read 状态)。

您通过重新编码来修复(1),以便仅从一个“所有者”进程驱动所有信号。

修复(2)更困难。在组合过程(alway @*)中,请确保您首先为所有输出提供默认值,或者确保在编写任何内容之前都不要读取任何内容,以免混淆是否推断了内存。您推导STATE的组合过程是错误的。您读STATE,然后将其写入。您应该有2个信号:当前状态和下一个状态。您应该阅读当前状态,然后创建下一个状态。

您还有其他问题,但是您需要先解决这2个问题。