FPGA 学习小组
直播中

alexdos

6年用户 804经验值
擅长:可编程逻辑 电源/新能源 嵌入式技术 模拟技术
私信 关注

【FPGA学习】Verilog HDL的流程控制语句实例

流程控制语句包括:
• if 语句;
• case 语句;
• 循环语句。
if 语句的语法如下:
  1. if(condition_1)
  2. procedural_statement_1
  3. {else if(condition_2)
  4. procedural_statement_2}
  5. {else
  6. procedural_statement_3}

如果对 condition_1 求值的结果为一个非零值,那么 procedural_statement_1 被执行,
如果 condition_1 的值为 0、x 或 z,那么 procedural_statement_1 不执行。如果存在一个 else
分支,那么这个分支被执行。
下面是一个 if 语句的例子:
  1. if(Sum < 60)
  2. begin
  3. Grade = C;
  4. Total_C = Total_c + 1;
  5. end
  6. else if(Sum < 75)
  7. begin
  8. Grade = B;
  9. Total_B = Total_B + 1;
  10. end
  11. else
  12. begin
  13. Grade = A;
  14. Total_A = Total_A + 1;
  15. End


case 语句是一个多路条件分支形式,其语法如下:
  1. case(case_expr)
  2. case_item_expr{ ,case_item_expr} :procedural_statement
  3. . . .
  4. . . .
  5. [default:procedural_statement]
  6. endcase

case 语句首先对条件表达式 case_expr 求值,然后依次对各分支项求值并进行比较,第一个与条件表达式值相匹配的分支中的语句被执行。可以在 1 个分支中定义多个分支项,这些值不需要互斥。缺省分支覆盖所有没有被分支表达式覆盖的其他分支。下面是 case 语句的一个实例:
  1. always
  2. @ (A or B or OpCode)
  3. case (OpCode)
  4. ADD_INSTR: Z = A + B;
  5. SUB_INSTR: Z = A -B;
  6. MULT_INSTR: Z = A * B;
  7. DIV_INSTR: Z = A / B;
  8. endcase
  9. endmodule

Verilog HDL 中提供 4 种循环语句:forever 循环,repeat 循环,while 循环和 for 循环。forever 循环语句连续执行过程语句。因此为跳出这样的循环,中止语句可以与过程语句共同使用。同时,在过程语句中必须使用某种形式的时序控制,否则 forever 循环将在 0 延时后永远循环下去。forever 循环语句语法和实例如下:
  1. forever
  2. procedural_statement
  3. //实例
  4. initial
  5. begin
  6. Clock = 0;
  7. # 5 forever
  8. #10 Clock = ~Clock;
  9. end

这一实例产生时钟波形:时钟首先初始化为 0,并一直保持到第 5 个时间单位;此后每隔10 个时间单位,时钟反相一次。repeat 循环语句执行指定循环次数,如果循环计数表达式的值不确定,即为 x 或 z 时,那么循环次数按 0 处理。下面是 repeat 循环语句语法和实例如下:
  1. repeat(loop_count)
  2. procedural _ statement
  3. //实例
  4. repeat(Count)
  5. @ (posedge Clk) Sum = Sum + 1;//在时钟上升沿时每次加一

while 循环执行过程赋值语句直到指定的条件为假。如果表达式在开始时为假,那么过程语句便永远不会执行。如果条件表达式为 x 或 z,它也同样按 0(假)处理。下面时 while 循环的语法和实例:
  1. while(condition)
  2. procedural_statement
  3. //实例,一直执行直到 BY 小于等于 0
  4. while (BY > 0 )
  5. begin
  6. Acc = Acc << 1;
  7. By = By - 1;
  8. End

for 循环照指定的次数重复执行过程赋值语句。下面是 for 循环的语法和实例:
  1. for(initial_assignment ; condition ; step_assignment)
  2. procedural_statement
  3. //实例中,MAX_RANGE 为循环计次的上限,每次循环加一
  4. for (K=0 ; K < MAX_RANGE ; K = K + 1)
  5. begin
  6. if(Abus[K] == 0)
  7. Abus[K] = 1;
  8. else if(Abus[k] == 1)
  9. Abus[K] = 0;
  10. else
  11. $display( "Abus[K] is an x or a z");
  12. end
  13. end

更多回帖

发帖
×
20
完善资料,
赚取积分