Verilog所有知识点.docx

上传人:b****3 文档编号:27541896 上传时间:2023-07-02 格式:DOCX 页数:15 大小:216.37KB
下载 相关 举报
Verilog所有知识点.docx_第1页
第1页 / 共15页
Verilog所有知识点.docx_第2页
第2页 / 共15页
Verilog所有知识点.docx_第3页
第3页 / 共15页
Verilog所有知识点.docx_第4页
第4页 / 共15页
Verilog所有知识点.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Verilog所有知识点.docx

《Verilog所有知识点.docx》由会员分享,可在线阅读,更多相关《Verilog所有知识点.docx(15页珍藏版)》请在冰豆网上搜索。

Verilog所有知识点.docx

Verilog所有知识点

Verilog根底:

1.间隔符:

空格〔\b〕,Tab〔\t〕,换行符〔\n〕,换页符。

2.注释:

/**///

3.标识符,关键词:

标识符由英文字母、数字、$符、下划线组成,以英文字母或下划线开头。

4.逻辑值:

0:

逻辑假1:

逻辑真x或X:

不确定状态z或Z:

高阻态

5.常量:

<1>格式:

<+/-><位宽>’<基数符号><数值>

b/o/d/h:

二、八、十、十六进制

<2>数字可加下划线:

8’b1001_1001表示8位二进制数10011001

<3>科学计数:

5E-4:

5*10^4

<4>利用参数定义语句来定义一个标识符表示常量:

parameter参数名1=常量1,参数名2=常量2;

例:

parameterBIT=1,BYTE=8;

6.字符串:

双撇号内的字符序列,不能分多行书写,表达式或赋值语句中字符串要换成无符号整数,用8位ASCII码表示,一个8位ASCII码表示一个字符

变量的数据类型:

1.线网〔nettype〕类型:

线网类被定义后假如没有被元件驱动,如此默认值为高阻态

关键词:

wire:

wire[n-1:

0]变量名1,变量名2,…,变量名n;

除wire外还有wand、wor、tri、triand、trior、trireg

2.存放器类型:

存放器型变量只能在initial或always内被赋值,没被赋值默认为x状态。

4种类型的存放器变量:

<1>reg:

行为描述中对存放器型变量说明

<2>integer:

32位有符号整数型

<3>real:

64位有符号实型变量〔默认值是0〕

<4>time:

64位无符号时间型

①reg:

格式:

reg[n-1:

0]变量名1,…,变量名n;

例:

integercounter;

initial//initial是过程语句结构,赋值给存放器类型变量

counter=-1;

③real:

通常用于对实数型常量进展储存运算

例:

realdelta;

initial

begin

delta=4e10;

end

integeri;

initiali=delta;//i得到的值为2

④time:

主要用于储存仿真时间,只储存无符号整数,常调用系统函数$time

例:

timecurrent_time;

initial

current_time=$time;

Verilog根本结构

module模块名〔端口名1,端口名2,…〕

端口类型说明〔input,output,inout〕//inout是双向端口

参数定义;//将常量用符号常量代替,非必须结构

数据类型定义〔wire,reg等〕

实例化底层模块和根本门级元件;

连续赋值语句〔assign〕;

过程块结构〔initial和always〕;

行为描述语句;

endmodule

描述方式:

①结构描述方式:

调用其他已定义好的底层模块对整个电路进展描述,或直接调用根本门级元件描述。

②数据流描述方式:

使用连续赋值语句对电路逻辑功能进展描述。

③行为描述方式:

使用过程块语句结构〔initial,always〕。

组合逻辑电路门级建模

根本门级元件:

and:

多输入与门or:

多输入或门xor:

多输入异或门

buf:

多输出缓冲器bufif1:

高电平有效三态缓冲器

bufif0:

低电平有效三态缓冲器

nand:

多输入与门nor:

多输入或非门xnor:

多输入异或非门

not:

多输入反相器notif1:

高电平有效三态反相器

notif0:

低电平有效三态反相器

①多输入门:

andA1〔out,in1,in2,in3〕;

②多输出门:

bufB1〔out1,out2,…,in〕;

③三态门:

bufif1B1〔out,in,ctrl〕;

notif1N1〔out,in,ctrl〕;

组合逻辑电路数据流建模

数据流建模使用的根本语句是连续赋值语句,用于对wire型变量进展赋值,由关键词assign开始,由操作数和运算符组成的逻辑表达式。

2选1数据选择器:

wireA,B,SEL,L;

assignL=〔A&~SEL〕|〔B&SEL〕;

组合逻辑电路行为级建模

描述数字逻辑电路的功能和算法,使用always结构,后面跟一系列过程赋值语句,给reg类型变量赋值。

1.条件语句:

if:

①if(condition_expr)true_statement;

②if(condition_expr)true_statement;

elsefale_statement;

③if(condition_expr1)true_statement1;

elseif(condition_expr2)true-statement2;

.

.

.

elsedefault_statement;

注:

if括号中的表达式假如为0,z或x都按“假〞处理,否如此按“真〞处理。

2.多支路分支语句:

case:

case(case_expr)

item_expr1:

statement1;

item_expr2:

statement2;

.

.

.

default:

default_statement;//可省略

endcase

注:

假如分支后的语句是多条语句,要在多余语句前加上begin,最后加上end。

3.always:

always〔循环执行条件〕表示括号内的任意一个变量发生变化时,其下面的过程赋值语句就执行一次,执行完最后一句时,执行挂起,等待变量发生变化,圆括号内的变量被称为敏感变量。

注:

①敏感变量互相之间用or连接②只能给存放器变量赋值〔reg型〕。

用verilog描述锁存器和触发器

1.时序电路建模:

always〔事件控制表达式/敏感事件表〕

begin

块内局部变量的定义;

过程赋值语句;//左边的变量必须为存放器数据类型,右边随意

end

敏感事件分两种类型:

电平敏感,边沿触发

①电平敏感:

always〔SELoraorb〕

SEL,a,b中任意一个信号电平发生变化如此后面的语句执行一次。

②边沿触发:

posedge〔上升沿〕negedge〔下降沿〕

always〔posedgeCPorposedgeCR〕

时钟信号CP上升沿到来或清零信号CR跳变为低电平时,执行之后的语句。

always内部的赋值语句:

阻塞型赋值语句〔=号赋值〕,非阻塞型赋值语句〔<=号赋值〕

①阻塞型赋值语句:

按语句由上到下的顺序进展赋值,即有先后顺序

②非阻塞型赋值语句:

并行执行,所有语句同时执行赋值

注:

一个语句块〔begin…end〕中只允许使用一种类型的赋值方式,时序电路中采用非阻塞型赋值语句。

用verilog描述时序逻辑电路

1.移位存放器的Verilog建模:

左移:

Q<={Dsl,Q[3:

1]}

将左移输入端Dsl的数据直接传给输出Q[3],

Q[3]->Q[2],Q[2]->Q[1],Q[1]->Q[0](Q[3:

1]传给Q[2:

0])

右移:

Q<={Q[3:

0],Dsr};

moduleTest_shift74194(S1,S0,D,Dsl,Dsr,Q,CP,CR);

inputS1,S0;

inputDsl,Dsr;

inputCP,CR;

input[3:

0]D;

output[3:

0]Q;

reg[3:

0]Q;

always(posedgeCPornegedgeCR)

if(~CR)Q<=4'b0000;

else

case({S1,S0})

2'b00:

Q<=Q;

2'b01:

Q<={Q[2:

0],Dsr};

2'b10:

Q<={Dsl,Q[3:

1]};

2'b11:

Q<=D;

endcase

endmodule

2.计数器的Verilog建模:

a)同步二进制计数器:

modulecounter(CEP,CET,PE,D,CP,CR,Q,TC);

inputCEP,CET,PE,CP,CR;

input[3:

0]D;

outputTC;

output[3:

0]Q;

reg[3:

0]Q;

