首页 > 其他分享 >最详细的Verilog阻塞,非阻塞赋值语句介绍--数码管控制段选信号代码

最详细的Verilog阻塞,非阻塞赋值语句介绍--数码管控制段选信号代码

时间:2024-07-22 16:53:46浏览次数:8  
标签:语句 begin -- always 阻塞 数码管 rst 赋值

目录


前言

本文笔者将为大家详细的介绍Verilog的三种语句介绍,包括结构语句,赋值语句和条件语句


一、结构语句

1、initial语句

initial语句只执行一次.
常用于测试文件(testbench)的编写,用来产生仿真测试信号的语句(激励信号),或者用于对存储器变量赋初值.

initial 
begin 
	sys_clk 		<= 1'b0;
	sys_rst_n		<= 1'b0;
	touch_key		<= 1'b0;
	#20 sys_rst_n	<= 1'b1;
	#10 touch_key	<= 1'b1;
	#30 touch_key	<= 1'b0;
	#110 touch_key	<= 1'b1; 
	#30 touch_key	<= 1'b0;
end

2、always 语句

1.一直在不断的重复使用,但只有和一定的时间控制结合在一起才有作用

2.always的时间控制可以是边沿触发,也可以是电平触发;

3.可以是单个信号,也可以是多个信号,多个信号中间要用关键字or连接

4.always语句后紧跟的过程块是否运行,要看他的触发条件是否满足

举例

