【问题标题】:Simplifying "If" Statement of Arrayed Variables in Verilog在 Verilog 中简化数组变量的“If”语句
【发布时间】:2020-05-22 18:25:23
【问题描述】:

我正在使用 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】:

    您可以在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 @* 比使用带有信号的敏感度列表更简单。

    【讨论】:

      猜你喜欢
      • 2020-11-23
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      相关资源
      最近更新 更多