草庐IT

Verilog基本语法之循环语句(六)

芯芯向荣 2024-05-02 原文

循环语句分为以下4种:

for语句——通过三个步骤来决定语句的循环执行:

1.给控制循环次数的变量赋初值;

2.判定循环执行条件,若为假则跳出循环;若为真,则执行指定语句后,转到第三步

3.修改循环变量的值,返回第二步

repeat——连续执行一条语句n次;

while——执行一条语句,直到循环条件不满足;若一开始条件不满足,则该语句一次也不能执行

forever——无限连续的执行语句,可用disable语句中断。

for语句

形式:

for(循环变量赋初值;循环执行条件;循环变量增值) 执行语句

例:用for语句描述7人投票表决器:超过4人投赞成票,则表决通过

module vote7(
		output      pass,
		input [6:0] vote
		);
		
		reg [2:0] sum;  //sum 为reg变量,用于统计赞成的人数
		integer    i;
		reg       pass;
		
		always @(vote)
		  begin
		    sum = 0;   //sum初始值为0
			for(i=0;i<=6;i++)    //for语句
			  if(vote[i])   sum=sum+1;  //只要有人投赞成票,sum加1
			  
			  if(sum[2])   pass =1;    //若超过4人,pass为1
			  else         pass =0;
		  end
endmodule 

例:用for语句初始化memory

begin:init_mem
	  reg [7:0] tempi;  //存储器的地址变量
	  for(tempi=0;tempi<memsize;tempi=tempi+1)
        memory[tempi]=0;
      end	

例:用for语句实现两个二进制数乘法

module mult_for (outcome,a,b);
	parameter size =8;
	output [2*size:1]  outcome;
	input  [size;1]    a,b;
	reg    [2*size:1]  outcome;
	integer            i;
	
	always@(a or b)
	  begin
	    outcome = 0;
		for(i=1;i<=size;i=i+1)
		  if(b[i]) outcome = outcome +(a<<(i-1));
	  end
endmodule

repeat语句(不可综合)

无条件连续执行一条或多条语句n次

格式:

repeat(循环次数表达式)语句

例:用repeat语句和移位操作实现两个8位二进制数乘法

module mult_repeat(outcome,a,b);
	parameter size=8;
	output[2*size:1]  outcome;
	input [size:1]    a,b;     //a 为被乘数,b为乘数
	reg   [2*size:1]  outcome;
	reg   [2*size:1]  temp_a;  //中间变量,存放操作数a左移移位的结果
	reg   [2*size:1]  temp_b;  //中间变量,存放操作数b右移移位的结果
	
	always@(a or b)
	   begin
	    outcome = 0;
		temp_a = a;
		temp_b = b;
		repeat(size)
		  begin
		    if(temp_b[1])   //如果tem_b的最低位是1,则执行下面加法
			  outcome = outcome + temp_a;
			  temp_a = temp_a <<1;  //操作数a左移一位,以便代入上式,求部分积
			  temp_b = temp_b >>1;  //操作数b右移一位,以便取temp_b【1】
		  end
	   end
endmodule 

while 语句

有条件的执行一条或多条语句

首先判断循环执行条件表达式是否为真。若为真,则执行后面的语句或语句块;然后再回头判断循环执行条件表达式是否为真,若为真,再执行一次后边的语句;如此不断,直到条件表达式不为真.

格式:while(循环执行条件表达式) 语句

注1:首先判断循环执行条件表达式是否为真,若为假,则其后的语句一次也不执行

注2:在执行语句中,必须有一条改变循环执行条件表达式的值的语句

注3:while语句只有当循环块有事件控制(即@(posedge clk))时才可综合

例:用while语句对一个8位二进制中值为1的位进行计数

module count1s_while(count,rega,clk);
	output [3:0]  count;
	input  [7:0]  rega;
	input         clk;
	reg    [3:0]  count;
	always@(posedge clk)
	  begin:count1
	    reg[7:0] tempreg;  //用作循环执行条件表达式
		count =0;          //count初始值为0
		tempreg = rega;    //tempreg初值为rega 
		while(tempreg)     //若tempreg非0,则执行下边语句
		    begin
			  if(tempreg[0])  count = count + 1;
			               //只要tempreg最低位为1,则count加1
			  tempreg = tempreg >>1;  //右移1位
			end
	  end
endmodule

例:用for语句对一个8位二进制中值为1的位进行计数

module count1s_for_good(count,rega);
	output [3:0]   count;
	input  [7:0]   rega;
	reg    [3:0]   count;
	always@(rega)
	begin:block
	   integer i;
	   count = 0;
	   for(i=0;i<=7;i++)
	     if(rega[i])   count = count +1;
	end
endmodule

forever语句

无条件连续执行forever后面的语句或语句块。

格式:forever 语句;

常用在测试模块中产生周期性的波形,作为仿真激励信号。

常用disable语句跳出循环。

注:不同于always语句,不能独立写在程序中,一般用在initial语句块中

语句的顺序执行

在always模块内,逻辑按书写的顺序执行。

顺序语句——always模块内的语句

在always模块内,若随意颠倒赋值语句的书写顺序,可能导致不同的结果

module serial2(q,a,clk);
	output q,a;
	input  clk;
	reg    q,a;
	always @(posedge clk)
	  begin
	    a = ~q;
	    q = ~q;	
	  end
endmodule

 always模块,assign语句,实例元件都是同时执行的,它们在程序中的先后顺序对结果并没有影响。

module parall1(q,a,clk);
	output q,a;
	input  clk;
	reg    q,a;
	always @(posedge clk)
	  begin
	    q = ~q;
	  end
	always @(posedge clk)
	  begin
		a = ~q;
	  end
endmodule
module parall2(q,a,clk);
	output q,a;
	input  clk;
	reg    q,a;
	always @(posedge clk)
	  begin
	    a = ~q;	  
	  end
	always @(posedge clk)
	  begin
		q = ~q;
	  end
endmodule

 

有关Verilog基本语法之循环语句(六)的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby - 覆盖相似的方法,更短的语法 - 2

    在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a

  6. ruby 语法糖 : dealing with nils - 2

    可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

  7. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

  8. ruby - Ruby 语法糖有 "rules"吗? - 2

    我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d

  9. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  10. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

随机推荐