//计数器对系统时钟计数,计时0.2s
always @(posedge sys_clk or negedge sys_rst_n)//关键字 posedeg上升沿 ,negedge下降沿
	begin
		if(!sys_rst_n)
			counter <= 24'd0;
		else if(counter < 24'd1000_0000)
			counter <= counter + 1'b1;
		else 
			counter <= 24'd0;
	end

5.边沿触发的always块常常描述时序逻辑行为.

6.由关键词or连接的多个事件名或信号名组成的列表为"敏感列表"

7.always和initial语句下的begin–end语句是按顺序执行的,称为过程块

8.电平触发的always块用于描述组合逻辑行为

always @(*)
	begin
		out1 = a? (b+c) : (d+e);
		out2 = f? (g+h) : (p+m);
	end

@(*)表示对后面语句块中所有输入变量的变化都是敏感的

二、赋值语句

1.阻塞赋值

(blocking) b=a;
稍微阻塞的概念是,在同一个always块中,后面的赋值语句是在前一句赋值语句结束后才开始赋值的
阻塞赋值可以认为只有一个步骤的操作:两个同时计算
即计算RHS并更新LHS

举例

always @(posedge clk or negedge rst_n)
	begin 
		if(!rst_n)
			begin
				a = 1;
				b = 2;
				c = 3;
			end
		else
			begin
				a = 0;
				b = a;
				c = b;
			end
	end

在这里插入图片描述

2.非阻塞赋值

(Non_blocking) b<=a;
稍微非阻塞赋值的概念是,在计算非阻塞赋值的RHS以及更新LHS期间,允许其他的非阻塞赋值语句同时计算RHS和更新LHS
非阻塞赋值的操作过程可以看作两个步骤,分步进行计算
1:赋值开始的时候,计算RHS;
2:赋值结束的时候,更新LHS;

举例

always @(posedge clk or negedge rst_n)
	begin 
		if(!rst_n)
			begin
				a <= 1;
				b <= 2;
				c <= 3;
			end
		else
			begin
				a <= 0;
				b <= a;
				c <= b;
			end
	end

在这里插入图片描述

需要注意的是:
非阻塞赋值只能用于对寄存器类型的变量进行赋值,因此只能用在initial和always块等过程块中

3.总结

读者可能会觉得难以理解,为此,笔者做了一下总结

在描述组合逻辑时–always块用阻塞赋值 “=”
在描述时序逻辑时–always块用非阻塞赋值"<="

注意:
1.在同一个always块不要既用非阻塞赋值,又用阻塞赋值;

2.不允许在多个always块中对用一个变量进行赋值

三、条件语句

1 if_else语句

和c语言类似

if(表达式1)
	语句1;
else if(表达式2)
	语句2;
else if(表达式3)
	语句3;
else 
	语句4;

条件语句必须在过程块中使用,即在always和initial语句中使用;
注意事项
1.允许缩写
if(a) 等同于 if(a == 1)

2.if 语句对表达式的值进行判断时:
若为 0 x z 则为假

若为 1 则为真

3.if和else后面的操作语句可以用begin–end包含多个语句

4.if语句可以嵌套

2.case 语句

多分支选择语句
注意
1.分支表达式的值互不相同;
2.所有表达式的位宽必须相等;
不能用’bx来代替n’bx
3.casez
比较时,不考虑表达式中的高阻值
4.casex
不考虑高阻值z和不定值x

//根据数码管显示的数值,控制段选信号
always @(posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			seg_led <= 8'b0;
		else 
			begin
				case(num)
					4'h0  :	seg_led <= 8'b1100_0000;
					4'h1  :	seg_led <= 8'b1111_1001;
					4'h2  :	seg_led <= 8'b1010_0100;
					//.....笔者省略了一部分代码,如有需要,可在评论区问我
					default : seg_led <= 8'b1100_0000;
				endcase
			end
	end
reg [7:0] sel;//1100_0011
casez(sel)
	8'b1100_zzzz;语句1; //执行语句1
	8'b1100_xxzz;语句2; //不执行语句2,若将casez改为casex,则需要执行语句2

标签:语句,begin,--,always,阻塞,数码管,rst,赋值
From: https://blog.csdn.net/2301_76707170/article/details/140610408

相关文章

  • VA02/VA03增加alv
    项目背景:搞备库单(新建一种类型的销售订单),备库单不出货(通过排程明细类别控制,也需要新增),正式销售订单创建时,备库单分配数量给正式SO,SO的排程明细类别也是新增的(不跑MRP),创建后,如果备库单已有库存,则从备库单直接自动调拨库存到正式SO上,还有其它的一些增强还有控制,这里不说了。......
  • oss
                                                  ......
  • Folding Strip
    第一次在考场中做出来的E题,rank也是来到了20,纪念一下,一定要相信自己呀构造方法见官方题解,证明见下:对于原始串\(s\),如果第一个(从左往右数)相同交界不折,选择折后面的交界,那么根据决策包容性,我们可以折一下第一个相同交界,答案不会更差,如下如果不折第一个交界:对于最终方案我们折一......
  • 【CentOS】CentOS7上安装使用ffmpeg
    安装CentOS7核心存储库中不提供FFmpeg:方案一、源码编译安装FFmpeg,方案二、使用NuxDextop存储库中的yum安装它。本文采用方案二 步骤一:启用EPEL仓库Nux存储库依赖于Epel软件存储库sudoyuminstallepel-release 步骤二:启用NuxDextop仓库sudorpm--importht......
  • 后端API接口定义返回编码规则
    code状态码code返回状态码,一般小伙伴们是在开发的时候需要什么,就添加什么。如接口要返回用户权限异常,我们加一个状态码为101吧,下一次又要加一个数据参数异常,就加一个102的状态码。这样虽然能够照常满足业务,但状态码太凌乱了。我们应该可以参考HTTP请求返回的状态码(下面是常见的......
  • JAVA值传递和引用传递
    值传递在调用方法时,将实参传递给了形参,但方法中无法通过改变形参直接改变实参。//值传递publicclassDemo{publicstaticvoidmain(String[]args){inta=1;System.out.println(a);//1Demo04.change(a);System.out.println(a);......
  • 数业智能心大陆用AI解锁心灵健康
    随着日常生活的不确定性增加,人们的情绪和心理状态受到了考验。从工作变动到经济压力,从家庭关系到个人健康,这些日常挑战不断考验着我们的心理承受力。特别是在当前的数字时代,社交媒体的普及和信息过载也加剧了人们的焦虑感。数业智能心大陆的数据显示,寻求心理支持和咨询的人数在显......
  • 深信服务超融合管理Api调用
    usingJint;usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.IO;usingSystem......
  • 栅格地图
    在ROS中,地图是非常基本的元素,特别对于2D激光SLAM而言,栅格地图可以说是必不可少的元素。机器人在需要前往目标点时,需要在栅格地图中找到一条合适的路径从当前点到达目标点,这部分内容在move_base中有了详细的接口,可以直接调用并返回路径。但是作为一名工程师,不仅要知其然更要知其所......
  • iOS开发-多线程编程
    OC中常用的多线程编程技术:1.NSThreadNSThread是Objective-C中最基本的线程抽象,它允许程序员直接管理线程的生命周期。NSThread*myThread=[[NSThreadalloc]initWithTarget:selfselector:@selector(myThreadMainMethod:)object:nil];[myThreadstart];使用NSThread时,......