Verilog简述


不肖学生在校期间惹得老师生气,逐出实验室,心中一直由愧疚,但总是害怕无法当面去说,去找常老师道歉或者说明原由,一直时心里的难以迈过去的一道坎,很感谢常老师带我入门,教我知识和做人的道理。
不肖学生时至今日依然受惠于老师很多年前的著作《Verilog HDL工程实践入门》

0 基本概念

module 模块名(端口参数);module G(A,B,F)
端口定义 input A,B;
output F;
寄存器定义 reg C;
线网定义 wire D;
内置门原语 and G1(F,A,B)
或assign语句 assign F=A&B
endmodule

0.1 描述方式(写代码方式 思维方式)

  1. 门级描述方式;
    内置门实例语句8种:and,nand,or,not,nor,xnor,buf;
    输出在前,输入在后; and U1(F,A,B);
  2. 数据流描述
    最基本方法:连续使用Assign赋值语句。
    使用位运算符 : 对应上面功能的部分运算符;

两个基本概念:功能模块和testbench

  • 功能模块:就是自己所专注写的逻辑代码; 也成为底层模块。
  • testbench:也成为测试程序,测试文件,顶层模块,就是要产生模拟的激励数据序列,并将其加于功能模块,然后把功能模块的输出信息由显示模块显示出来。 在这后面都成为顶层模块。
    【例子】
`timescale 1ns/1ns   设置仿真的时延单位和时延精度
module AND_G2_TEST;
	reg A,B;
	wire F;
	AND_G2 AND_G2 (A,B,F);
	initial begin 
		A=0;B=0;
		#100 A=1;
		#100 A=0;B=1;
		#100 A=1;
		#200 $finish;  	//仿真结束
	end
endmodule

  1. 行为级描述
    相当于软件设计过程中的流程图描述和算法描述,专注于表达工作的抽象和软件的行为表现,不是具体的实现手段和方法。
    行为级描述语法支持:

  2. case语句使用
    case (表达式)
    <case 分支项>
    endcase
    分支项表达式 语句
    默认项(default) 语句

  3. if_else语句的使用方法

  4. function函数的使用方法
    function函数的目的就是返回一个用于表达式的值。函数的定义格式如下:
    function <返回值位宽或类型说明> 函数名;
    端口定义;
    局部变量定义;
    其他语句;
    endfunction

  5. 用于方针的顶层模块

0.2 寄存器和线网定义

简单来说:
寄存器:用于输入;使用在always模块中,时寄存器可存储数据;
线网:用于输出,常用在assign语句中;

1 软件使用和仿真

这个再专门做一个专题;

2 组合逻辑电路

用到基础知识:数字逻辑电路
用Verilog代码实现功能基本就是 组合逻辑电路和时序逻辑电路的功能。
组合逻辑电路定义:该逻辑电路在任意时刻产生的输出只取决于该时刻的输入,而与电路过去的输入无关;

2.1 基本电路功能

  1. 数据选择器MUX
    2-1,4-1 数据选择器
    这个网上直接有代码;直接拿过来用;

**使用条件操作符 布尔表达式? 表达式 1 ,表达式 2 ;

用于仿真的顶层模块

`timescale 1ns/1ns
module SELE_TSET;	//测试模块
	reg [3:0] IN;
	reg [1:0] SEL_IN;
	wire F;
	SEL SEL(IN[0],IN[1],IN[2],IN[3],SEL_IN,F);	//底层模块名,实例名及参数定义

	always #150 SEL_IN=SEL+1;
	always #50 IN=IN+1;

	initial begin
	IN=0;SEL_IN=0;		//参数初始化
	#1200 $finish;
	end
endmoudule

  1. 数据比较器
    使用行为级描述方式;
