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

问题描述 投票:1回答:1

我使用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
arrays if-statement verilog data-conversion simplify
1个回答
2
投票

你可以使用一个 case 语句内 for 循环。

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

case 是简单的比 if/else.

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

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

© www.soinside.com 2019 - 2024. All rights reserved.