Verilog所有知识点.docx

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

Verilog所有知识点.docx

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

Verilog所有知识点.docx

Verilog所有知识点

Verilog所有知识点

5.

6.位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;

delta=2.13

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