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 却使用 beginend 用于创建代码块。因此,您需要删除那些额外的 {} 字符(您已经有 beginend 来完成这项工作)。

这里还有一些与您描述的设计不太相符的地方:

您需要将 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