wireCE;

assignCE=CEP&CET;

assignTC=CET&(Q==4'b1111);

always(posedgeCPornegedgeCR)

if(~CR)Q<=4'b0000;

elseif(~PE)Q<=D;

elseif(~CE)Q<=Q;

elseQ<=Q+1'b1;

endmodule

b)异步二进制计数器:

moduleripplecounter(Q0,Q1,Q2,Q3,CP,CR);

outputQ0,Q1,Q2,Q3;

inputCP,CR;

D_FFFF0(Q0,~Q0,CP,~CR);

D_FFFF1(Q1,~Q1,Q0,~CR);

D_FFFF2(Q2,~Q2,Q1,~CR);

D_FFFF3(Q3,~Q3,Q2,~CR);

endmodule

moduleD_FF(Q,D,CP,Rd);

outputQ;

inputD,CP,Rd;

regQ;

always(negedgeCPornegedgeRd)

if(~Rd)Q<=1'b0;

elseQ<=D;

endmodule

c〕非二进制计数器:

modulem10_counter(CE,CP,CR,Q);

inputCE,CP,CR;

output[3:

0]Q;

reg[3:

0]Q;

always(posedgeCPornegedgeCR)

if(~CR)Q<=4'b0000;

elseif(CE)

beginif(Q>=4'b1001)Q<=4'b0000;

elseQ<=Q+1'b1;

end

elseQ<=Q;

endmodule

 

所有实验代码与电路波形:

十进制可逆计数器实验:

代码一〔可逆计数器〕:

modulekenijishuqi(set,cin,clk,clr,upd,q,co);

inputclk,clr,upd,set;

input[3:

0]cin;

outputregco;

outputreg[3:

0]q;

always(posedgeclkornegedgeclr)

begin

if(!

clr)

if(!

set)//clear0

begin

q=cin;

end

else

begin

q=0;co=0;

end

else

begin

if(upd)//addcounter

begin

if(q==4'd8)co=1'b1;//whenq=1000b,co=1

elseco=0;//elseco=0

if(q<4'd9)q=q+1'b1;//whenq<=1000b,

elseq=0;//q=1001nextq=0000

end

else//decrese

begin

if(q==1)co=1'b1;

elseco=0;

if(q>0)q=q-1'b1;

elseq=4'd9;

end

end

end

endmodule

 

代码二〔BCD码-七段译码器〕:

moduledecode4_7(codeout,indec);

input[3:

0]indec;

output[6:

0]codeout;

reg[6:

0]codeout;

always(indec)

begin

case(indec)

4'd0:

codeout=7'b1111110;

4'd1:

codeout=7'b0110000;

4'd2:

codeout=7'b1101101;

4'd3:

codeout=7'b1111001;

4'd4:

codeout=7'b0110011;

4'd5:

codeout=7'b1011011;

4'd6:

codeout=7'b1011111;

4'd7:

codeout=7'b1110000;

4'd8:

codeout=7'b1111111;

4'd9:

codeout=7'b1111011;

default:

codeout=7'bx;

endcase

end

endmodule

移位器使用74198,不用代码:

 

Pw脉冲控制m:

代码一:

moduleswm_1(clk,out10khz);

inputclk;

reg[12:

0]q5000;

outputregout10khz;

always(posedgeclk)

begin

if(q5000<=2499)

begin

q5000<=q5000+1;

out10khz<=1;

end

elseif(q5000<=4999)

begin

q5000<=q5000+1;

out10khz<=0;

end

else

q5000<=0;

end

endmodule

代码二:

moduleswm_2(clk2,a,b,cout);

inputclk2;

input[3:

0]a,b;

outputregcout;

wire[6:

0]zhishu;

reg[7:

0]q100;

assignzhishu=10*a+b;

always(posedgeclk2)

begin

if(q100<=zhishu)

begin

cout<=1;

q100<=q100+1;

end

elseif(q100<99)

begin

cout<=0;

q100<=q100+1;

end

else

q100<=0;

end

endmodule

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1