verilog 构造:在案例之后期待操作数
verilog construct : expecting operand after case
我目前正在为键盘做一个移位寄存器(虽然不确定这个术语是否正确)
实际计划是当人们按下每个数字键盘时,对应键盘的值将被存储到一个寄存器中。
由于用户在一个时钟周期只能输入一次,因此需要移位寄存器,以便在将输入传输到另一个模块之前将所有数字级联在一起
问题是,我遇到了一个错误
文本附近"case";期待一个操作数
这是这个特定模块的全部代码
input [3:0] key;
output [15:0] number;
reg [3:0] number0,number1,number2,number3;
always@(key)
begin
for ( i=3 ; i>=0 ; i=i-1)
begin
{
case(key)
0 : number[i] = 0;
1 : number[i] = 1;
2 : number[i] = 2;
3 : number[i] = 3;
4 : number[i] = 4;
5 : number[i] = 5;
6 : number[i] = 6;
7 : number[i] = 8;
9 : number[i] = 9;
10 : number[i] = 0;
11 : number[i] = 0;
default: number[i] = 4'bxxxx;
number <= number[i];
endcase
}
end
end
问题发生在
案例(关键)
我不确定为什么
"Curse those who vote this down for no research ! LOL"
不,事实上,我研究了很多,只是我是 verilog 的新手,有些部分很难在没有人解释的情况下进行调整(尤其是 运行 顺序和并行部分 运行 的部分)
您提供的代码存在一些问题。直接的问题是您正在使用 {
和 }
来包装您的 for 循环,就像您在 C 或 Java 中看到的那样,但是 Verilog 却使用 begin
和 end
用于创建代码块。因此,您需要删除那些额外的 {
和 }
字符(您已经有 begin
和 end
来完成这项工作)。
这里还有一些与您描述的设计不太相符的地方:
您需要将 numberx
声明为一个数组,而不是 4 个单独的变量。例如:
reg [3:0] number0,number1,number2,number3;
应该是:
reg [3:0] number[4];
因此,number
输出将需要一个新名称(或者数组需要一个新名称)。
另一件需要修复的事情是实际的移位寄存器。就目前而言,没有移位寄存器。 number <= number[i];
行在错误的位置,其行为与预期的非常不同(忽略现在的情况,这是一个语法错误,除非我遗漏了什么)。
您需要定义另一个 always
块来实现您的寄存器。该块将需要移入 number[0]
。不过,由于它是一个移位寄存器,我们不再需要数组的其他元素。
为了澄清以上所有内容,这里是您的模块的简化版本:
module keyShiftReg(clk, key, number);
input clk; // We need a clock for the shift register
input [3:0] key;
output reg [15:0] number;
reg [3:0] keyToNumber;
always @(*) begin // While you are correct in saying @(key), in most cases, creating a sensitivity list is difficult and leads to mistakes, so use @(*) for combinational logic
case (key)
0 : keyToNumber = 4'd0; // Always good to define the size
1 : keyToNumber = 4'd1;
2 : keyToNumber = 4'd2;
3 : keyToNumber = 4'd3;
4 : keyToNumber = 4'd4;
5 : keyToNumber = 4'd5;
6 : keyToNumber = 4'd6;
7 : keyToNumber = 4'd8;
9 : keyToNumber = 4'd9;
10 : keyToNumber = 4'd0;
11 : keyToNumber = 4'd0;
default: keyToNumber = 4'bxxxx;
endcase
end
always @(posedge clk) begin
number <= {number[11:0], keyToNumber}; // Shift the lower 12 bits of the register up and insert the new value (keyToNumber) into the least significant 4 bits
end
endmodule
我目前正在为键盘做一个移位寄存器(虽然不确定这个术语是否正确)
实际计划是当人们按下每个数字键盘时,对应键盘的值将被存储到一个寄存器中。
由于用户在一个时钟周期只能输入一次,因此需要移位寄存器,以便在将输入传输到另一个模块之前将所有数字级联在一起
问题是,我遇到了一个错误
文本附近"case";期待一个操作数
这是这个特定模块的全部代码
input [3:0] key;
output [15:0] number;
reg [3:0] number0,number1,number2,number3;
always@(key)
begin
for ( i=3 ; i>=0 ; i=i-1)
begin
{
case(key)
0 : number[i] = 0;
1 : number[i] = 1;
2 : number[i] = 2;
3 : number[i] = 3;
4 : number[i] = 4;
5 : number[i] = 5;
6 : number[i] = 6;
7 : number[i] = 8;
9 : number[i] = 9;
10 : number[i] = 0;
11 : number[i] = 0;
default: number[i] = 4'bxxxx;
number <= number[i];
endcase
}
end
end
问题发生在
案例(关键)
我不确定为什么
"Curse those who vote this down for no research ! LOL" 不,事实上,我研究了很多,只是我是 verilog 的新手,有些部分很难在没有人解释的情况下进行调整(尤其是 运行 顺序和并行部分 运行 的部分)
您提供的代码存在一些问题。直接的问题是您正在使用 {
和 }
来包装您的 for 循环,就像您在 C 或 Java 中看到的那样,但是 Verilog 却使用 begin
和 end
用于创建代码块。因此,您需要删除那些额外的 {
和 }
字符(您已经有 begin
和 end
来完成这项工作)。
这里还有一些与您描述的设计不太相符的地方:
您需要将 numberx
声明为一个数组,而不是 4 个单独的变量。例如:
reg [3:0] number0,number1,number2,number3;
应该是:
reg [3:0] number[4];
因此,number
输出将需要一个新名称(或者数组需要一个新名称)。
另一件需要修复的事情是实际的移位寄存器。就目前而言,没有移位寄存器。 number <= number[i];
行在错误的位置,其行为与预期的非常不同(忽略现在的情况,这是一个语法错误,除非我遗漏了什么)。
您需要定义另一个 always
块来实现您的寄存器。该块将需要移入 number[0]
。不过,由于它是一个移位寄存器,我们不再需要数组的其他元素。
为了澄清以上所有内容,这里是您的模块的简化版本:
module keyShiftReg(clk, key, number);
input clk; // We need a clock for the shift register
input [3:0] key;
output reg [15:0] number;
reg [3:0] keyToNumber;
always @(*) begin // While you are correct in saying @(key), in most cases, creating a sensitivity list is difficult and leads to mistakes, so use @(*) for combinational logic
case (key)
0 : keyToNumber = 4'd0; // Always good to define the size
1 : keyToNumber = 4'd1;
2 : keyToNumber = 4'd2;
3 : keyToNumber = 4'd3;
4 : keyToNumber = 4'd4;
5 : keyToNumber = 4'd5;
6 : keyToNumber = 4'd6;
7 : keyToNumber = 4'd8;
9 : keyToNumber = 4'd9;
10 : keyToNumber = 4'd0;
11 : keyToNumber = 4'd0;
default: keyToNumber = 4'bxxxx;
endcase
end
always @(posedge clk) begin
number <= {number[11:0], keyToNumber}; // Shift the lower 12 bits of the register up and insert the new value (keyToNumber) into the least significant 4 bits
end
endmodule