ASIC-WORLD Verilog(8)if-else语句和case语句

这篇具有很好参考价值的文章主要介绍了ASIC-WORLD Verilog(8)if-else语句和case语句。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 写在前面

        在自己准备写一些简单的verilog教程之前,参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。

        这是网站原文:Verilog Tutorial

        这是系列导航:Verilog教程系列文章导航

条件语句之if-else

        和C语言等程序语言类似,Verilog语法中的 if - else 语句可以根据条件的真假来选择执行不同分支的语句。如果每个分支需要执行的语句不止一条,则需要将这些语句都包含在 begin-end 语句之中。

if语句

        不带有分支的单独的if语句的一般语法:

if (condition)               //如果条件为真

        statements;        //则执行这条语句

        以下代码:当使能信号enable为真即执行语句latch <= din;

module simple_if();

reg latch;
wire enable,din;

always @ (enable or din)
if (enable) begin
  latch <= din;
end  

endmodule

  

if-else语句

        带有分支的if-else语句的一般语法:

if (condition)                //如果条件为真

        statements;         //则执行这条语句       

else                             //否则,即条件为假

        statements;         //则执行这条语句 

        以下代码:当复位信号reset为真即执行语句dff <= 0;否则执行语句dff <= din;

module if_else();

reg dff;
wire clk,din,reset;

always @ (posedge clk)
if (reset) begin
  dff <= 0;
end else  begin
  dff <= din;
end

endmodule

 

if-else if-else语句

        多级的if-else if-else语句的一般语法:

if (condition1)                //如果条件1为真

        statements;           //则执行这条语句            

else if (condition2)        //如果条件1为假但是条件2为真

        statements;           //则执行这条语句       

        ................

        ................

else                                //如果以上所有例举的条件均为假

        statements;            //则执行这条语句       

        以下代码:当复位信号reset为真即执行语句counter <= 4'b0000;当复位信号reset为假且使能信号为真与up_en信号为真即执行语句counter <= counter  + 1; 当复位信号reset为假且使能信号为真且up_en信号为假与up_down信号为真即执行语句counter <= counter  - 1; 当以上所有条件均不满足,则执行语句 counter <= counter;

module nested_if();

reg [3:0] counter;
reg clk,reset,enable, up_en, down_en;

