我想合成这个编码,但它一直告诉我“reg button_old,button_raise;”有错误。有没有人知道我在编码中有什么错误?非常感谢您的帮助。 我们正在使用nexys 4进行项目,我们能够模拟编码,但无法合成它,因此我们无法继续下一步。希望有人能帮助我们。
`timescale 1ns / 1ps
module Player (input clk, input rst,input button, input [29:0] set, input button_p1, input button_p2, output [3:0]oscore1, output [3:0]oscore2, output LED_ON, output answer, output [3:0]seg1, output [3:0]seg2)
reg button_old, button_raise;
reg number;
reg [3:0] Score_P1, Score_P2;
wire [3:0] Score_P1, Score_P2;
reg [6:0] sevseg;
wire answer;
reg Clk_10000;
reg [31:0] count;
reg [3:0] digit;
output [3:0] digit;
always @(posedge clk or posedge rst) begin
// detect rising edge
button_old = 0;
button = 0;
button_raise =1'b0;
if (button_old != button && button == 1'b1)
button_raise <= 1'b1
button_old <= button;
// increment number
if(button_raise == 1b'1)
begin
Score_P1 = 4'b0000;
Score_P2 =4'b0000;
if(~rst) number <= 0;
else if(button_p1 && !button_p2 && answer==1'b1)
Score_P1 <= (Score_P1 + 1);
else if(button_p2 && !button_p1 && answer==1'b1)
Score_P2 <= (Score_P2 + 1);
else if(button_p1 && button_p2 && answer==1'b1 || answer==1'b0)
LED_ON [0];
else LED_ON [7];
end
end
end else
button <=0;
button_old <=0;
button_raise <=0;
end
assign oscore1= Score_P1;
assign oscore2= Score_P2;
always @ (rd_ptr) begin
set = setlist[rd_ptr];
assign answer = set [totlen-1];
case (digit)
4'b1000: sevseg = set [27:21];
4'b0100: sevseg = set [20:14];
4'b0010: sevseg = set [13:7];
4'b0001: sevseg = set [6:0];
default: sevseg= 7'b0000000;
endcase
assign setlist[0] <= 29'b01111110100110011111101001111;
assign setlist[1] <= 29'b11111110100111111111101001111;
assign setlist[2] <= 29'b01111110000000111111100000000;
assign setlist[3] <= 29'b01111110100111111111100100000;
end
always@(digit or seg1 or seg2) begin
case(digit)
4'b1110: sevseg = seg1[41:35];
4'b1101: sevseg = seg1[34:28];
4'b1011: sevseg = seg2[27:21];
4'b0111: sevseg = seg2[20:14];
endcase
end
always @ (posedge Clk or negedge rst) begin
if (!rst) begin
count <= 32'd0;
Clk_10000<=0;
end else begin
if (count == 'd10000) begin
count <= 32d'0;
Clk_10000 <= ~Clk_10000;
end else begin
count <= count +1;
end
end
end
always @ (posedge Clk_10000 or negedge rst) begin
if (!rst) begin
digit <= 4'b1110;
end else if (Clk_10000) begin
digit <= {digit [2:0], digit [3]};
end
end
always @ (Score_P1)
begin
case (Score_P1)
4'b0000: seg1 <= 14'b0000001_0000001;
4'b0001: seg1 <= 14'b0000001_1001111;
4'b0010: seg1 <= 14'b0000001_0010010;
4'b0011: seg1 <= 14'b0000001_0000110;
4'b0100: seg1 <= 14'b0000001_1001100;
4'b0101: seg1 <= 14'b0000001_0100100;
4'b0110: seg1 <= 14'b0000001_0100000;
4'b0111: seg1 <= 14'b0000001_0001111;
4'b1000: seg1 <= 14'b0000001_0000000;
4'b1001: seg1 <= 14'b0000001_0001100;
4'b1010: seg1 <= 14'b1001111_0000001;
4'b1011: seg1 <= 14'b1001111_1001111;
4'b1100: seg1 <= 14'b1001111_0010010;
4'b1101: seg1 <= 14'b1001111_0000110;
4'b1110: seg1 <= 14'b1001111_0100100;
4'b1111: seg1 <= 14'b1001111_0100000;
endcase
end
always @ (Score_P2)
begin
case (Score_P2)
4'b0000: seg2 <= 14'b0000001_0000001;
4'b0001: seg1 <= 14'b0000001_1001111;
4'b0010: seg2 <= 14'b0000001_0010010;
4'b0011: seg2 <= 14'b0000001_0000110;
4'b0100: seg2 <= 14'b0000001_1001100;
4'b0101: seg2 <= 14'b0000001_0100100;
4'b0110: seg2 <= 14'b0000001_0100000;
4'b0111: seg2 <= 14'b0000001_0001111;
4'b1000: seg2 <= 14'b0000001_0000000;
4'b1001: seg2 <= 14'b0000001_0001100;
4'b1010: seg2 <= 14'b1001111_0000001;
4'b1011: seg2 <= 14'b1001111_1001111;
4'b1100: seg2 <= 14'b1001111_0010010;
4'b1101: seg2 <= 14'b1001111_0000110;
4'b1110: seg2 <= 14'b1001111_0100100;
4'b1111: seg2 <= 14'b1001111_0100000;
endcase
end
endmodule
答案 0 :(得分:0)
好的,我们这样做:
1。您的module
端口说明后错过了分号。
module Player (
input clk,
input rst,
input button,
input [29:0] set,
input button_p1,
input button_p2,
output [3:0]oscore1,
output [3:0]oscore2,
output LED_ON,
output answer,
output [3:0]seg1,
output [3:0]seg2);
2。您也无法在模块定义的顶部声明所有输入/输出,并将此输出声明降低:
output [3:0] digit;
因此,将其与其他输出相提并论。
3. 你在这里错过了一个分号:
button_raise <= 1'b1
4。这是一个错字,需要1'b1
:
if(button_raise == 1b'1)
与此相同:
count <= 32d'0;
5. 这没有做任何事情:
LED_ON [0];
else LED_ON [7];
我认为您的意思是指定LED_ON[0] <= 1'b1
和LED_ON[7] <= 1'b1
。
但是,您还将LED_ON
定义为仅1位,因此我假设您要将其定义为:
output reg [7:0] LED_ON,
6。你在某个地方也遗漏了一个end
语句,可能是因为你试图为多行没有包含在{{1}中的if语句}和begin
,就像这里:
end
7。您在顺序区块中使用了阻止分配end else
button <=0;
button_old <=0;
button_raise <=0;
,这是不允许的,如下所示:
=
请执行这些非阻止分配,例如always @(posedge clk or posedge rst) begin
// detect rising edge
button_old = 0;
。
8。您正在尝试在组合块中执行非阻塞分配:
<=
请执行这些阻止分配,例如always @ (rd_ptr) begin
//...
assign setlist[0] <= 29'b01111110100110011111101001111;
。v
9。你正试图在这样的组合模块中进行分配:
=
在always @ (rd_ptr) begin
set = setlist[rd_ptr];
assign answer = set [totlen-1];
块之外进行分配或完全摆脱always
。
10. 这些信号未在任何地方定义。所以编译器不知道如何处理它们。
assign
11。 Clk;
rd_ptr;
setlist;
totlen;
和Score_P1
都被定义为寄存器和电线两次。
Score_P2
与reg [3:0] Score_P1, Score_P2;
wire [3:0] Score_P1, Score_P2;
/ output
wire
相同。
12。您正在为您的输入分配answer
,就像它是一个寄存器一样。这没有任何意义。您只需将其指定为button
,因此请删除作业并将其作为输入。
您还要分配到您的输入0
。
13。您在组合块中分配set
,就像它是一个reg,但您已将其定义为连线。因此将其定义为reg。
14。您还将setlist
定义为一位,但您要将其编入setlist
到[0]
的索引,所以我们将其定义为4位。您还要为每个索引分配29位。所以我们把它称为二维数组,即使它从来没有读过,这没有任何意义。
15。 [3]
和seg1
被定义为4位,但您要将它们编入索引,一直到seg2
,所以让我们称它们为42位。
而且你有它,有15个以上的简单修复,现在你的代码毫无意义,可能什么也没做什么仍然没有意义,什么都不做,但实际上可以编译。最终结果:
[41:35]