5veriloghdl行为语句
- 格式:ppt
- 大小:4.78 MB
- 文档页数:7
1.简单门电路的设计二输入与非门module nand_2(y,a,b);output y;input a,b;nand(y,a,b);endmodule二输入异或门module nand_2(y,a,b);output y;input a,b;reg y;always @(a,b)begincase({a,b})2’b00:y=1;2’b01:y=1;2’b10:y=1;2’b11:y=0;default:y=’bx;endcaseendendmodule二输入三态门module eda_santai(dout,din,en); output dout;input din,en;reg dout;alwaysif (en) dout<=din;else dout<=’bz;endmodule3-8译码器的设计module yimaqi(S1,S2,S3,A,Y); input S1;wire S1;input S2;wire S2;input S3;wire S3;input [2:0]A;wire [2:0]A;output[7:0]Y;reg [7:0]Y;reg s;always@(S,S1,S2,S3)begins<=S2|S3;Y <=8'b1111_1111;else if(S)Y <=8'b1111_1111;elsecase(A)3'b000:Y<=11111110;3'b001:Y<=11111101;3'b010:Y<=11111011;3'b011:Y<=11110111;3'b100:Y<=11101111;3'b101:Y<=11011111;3'b110:Y<=10111111;3'b111:Y<=01111111;endcaseendendmodule2.8-3编码器的设计module banjiaqi(a,b,count,sum);input a;wire a;input b;wire b;output count;wire count;output sum;wire sum;assign {count,sum}=a+b;endmodule4. D触发器的设计module Dchufaqi ( Q ,CLK ,RESET ,SET ,D ,Qn ); input CLK ;wire CLK ;input RESET ;wire RESET ;input SET ;wire SET ;input D ;wire D ;output Q ;reg Q ;output Qn ;wire Qn ;assign Qn = ~Q ;always @ ( posedge CLK or negedge SET or negedge RESET ) beginif ( !RESET)Q <= 0 ;else if ( ! SET)Q <= 1;else Q <= D;endendmodule5. 1位半加法器的设计module banjiafaqi(a,b,sum,count);input a;wire a;input b;wire b;output sum;wire sum;output count;wire count;assign {count,sum}=a+b;endmodule6. 4位计数器的设计module sihisjishuqi(CLK,RESET,out);input CLK;wire CLK;input RESET;wire RESET;output[3:0] out;reg[3:0] out;always @ ( posedge CLK or negedge RESET )beginif(!RESET)out<=4'b0000;elsebeginout<=out+1;if(out==4'b1010)out<=4'b0000;endendendmodule7.分频时序逻辑电路的设计module eda_fp_even(clk_out,clk_in,rst); input clk_in;input rst;wire rst;output clk_out;reg clk_out;reg [1:0]cnt;parameter N=6;always @(posedge clk_in or negedge rst) beginif(!rst)beginclk_out<=0;cnt<=0;endelsebegincnt<=cnt+1;if(cnt==N/2-1)beginclk_out=!clk_out;cnt<=0;endendendendmodule8.7段显示译码器的设计module eda_scan_seven(clk,dig,y,rst); input clk;wire clk;input rst;wire rst;output[7:0] dig;wire[7:0] dig;output [7:0]y;wire [7:0]y;reg clkout;reg [19:0]cnt;reg [2:0]wei;reg [3:0]duan;reg [6:0]Y_r;reg [7:0]dig_r;assign y = {1'b1,(~Y_r[6:0])};assign dig =~dig_r;parameter period= 1000000;always@(posedge clk or negedge rst) beginif(!rst)cnt<=0;else begincnt<=cnt+1;if(cnt==(period>>1)-1)clkout<=#1 1'b1;else if(cnt==period-1)beginclkout<=#1 1'b0;cnt<=#1 1'b0;endendendalways@(posedge clkout or negedge rst ) beginif(!rst)wei<=0;elsewei<=wei+1;endalways @(wei) //数码管选择begincase ( wei )3'b000 :begindig_r <= 8'b0000_0001;duan <= 1;end3'b001 :begindig_r <= 8'b0000_0010;duan<= 3;end3'b010 :begindig_r <= 8'b0000_0100;duan<= 5;end3'b011 :begindig_r <= 8'b0000_1000;duan <= 7;end3'b100 :begindig_r <= 8'b0001_0000;duan<= 9;end3'b101 :begindig_r <= 8'b0010_0000;duan<= 11;end3'b110 :begindig_r <= 8'b0100_0000;duan <= 13;end3'b111 :begindig_r <= 8'b1000_0000;duan<= 15;endendcaseendalways @ ( duan ) //译码begincase ( duan )0: Y_r = 7'b0111111; // 01: Y_r = 7'b0000110; // 12: Y_r = 7'b1011011; // 23: Y_r = 7'b1001111; // 34: Y_r = 7'b1100110; // 45: Y_r = 7'b1101101; // 56: Y_r = 7'b1111101; // 67: Y_r = 7'b0100111; // 78: Y_r = 7'b1111111; // 89: Y_r = 7'b1100111; // 910: Y_r = 7'b1110111; // A11: Y_r = 7'b1111100; // b12: Y_r = 7'b0111001; // c13: Y_r = 7'b1011110; // d14: Y_r = 7'b1111001; // E15: Y_r = 7'b1110001; // Fdefault: Y_r = 7'b0000000;endcaseendendmodule9.数据选择器的设计module eda_8xuanyi (A,D0,D1,D2,D3,D4,D5,D6,D7,G,Y); input D0,D1,D2,D3,D4,D5,D6,D7,G;input [2:0]A;wire [2:0]A;output Y;reg Y;always @(A, G)beginif (G==0)Y<=0;elsecase(A)3'b000:Y=D0;3'b001:Y=D1;3'b010:Y=D2;3'b011:Y=D3;3'b100:Y=D4;3'b101:Y=D5;3'b110:Y=D6;3'b111:Y=D7;endcaseendendmodule10.数据锁存器的设计module e da_suocunqi(q,d,oen,g); output[7:0] q;//数据输出端input[7:0] d;//数据输入端input oen,g;//三态控制端reg[7:0] q;always @(*)beginif (oen)beginq<="z";endelsebeginif(g)q<=d;elseq<=q;endendendmodule11.数据寄存器的设计module eda_jicunqi(r,clk,d,y); input r,clk;input [7:0]d;wire [7:0]d;output [7:0]y;reg [7:0]y;always @ (posedge clk or negedge r) beginif(!r)y<=8'b00000000;elsey<=d;endendmodule12.顺序脉冲发生器的设计module eda_shunxu(clk,clr,q);input clk,clr;output [7:0]q;reg [7:0]q;always @ ( posedge clk or posedge clr ) beginif ( clr==1)beginq<=8'b00000000; //赋初值endelsebeginif(q==0)q<=8'b00000001;elseq<=q<<1; //给初值进行移位endendendmodule13.1位全加法器的设计module quanjiaqi(a,b,sum,count,cin); input a;wire a;input b;wire b;input cin;wire cin;output sum;wire sum;output count;wire count;assign{sum,count}=a+b+cin; endmodule15.键控Led灯的设计module eda_led(led,key);input key;output led;reg led_out;assign led<=led_out;always@(key)beginif(key)led_out<=1;else if(!key)led_out<=0;endendmodule16.双向移位寄存器的设计module eda_yiweijicunqi( left_right ,load ,clr ,clk ,DIN ,DOUT );input left_right ;wire left_right ;input load ;wire load ;input clr ;wire clr ;input clk ;wire clk ;input [3:0] DIN ;wire [3:0] DIN ;output [3:0] DOUT ;wire [3:0] DOUT ;reg [3:0] data_r;assign DOUT = data_r ;always @ (posedge clk or posedge clr or posedge load)//敏感变量,看真值表beginif(clr==1)data_r <= 0;//判断是否清零else if (load )data_r<=DIN;//判断是否装载数据//判断进行左移位还是右移位elsebeginif(left_right)data_r<=DIN<<1;elsedata_r<=DIN>>1;endendendmodule17.8-3优先编码器的设计module youxianbianma( A ,I ,GS ,EO ,EI ); input [7:0] I ;wire [7:0] I ;input EI ;wire EI ;output [2:0] A ;reg [2:0] A ;output GS ;reg GS ;output EO ;reg EO ;always @ ( I or EI )if ( EI )beginA <= 3'b111;GS <= 1;EO <= 1;endelse if (I==8'b11111111)beginA <= 3'b111;GS <= 1;EO <= 0;endelse if ( I==8'b11111110 )beginA <= 3'b111;GS <= 0;EO <= 1;endelse if ( I==8'b1111110x )beginA <= 3'b110;GS <= 0;EO <= 1;endelse if ( I==8'b111110xx )beginA <= 3'b101;GS <= 0;EO <= 1;endelse if ( I==8'b11110xxx )beginA <= 3'b100;GS <= 0;EO <= 1;endelse if ( I==8'b1110xxxx )beginA <= 3'b011;GS <= 0;EO <= 1;endelse if ( I==8'b110xxxxx )beginA <= 3'b010;GS <= 0;EO <= 1;endelse if ( I==8'b10xxxxxx )beginA <= 3'b001;GS <= 0;EO <= 1;endelse if ( I==8'b0xxxxxxx )beginA <= 3'b000;GS <= 0;EO <= 1;endendmodule18.数据分配器的设计module shujufenpeiqi(y0,y1,y2,y3,din,a); output y0,y1,y2,y3;//4??êy?Yí¨μàinput din;//êy?Yê?è?input [1:0] a;reg y0,y1,y2,y3;always @(din,a)beginy0=0;y1=0;y2=0;y3=0; //3?ê??ˉ£á?case(a)00:y0=din;01:y1=din;02:y2=din;03:y3=din;endcase end endmodule。
verilog行为级描述Verilog行为级描述Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。
在Verilog中,行为级描述是一种描述电路行为的方法。
本文将介绍Verilog行为级描述的基本概念、语法规则和一些实例应用。
一、Verilog行为级描述的基本概念1.1 模块和端口Verilog中的模块是一个独立的电路单元,可以包含输入端口、输出端口和内部信号。
每个端口都有一个方向(输入或输出)和一个数据类型(比特、向量等)。
1.2 运算符和表达式Verilog中支持各种运算符,包括算术运算符、逻辑运算符、位运算符等。
表达式是由运算符和操作数组成的公式,用于描述电路中的信号逻辑运算。
1.3 过程块过程块是Verilog中用于描述电路行为的基本单位。
过程块可以包含一系列的语句,用于描述电路的运行逻辑。
常用的过程块有始终块(always block)和过程生成块(generate block)。
二、Verilog行为级描述的语法规则2.1 模块定义Verilog中使用module关键字定义模块,后面跟着模块的名称和端口列表。
端口列表中包含每个端口的方向和数据类型。
2.2 信号声明在模块内部,可以使用wire或reg关键字声明信号。
wire用于声明连续的信号,reg用于声明时序的信号。
2.3 时序控制语句Verilog中常用的时序控制语句有if语句、case语句和for循环语句。
这些语句用于根据不同的条件执行不同的操作,实现复杂的电路行为。
2.4 实例化和连接Verilog中可以通过实例化将一个模块嵌入到另一个模块中。
实例化时需要连接各个模块的端口,以建立模块之间的信号传输。
三、Verilog行为级描述的应用实例下面是一个使用Verilog行为级描述实现的4位全加器的例子:```verilogmodule full_adder(input a,input b,input cin,output sum,output cout);wire w1, w2, w3;assign w1 = a ^ b;assign w2 = w1 ^ cin;assign sum = w2;assign w3 = a & b;assign cout = w3 | (w2 & cin);endmodule```在这个例子中,full_adder模块有三个输入端口(a、b和cin)和两个输出端口(sum和cout)。
Verilog HDL基本程序结构用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型,也称为模块,是Verilog 的基本描述单位。
模块描述某个设计的功能或结构以及与其他模块通信的外部接口,一般来说一个文件就是一个模块,但并不绝对如此。
模块是并行运行的,通常需要一个高层模块通过调用其他模块的实例来定义一个封闭的系统,包括测试数据和硬件描述。
一个模块的基本架构如下:module module_name (port_list)//声明各种变量、信号reg //寄存器wire//线网parameter//参数input//输入信号output/输出信号inout//输入输出信号function//函数task//任务……//程序代码initial assignmentalways assignmentmodule assignmentgate assignmentUDP assignmentcontinous assignmentendmodule说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。
语句用于定义设计的功能和结构。
说明部分可以分散于模块的任何地方,但是变量、寄存器、线网和参数等的说明必须在使用前出现。
一般的模块结构如下:module <模块名> (<端口列表>)<定义><模块条目>endmodule其中,<定义>用来指定数据对象为寄存器型、存储器型、线型以及过程块。
<模块条目>可以是initial结构、always结构、连续赋值或模块实例。
下面给出一个简单的Verilog模块,实现了一个二选一选择器。
例2-1 二选一选择器(见图2-1)的Verilog实现图2-1 例2-1所示的二选一电路module muxtwo(out, a, b, s1);input a, b, s1;output out;reg out;always @ (s1 or a or b)if (!s1) out = a;else out = b;endmodule模块的名字是muxtwo,模块有4个端口:三个输入端口a、b和s1,一个输出端口out。
Verilog中各种语句含义及⽤法简述Verilog中各种语句含义及⽤法简述⼀般认为Verilog HDL在系统级抽象⽅⾯⽐VHDL略差⼀些,⽽在门级开关电路描述⽅⾯⽐VHDL要强的多写了第⼀个verilog程序,是⼀个加法器内容如下module adder(count,sum,a,b,cin);input[2:0] a,b;input cin;output count;output [2:0] sum;assign{count,sum}=a+b+cin;endmodule开始编译出现了⼏次错误,后来发现给实体的命名和程序中实体要⼀致⽽且⼤⼩写要⼀样,整个程序是嵌套再module和endmodule当中的⽽其中的注释和C/C++类似,⽤//和来标明module compare(equal,a,b);output equal;input [1:0] a,b;assign equal=(a==b)?1:0;//和C语⾔中的相同endmoduleverilog的基本设计单元是“模块(BLOCK)”。
⼀个模块由两个部分组成,⼀部分描述端⼝,⼀部分描述逻辑功能,即定义输⼊是如何影响输出的。
如下module block(a,b,c,d);input a,b;output c,d;assign c="a|b";assign d="a"&b;endmodule模块中最重要的部分是逻辑功能定义。
有三种⽅法可以再模块中产⽣逻辑。
1、⽤“assign”声明语句如:assign a="b"&c;2、⽤实例元件,如同调⼊库元件⼀样如:and and_inst(q,a,b);3、⽤“always”块如:always @(posedge clk or posedge clr) //always块⽣成了⼀个带有异步清除端的D触发器。
beginif(clr) q<=0;else if(en) q<=d;end采⽤assign语句是最常⽤的⽅法之⼀。
Verilog 讲义(二)1)续Verilog 基础2)Verilog 形为描述3.4 运算符九类运算符分类包含运算符算术运算符+ - * / %位运算符~ & | ^ ^~or~^缩位运算符& ~& | ~| ^ ^~or~^逻辑运算符! && ||关系运算符> < <= >=相等与全等运算符== != === !==逻辑移位运算符 <<>> 连接运算符 {}: 条件运算符 ?根据操作数的不同,又可分为三类:1)单目运算符只有一个操作数,且运算符位于操作数的左边如:~clk &a ~& 缩位运算符wire [7:0] aparity=^a (奇校验)2)双目运算符a+b a%b {a,b,c}3)三目运算符out=(sel)?a:b;运算符的优先级参:P443.4.1 算术运算符1)减法亦可用作单目运算符,取补运算2)除法运算符:整型类数据小数部分被截去: integer a=7/2=33)% 取余运算 7%2=13.4.2 位运算符1)~a 按位取反2)a&b 按位相与若a,b 位数不同,短的高位补0,(x者补x)3)^ ^~ 双目3.4.3 缩位运算符单目运算符,按位进行逻辑运算,结果产生一位的逻辑值。
A=4’b1001&a ~&a |a ~|a ^a ~^a0 1 1 0 1 0 3.4.3 逻辑运算符a&&b结果为一位的逻辑值若操作数为多位,只要有一位为1,整个操作数看作逻辑1;若有不定态,结果亦为不定态。
3.4.5关系运算符结果为一位的逻辑值。
3.4.6 相等与全等运算符结果为一位逻辑值相等:比较每一位,所有相等,关系满足,若有不定态或高阻态,不定态结果。
全等:与相等比较过程相同,亦将不定态及高阻态作为逻辑状态比较。
3.4.7 逻辑移位运算符<< >> 以0补位。
Verilog 是一种硬件描述语言(HDL),主要用于描述数字电路的行为和结构。
以下是一些Verilog 语言的基本语句:模块声明:module ModuleName (input wire A, input wire B, output reg C);// 模块内部代码endmodule这里input 和output 定义了模块的接口。
wire 表示信号是一个线性的,reg 表示寄存器类型的信号。
组合逻辑:always @* beginC = A & B; // 与门endalways @* 表示这是一个组合逻辑块。
& 是逻辑与操作符。
时序逻辑:always @(posedge Clock) beginif (Reset) beginC <= 1'b0;end else beginC <= A | B; // 或门endend这里posedge 表示在时钟信号上升沿触发。
<= 是非阻塞赋值,= 是阻塞赋值。
模块实例化:ModuleName U1 (.A(InA), .B(InB), .C(OutC));实例化一个模块,并连接输入输出信号。
always_ff 块:always_ff @(posedge Clock) begin// 在时钟上升沿执行的代码end这是一种常用于时序逻辑的结构,比always @(posedge ...) 更加严格。
always_comb 块:always_comb begin// 组合逻辑,无时钟敏感end在这个块内部的代码将在每次输入信号变化时执行。
if-else 语句:if (condition) begin// 条件为真时执行的代码end else begin// 条件为假时执行的代码endcase 语句:case (selector)2'b00: // 两位二进制值为00时执行的代码2'b01: // 两位二进制值为01时执行的代码2'b10: // 两位二进制值为10时执行的代码2'b11: // 两位二进制值为11时执行的代码default: // 默认执行的代码endcase这些是Verilog 中的一些基本语句,用于描述数字电路的行为和结构。
第三章 Verilog-HDL中的语句1.基本语句1.1赋值语句赋值语句分为连续赋值语句和过程赋值语句。
1.1.1连续赋值语句1.连续赋值语句用于把值赋给wire型变量(不能为reg型变量赋值)。
语句形式为:assign A = B & C;a.只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;b.如果计算的结果值有变化,新结果就赋给左边的线网。
2.连续赋值的目标类型♦标量线网 wire a;♦向量线网 wire [7:0] a;♦向量线网的常数型位选择 a[1]♦向量线网的常数型部分选择 a[3:1]♦上述类型的任意的拼接运算结果 {3a[2],a[2:1]}注:多条assign语句可以合并到一起。
3.线网说明赋值连续赋值可作为线网说明本身的一部分。
这样的赋值被称为线网说明赋值。
如: wire Clear = 'b1;等价于 wire clear;assign clear=‘b1;1.1.2 过程赋值语句1.a.过程性赋值是仅仅在initial语句或always语句内的赋值b.它只能对reg型的变量赋值。
表达式的右端可以是任何表达式。
c.过程性赋值分两类:阻塞性过程赋值 =非阻塞性过程赋值<=2.语句内部时延与句间时延a.在赋值语句中表达式右端出现的时延是语句内部时延。
Done = #5 1'b1;b.通过语句内部时延表达式,右端的值在赋给左端目标前被延迟。
即右端表达式在语句内部时延之前计算,随后进入时延等待,再对左端目标赋值。
c.对比以下语句间的时延beginTemp = 1'b1;#5 Done = Temp; //语句间时延控制end3.阻塞性过程赋值a.赋值运算符是“=”的过程赋值是阻塞性过程赋值。
b.阻塞性过程赋值在在下一语句执行前,执行该赋值语句。
例:initialbeginClr = #5 0;Clr = #4 1;Clr = #10 0;end4.非阻塞性过程赋值a .在非阻塞性过程赋值中,使用赋值符号“ <=”。