always @ (posedge clk)
if (reset == 1'b0) begin
   counter <= 4'b0000; 
end else if (enable == 1'b1 && up_en == 1'b1) begin
   counter <= counter + 1'b1;
end else if (enable == 1'b1 && down_en == 1'b1) begin
   counter <= counter - 1'b1;
end else begin
   counter <= counter; 
end

endmodule

并行的if-else语句

        在上面的例子中条件2(enable == 1'b1 && up_en == 1'b1)比条件3(enable == 1'b1 && down_en == 1'b1)的优先级要高,也就是说当up_en == 1'b1与down_en == 1'b1同时有效时(其他条件相同),此时执行的是条件2对应的执行语句。

        这种优先级的if-else语句消耗的资源要比没有优先级的资源多(判断优先级需要消耗资源),有时我们并不需要对条件做优先级的判断,比如2个输入在逻辑上一定是互斥的情况,这时就可以使用并行的if-else语句来节省资源。

module parallel_if();

reg [3:0] counter;
wire clk,reset,enable, up_en, down_en;

always @ (posedge clk)
if (reset == 1'b0) begin
   counter <= 4'b0000; 
end else begin
  if (enable == 1'b1 && up_en == 1'b1) begin
    counter <= counter + 1'b1;
  end
  if (enable == 1'b1 && down_en == 1'b1) begin
    counter <= counter - 1'b1;
  end 
end  

endmodule

条件语句之case

        同样的,和C语言等程序语言类似,Verilog语法除了 if - else 语句外,也有case语句。case语句会列出多个条件(后边跟执行语句),从上到下根据条件的真假判断来执行对应分支的语句。如果每个分支需要执行的语句不止一条,则需要将这些语句都包含在 begin-end 语句之中。

        这是case语句的一般语法:

case ()        //条件

    < case1 > : < statement >    //条件在这里满足执行对应语句
    < case2 > : < statement >    //条件在这里满足执行对应语句
    .....                        //--
    default : < statement >        //所有情况都不满足则执行这条语句

endcase

        这是一个例子:

module mux (a,b,c,d,sel,y); 
input a, b, c, d; 
input [1:0] sel; 
output y; 

reg y;

always @ (a or b or c or d or sel) 
case (sel)           //sel的值即为条件
  0 : y = a;         //当sel = 0时执行y = a;
  1 : y = b;         //当sel = 1时执行y = b;
  2 : y = c;         //当sel = 2时执行y = c;
  3 : y = d;         //当sel = 3时执行y = d;
  default : $display("Error in SEL"); //当sel不为上面列出的任何一个值时执行这条语句
endcase 
    
endmodule

        default关键字的作用是保证那些没有被例举出来的情况也有对应的执行语句。如果不使用 default 关键字,就需要将所有情况都一一列出,非常麻烦,就像这样:

module mux_without_default (a,b,c,d,sel,y);
input a, b, c, d; 
input [1:0] sel; 
output y; 

reg y;

always @ (a or b or c or d or sel) 
case (sel) 
  0 : y = a; 
  1 : y = b; 
  2 : y = c; 
  3 : y = d; 
  2'bxx,2'bx0,2'bx1,2'b0x,2'b1x,
  2'bzz,2'bz0,2'bz1,2'b0z,2'b1z : $display("Error in SEL");
endcase 

endmodule

casex与casez语句

        由于在verilog语法中,合法的值有4种:0,1,x,z。所有除了case语句外,还有casex与casez语句,他们的用法是这样的:

  • casez : 将 z 看做不在乎(don't care),其他用法同case
  • casex : 将 x 和 z 看做不在乎(don't care),其他用法同case

        下面的代码将case、casex与casez语句的用法做了一个比较:

module case_compare;

reg sel;

initial begin
  #1 $display ("\n     Driving 0");
  sel = 0;
  #1 $display ("\n     Driving 1");
  sel = 1;
  #1 $display ("\n     Driving x");
  sel = 1'bx;
  #1 $display ("\n     Driving z");
  sel = 1'bz;
  #1 $finish;
end

always @ (sel)
case (sel)
  1'b0 : $display("Normal : Logic 0 on sel");
  1'b1 : $display("Normal : Logic 1 on sel");
  1'bx : $display("Normal : Logic x on sel");
  1'bz : $display("Normal : Logic z on sel");
endcase

always @ (sel)
casex (sel)
  1'b0 : $display("CASEX  : Logic 0 on sel");
  1'b1 : $display("CASEX  : Logic 1 on sel");
  1'bx : $display("CASEX  : Logic x on sel");
  1'bz : $display("CASEX  : Logic z on sel");
endcase

always @ (sel)
casez (sel)
  1'b0 : $display("CASEZ  : Logic 0 on sel");
  1'b1 : $display("CASEZ  : Logic 1 on sel");
  1'bx : $display("CASEZ  : Logic x on sel");
  1'bz : $display("CASEZ  : Logic z on sel");
endcase

endmodule

        其仿真结果是这样的:

  Driving 0
Normal : Logic 0 on sel
CASEX  : Logic 0 on sel
CASEZ  : Logic 0 on sel

  Driving 1
Normal : Logic 1 on sel
CASEX  : Logic 1 on sel
CASEZ  : Logic 1 on sel

  Driving x
Normal : Logic x on sel
CASEX  : Logic 0 on sel
CASEZ  : Logic x on sel

  Driving z
Normal : Logic z on sel
CASEX  : Logic 0 on sel
CASEZ  : Logic 0 on sel

        因为x在casex中视为不在乎,所以直接选择第一条语句有效,即打印  Logic 0 on sel ;同样的,因为z在casez和casex中均视为不在乎,所以都选择第一条语句有效,即打印  Logic 0 on sel。文章来源地址https://www.toymoban.com/news/detail-428244.html


  • 📣您有任何问题,都可以在评论区和我交流📃!
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

到了这里,关于ASIC-WORLD Verilog(8)if-else语句和case语句的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASIC-WORLD Verilog(3)第一个Verilog代码

            在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的Verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:Verilog Tutorial         这是系列导航:Verilo

    2023年04月16日
    浏览(38)
  • ASIC-WORLD Verilog(5)基础语法下篇

            在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:http://asic-world.com/verilog/veritut.html       

    2023年04月17日
    浏览(38)
  • ASIC-WORLD Verilog(4)基础语法上篇

            在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:http://asic-world.com/verilog/veritut.html         这

    2023年04月10日
    浏览(38)
  • ASIC-WORLD Verilog(11)过程时序控制

            在自己准备写一些简单的verilog教程之前,参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:Verilog Tutorial         这是系列导航:

    2024年02月14日
    浏览(36)
  • ASIC-WORLD Verilog(10)编写测试脚本Testbench的艺术

            在自己准备写一些简单的verilog教程之前,参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:Verilog Tutorial         这是系列导航:

    2024年02月07日
    浏览(36)
  • 条件运算符? : 与if-else语句的对比及用法详解

    条件运算符? : :给程序员提供了一种简便的方式进行条件判断和表达式的求值。在C语言中,条件运算符? : 是一个三元运算符,可以根据条件的真假来判断输出结果。本篇文章将详细介绍条件运算符的用法,以及与if-else语句的对比,并结合实例来进一步理解。 条件运算符?

    2024年02月05日
    浏览(49)
  • Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

     前言:在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿,这边我就举一个我在实际开发中的例子,来进行阐述这两种模式在实际开发中我是如何运用的。 目录 一、工厂模式简介 二、简单工厂模式 2.1、UML类图

    2024年02月15日
    浏览(33)
  • Verilog Tutorial(7)If语句和Case语句

    在自己准备写verilog教程之前,参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错,只是没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。 这是网站原文:https://fpgatutorial.com/verilog/ 这是系列导航:Verilog教程系列文章导航 这篇文

    2023年04月10日
    浏览(40)
  • Python if-else 速记

    编程中经常使用速记符号来简化我们的工作。 速记符号是一种可以更简洁、更省时省力地完成工作的方法。 本文将讨论 Python 中使用的速记符号作为 if-else 语句的快捷方式。 如前所述,速记符号是一种可以简洁地编写程序的方法。 到目前为止,我们在 Python 中使用了许多速

    2024年02月11日
    浏览(43)
  • 策略模式解决if-else问题

    释义: 策略模式是一种行为设计模式,它允许在运行时根据不同的情况来选择不同的策略。 这种模式支持开闭原则,在不修改现有代码的前提下,动态的添加、删除、替换算法。 组成部分: 策略接口(Strategy) :它是一个接口,具体的策略实现类去实现这个接口,就可以提供

    2024年02月03日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包