简化 Verilog 中数组变量的 "If" 语句

Simplifying "If" Statement of Arrayed Variables in Verilog

我正在使用 UART 输入各种字符 (ASCII) 并将每个字符转换为十六进制。我正在使用一个数组来存储这些字符输入。如果可能,我想简化这个可能过多的 "if" 语句。

我的声明:

reg [7:0] input_param [1:12]; // Array w/8-bit wide variables
localparam ASCII_0 = 8'h30;

// ASCII to Hex Conversion
always@(input_param)
  begin
    if     (input_param[1] == ASCII_0)          input_param_h[1]    =   4'h0;
    else if(input_param[1] == ASCII_1)          input_param_h[1]    =   4'h1;
    ...
    else if(input_param[1] == ASCII_F)          input_param_h[1]    =   4'hF;

这将继续我允许的输入数量:

    if     (input_param[12] == ASCII_0)         input_param_h[2]    =   4'h0;
    else if(input_param[12] == ASCII_1)         input_param_h[2]    =   4'h1;
    ...
    else if(input_param[12] == ASCII_F)         input_param_h[2]    =   4'hF;
  end

您可以在 for 循环中使用 case 语句:

integer i;
always @* begin
    for (i=1; i<=12; i=i+1) begin
        case (input_param[i])
            ASCII_0: input_param_h[i] = 4'h0;
            ASCII_1: input_param_h[i] = 4'h1;
            //
            ASCII_F: input_param_h[i] = 4'hF;
        endcase
    end
end

caseif/else.

更简单

for循环比12个case语句简单;循环将展开成 12 个并行的 case 语句。

always @* 比使用带有信号的灵敏度列表更简单。