ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Verilog学习之路(4)— Verilog HDL的程序设计语句

2021-12-18 15:30:00  阅读:275  来源: 互联网

标签:语句 clk always initial Verilog HDL out 赋值


Verilog HDL的程序设计语句

一、连续赋值语句

连续赋值语句通常用来描述组合逻辑电路,连续赋值的目标类型主要是标量线网和向量线网两种,标量线网如“wire a,b;”,向量线网如“wire [3:0] a,b”。连续赋值语句还可分为显示赋值语句和隐式连续赋值语句。
如下所示为显示连续赋值语句:

	wire a,b,c;
	assign c = a & b;

如下所示为隐式连续赋值语句:

	wire a,b;
	wire c = a & b;

如上所示,我们可以看到,显示连续赋值语句需要先类型声明(如wire),然后使用assign关键字进行描述,而隐式赋值语句则是在声明的时候即进行赋值描述。需要知道的是,连续赋值语句只能用来对连线型变量进行驱动,而不能对寄存器型变量进行赋值。

二、过程语句

1、initial过程语句

initial过程块在进行仿真时从仿真0时刻开始执行,整个initial过程块在执行完一次后就被挂起不再执行,如果模块中存在多个initial过程块,则每个initial过程块都是同时从0时刻开始并行执行的。initial过程语句通常用于仿真模块中对激励向量的描述,或用于给寄存器变量赋初值。
initial语句块不可被综合为实际电路。
如下所示为一个initial语句块对a,b,c赋值

module initial_tb1;
	reg a,b,c;
	
	initial begin
		a = 0; b = 1; c = 0;
		#100 a = 1; b = 0;
		#100 a = 0; c = 1;
		#100 b = 1; c = 0;
		#200;
	end
	
endmodule

使用仿真工具查看波形可得如下所示
在这里插入图片描述

2、always语句

always语句块的触发由其后面的敏感事件列表决定,只要满足其敏感事件就执行该always过程块。always过程块的语法格式为

always@(<敏感事件列表>)
	语句块;

敏感事件列表可以如下所示

	@(a)									// 当信号a的值发生改变时
	@(a or b)								// 当信号a或信号b的值发生改变时
	@(posedge clock)						// 当clock的上升沿到来时
	@(negedge clock)						// 当clock的下降沿到来时
	@(posedge clk or negedge reset)			// 当clk的上升沿到来或reset的下降沿到来时

always过程语句既可以描述时许逻辑电路,也可以描述组合逻辑电路,当我们使用不同的敏感事件列表时,会产生不同的电路形式,其设计要求如下:

  1. 描述组合逻辑电路时,需要把全部的输入信号列入敏感事件列表;
  2. 描述时许逻辑电路时,需要把时钟信号和部分输入信号列入敏感事件列表。

如下为一个典型的组合逻辑电路,4选1多路数据选择器,

module mux4_1(out, in0, in1, in2, in3, sel);
	output out;
	input in0,in1,in2,in3;
	input [1:0] sel;
	reg out;				// 过程块中被赋值信号需要定义为reg类型
	always@(in0 or in1 or in2 or in3 or sel) begin
		case(sel)
			2'b00:	out = in0;
			2'b01:	out = in1;
			2'b10:  out = in2;
			2'b11:	out = in3;
			default:out = 1'bx;
		endcase
	end
endmodule

经过综合后得到的电路图如下所示
在这里插入图片描述
如下是一个8位同步置数、同步清零计数器的代码,是一个典型的时序逻辑电路,

module counter(out, data, load, rst, clk);
	output out;
	input [7:0] data;
	input load, clk, rst;
	reg [7:0] out;				// 过程块中被赋值信号需要定义为reg类型
	always@(posedge clk) begin
		if(!rst)
			out = 8'h00;
		else if(load)
			out = data;
		else
			out = out + 1;
	end
endmodule

经过综合后得到的电路图如下所示
在这里插入图片描述

我们在敏感信号列表中加入rst信号后就可以变成异步复位的计数器,

module counter(out, data, load, rst, clk);
	output out;
	input [7:0] data;
	input load, clk, rst;
	reg [7:0] out;				// 过程块中被赋值信号需要定义为reg类型
	always@(posedge clk or negedge rst) begin
		if(!rst)
			out = 8'h00;
		else if(load)
			out = data;
		else
			out = out + 1;
	end
endmodule

经过综合后得到的电路图如下所示
在这里插入图片描述

标签:语句,clk,always,initial,Verilog,HDL,out,赋值
来源: https://blog.csdn.net/qq_38113006/article/details/122011413

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有