08 verilog基础语法-循环语句

虚拟机:VMware-workstation-full-14.0.0.24051
环 境:ubuntu 18.04.1
应用工具:VCS(verilog compiled simulator,编译型代码仿真器)



一、学习内容

  这小结学习循环语句和语句的顺序与并行执行
在这里插入图片描述


二、循环语句

  循环语句分为4种:

  • for语句——通过3个步骤来决定语句的循环执行:
    (1)给控制循环次数的变量赋初值。
    (2)判定循环执行条件,若为假则跳出循环;若为真,则执行指定的语句后,转到第(3)步。
    (3)修改循环变量的值,返回第(2)步。
  • repeat语句——连续执行一条语句n次
  • while语句——执行一条语句,直到循环执行条件不满足;若一开始条件即不满足,则该语句一次也不能被执行!
  • forever语句——无限连续地执行语句,可用disable语句中断!

(1)for语句

在这里插入图片描述
**【例 1】**用for语句描述的7人投票表决器:若超过4人(含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 = i+1) begin//for语句
		if(vote[i]) sum = sum+1; //只要有人投赞成票,则 sum加1
	end
	if(sum[2]) pass = 1; //若超过4人赞成,则表决通过
	else pass = 0;
end
endmodule

仿真结果:超过四人时,pass输出1
在这里插入图片描述

(2)repeat语句

在这里插入图片描述
**【例 2】**用repeat语句和移位操作实现两个8位二进制数乘法
在这里插入图片描述仿真结果:(用for实现会更简单)
在这里插入图片描述
  

(3)while语句

在这里插入图片描述

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

注1 :首先判断循环执行条件表达式是否为真,若不为真,则其后的语句一 次也不被执行!
注2 :在执行语句中,必须有一条改变循环执行条件表达式的值的语句。
注3 :whille语句只有当循环块有事件控制(即@(posedge clk))时才可综合。


**【例 3】**用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) begin// 若tempreg非0,则执行以下语句
			if(tempreg[0]) count = count+1;
			//只要tempreg最低位为1,则 count加1
			tempreg = tempreg >>1; //右移1end
end
endmodule

【例 4】用for语句对一个8位二进制数中值为1的位进行计数
在这里插入图片描述结果:都一样
在这里插入图片描述

(4)forever语句

在这里插入图片描述
  forever一般是不可综合的,所以用在搭建测试平台testbeech中比较多。

//常用在测试模块中产生周期性的波形,作为仿真激励信号。
//常用disable语句跳出循环
initial
	begin : Clocking
		clk = 0;
		#10 forever #10 clk = !clk;
end
initial
	begin : Stimulus
	……
	disable Clocking; // 停止时钟
end

三、语句的顺序与并执行

  在 “always”模块内,逻辑按书写的顺序执行。 顺序语句——“always”模块内的语句。在 “always”模块内,若随意颠倒赋值语句的书写顺序,可能导致不同的结果 。 注意阻塞赋值语句当本语句结束时即完成赋值操作!下面有两个例子:

//[] 顺序执行模块1module serial1(q,a,clk);
	output q,a;
	input clk;
	reg q,a;
always @(posedge clk) begin
	q=~q; //阻塞赋值
	a=~q;
end
endmodule

在这里插入图片描述
  结果:a和q的波形反相。

[]顺序执行模块2module serial2(q,a,clk);
	output q,a;
	input clk;
	reg q,a;
always @(posedge clk) begin
	a=~q;
	q=~q;
end
endmodule

在这里插入图片描述
  结果:a和q的波形一样。


四、思考和小结

(1)思考

  1. 使用条件语句设计四选一的多路选择器。
  2. 用for语句描述11人投票表决器:若超过6人(含6人)投赞成票,则表示表决通过。
//使用条件语句设计四选一的多路选择器
module select(
	input a,
	input b,
	input c,
	input d,
	input [1:0] sel,
	output reg out
);
//always @(a or b or c or d or sel)
always @(*)begin
	case(sel)
		2'b00: out <= a;
		2'b01: out <= b;
		2'b10: out <= c;
		2'b11: out <= d;
		default: out <= 1'bx;
	endcase
end
endmodule
//for语句描述11人投票表决器:若超过6人(含6人)投赞成票,则表示表决通过
module vote11 (
	output pass,
	input [10:0] vote
);
	reg[3:0] sum; //sum为reg型变量,用于统计赞成的人数
	integer i;
	reg pass;
	