module COMP(A,B,LG,EQ,SM);
	input [1:0] A,B;
	output LG,EQ,SM;

	assign {LG,EQ,SM}=FUNC_COMP(A,B);	//assign语句,实现function函数调用
		
	function [2:0] FUNC_COMP  //function函数及函数名,至enddunction函数为止
		input [1:0] A,B;
		
		if(A>B)
			FUNC_COMP=3'b100;
		else if(A<B)
			FUNC_COMP=3'b001;
			else
				FUNC_COMP=3'b010;
	endfunction
endmodule
			

位拼接运算符{} 和数值常量
数值常量:d为十进制 ; h为十六进制; o为八进制;b为二进制;
【顶层模块书写】

`timescale 1ns/1ns
module COMP_TEST;
	reg [1:0] A,B;
	wire LG,EQ,SM;

	COMP COMP(A,B,LG,EQ,SM); //底层模块名,实例名及参数定义
always 
  1. 编码器
    【行为级描述】
module ENC (IN,Y);  	//模块名,端口及参数定义
	input [3:0] IN;
	output [1:0] Y;
	
	assign Y=FUNC_ENC(IN);
	
	function [1:0] FUNC_ENC;
	input [3:0] SW_IN;
	
	case(IN)
		SW_IN0:FUNC_ENC=0;
		SW_IN1:FUNC_ENC=1;
		SW_IN: FUNC_ENC=2;
		SW_IN: FUNC_ENC=3;
	endcase
	endfunction
endmodule

【测试模块】

`timescale 1ns/1ns
module ENC_TEST;
	reg [3:0] IN;
	wire [1:0] Y;
	
	integer i,j;

	ENC ENC (IN,Y);
  	
	initial begin
		j={2'b10,2'b00,1'b1};
		for(i=0;i<=3;i=i+1)
			begin
				i=j>>1;
				IN=j[3:0];
				#200
			end
		$finish
	end 
endmodule

4.译码器
BCD译码器描述

3 触发器

时序逻辑电路的基本单元电路是触发器;
时序逻辑电路:在任意时刻,电路产生的稳定输出不仅与当前时刻的输入有关,而且还与电路过去的输入有关。

3.1 异步RS触发器

【行为级描述】

module RS_FF(R,S,Q,QB);
	input R,S;
	output Q,QB;
	
	reg Q,QB;
	always@(R OR S)
		case({R,S})
			0:begin  Q<=Q;QB<=QB;end
			1:begin  Q<=1;QB<=0; end;
			2:begin  Q<=0;QB<=1;end
			3:begin  Q<=1'bx;QB<=1'bx;end
		endcase
endmodule

always块语句使用:块内的语句是不断重复执行的,括号内为敏感表达式

3.1 同步RS触发器

加上一个CLK时钟信号;
【功能描述模块】

module SY_RS_FF(R,S,CLK,Q,QB);
	input R,S,CLK;
	output Q,QB;
	reg Q;

	assign QB=~Q;
	
	always@(posedge CLK)
		case ({R,S})
			0:Q<=0;
			1:Q<=1;
			2:Q<=0;
			3:Q<=1'bx;
		endcase
endmodule

【顶层模块】

`timescale 1ns/1ns
module SY_RS_FF_TEST
	reg R,S,CLK;
	wire Q,QB;
	
	parameter STMP=40;  
	SY_RS_FF SY_RS_FF (R,S,CLK,Q,QB);
	
	always #(STEP/2)  CLK=~CLK;
	initial begin
		CLK=1;R=0;S=0;
		#(STMP-10) R=1;
		#(STMP) R=0;
		#(2*STMP-30) S=1;
		#(STMP-20) R=1;
		#(2*STEMP-10) $finish;
	end
endmodule

3.3 异步T触发器

Q在T上升沿变化时有效,输出端翻转;

3.3.1 同步T触发器

3.4 同步D触发器

3.4.1 带有异步D触发器

4 时序逻辑带你路

着重看由触发器组成的几种时序逻辑电路。

4.1 寄存器

4.2 移位寄存器

4.3 计数器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值