Verilog所有知识点.docx
- 文档编号:27541896
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:15
- 大小:216.37KB
Verilog所有知识点.docx
《Verilog所有知识点.docx》由会员分享,可在线阅读,更多相关《Verilog所有知识点.docx(15页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Verilog 所有 知识点