always @(vote) begin
	sum = 0; //sum初值为0
	for(i = 0;i<=10;i = i+1) //for语句
		if(vote[i]) sum = sum+1; //只要有人投赞成票,则 sum加1
			
	if(sum[3] | (sum[2] &sum[1]) ) pass = 1; //若超过6人赞成,则表决通过
	else pass = 0;
end
endmodule

(2)小结

在这里插入图片描述


作者:xlinxdu
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: FPGA是一种可编程逻辑器件,可以通过编程实现各种功能。而Verilog是一种硬件描述语言,用于描述FPGA中的电路。Verilog基础语法包括模块定义、端口定义、信号定义、赋值语句、条件语句、循环语句等。模块定义是Verilog中最基本的语法,用于定义一个电路模块。端口定义用于定义模块的输入输出端口。信号定义用于定义模块内部的信号。赋值语句用于给信号赋值。条件语句用于根据条件执行不同的代码。循环语句用于重复执行一段代码。掌握Verilog基础语法是学习FPGA编程的基础。 ### 回答2: FPGA是一种可编程逻辑器件,它可以通过硬件描述语言来编写自定义的逻辑电路来实现各种功能。其中,Verilog是一种常用的硬件描述语言,有助于实现FPGA的功能。 Verilog语言主要由模块、端口、信号、语句和运算符五个基本部分组成。模块是Verilog中的最基本的语法单元,类似于传统程序语言中的函数,模块之间可以通过实例化进行连接。端口则是与外部世界进行通信的接口,可以分为输入端口(input)和输出端口(output)两种类型。信号是Verilog中表示数字信号的基本单元,可以是位向量、整数或实数。语句则是Verilog中描述操作和行为的语言,常用的语句包括赋值语句、分支语句和循环语句。运算符则是Verilog中用于进行操作的符号,包括算数运算符、逻辑运算符和位运算符。 在Verilog语言中,还有一些常用的结构体和命令可以帮助我们更方便地实现FPGA的功能。其中,常用的结构体包括always语句、case语句和module归档,常用的命令包括initial语句、wire语句和reg语句。always语句可以在指定的触发条件下执行某一段代码,case语句可以根据不同的条件执行不同的代码段,module归档则可以将多个模块合并为一个模块。initial语句可用于在仿真开始前初始化某些信号,wire语句则用于声明并连接信号,reg语句则用于声明并存储信号。 总体而言,了解FPGA和Verilog基础语法可以帮助我们更好地理解FPGA技术的应用和实现。然而,理论知识只有结合实际操作和实验才能更好地掌握。所以,我们还需要结合实际项目来进行练习和实践,从而更好地掌握FPGA和Verilog基础语法。 ### 回答3: FPGA(可编程门阵列)是一种可编程逻辑器件,可以用来创建定制的数字电路。Verilog是一种硬件描述语言,用于描述数字电路的结构和行为。 Verilog基础语法有以下几个部分: 1.模块定义:Verilog代码以模块的形式进行组织,每个模块都有一个名称和端口列表。模块定义以module关键字开始,以endmodule关键字结束。 2.端口声明:模块的端口是输入和输出连接到其他模块或FPGA芯片的引脚。端口可以是输入(input)、输出(output)或双向(inout)。端口声明在模块定义中。 3.信号声明:信号是描述数字电路中状态的变量。可以是单个位(wire)或多位(reg),在模块中声明。 4.赋值语句:用来为信号赋值,包括非阻塞赋值(<=)、阻塞赋值(=)和连续赋值(assign)。 5.条件分支语句:if, else if和else语句是用来控制程序流程,实现条件判断。 6.循环语句Verilog支持for、while、do while和forever等类型的循环语句,可以在程序中实现迭代操作。 7.模块实例化:用来将其他模块作为子模块嵌入到当前模块中,从而实现复杂的数字电路。 除上述基本语法外,Verilog还有其他常用语法,如always块、initial块和function定义等。需要深入了解和使用Verilog,可以参考相关资料和教程。掌握了Verilog语法,可以使用FPGA搭建各种个性化的数字电路,用于嵌入式系统、数字信号处理、计算机网络等各种应用领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xlinxdu

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值