Verilog语言描述常见电路结构范例精Word文件下载.docx
《Verilog语言描述常见电路结构范例精Word文件下载.docx》由会员分享,可在线阅读,更多相关《Verilog语言描述常见电路结构范例精Word文件下载.docx(7页珍藏版)》请在冰点文库上搜索。
![Verilog语言描述常见电路结构范例精Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/be786eae-d9b8-4855-b930-bc2576e741aa/be786eae-d9b8-4855-b930-bc2576e741aa1.gif)
用Verilog描述4:
1MUX可以有如下方法:
一个if语句加多个elseif从句
嵌套if语句
case语句
always@(aorborcordorselbegin
if(sel==2'
b00y=a;
elseif(sel==2'
b01y=b;
b10y=c;
elsey=d;
if(sel[1]==0
if(sel[0]==0y=a;
elsey=b;
else
if(sel[0]==0y=c;
always@(aorborcordorselbegin
case(sel
2'
b00:
y=a;
b01:
y=b;
b10:
y=c;
b11:
y=d;
default:
endcase
八选一多路选择器
描述8:
1MUX最好使用case语句
always@(a0ora1ora2ora3ora4ora5ora6ora7orselbegin
0:
y=a0;
1:
y=a1;
2:
y=a2;
3:
y=a3;
4:
y=a4;
5:
y=a5;
6:
y=a6;
7:
y=a7;
8:
3编码器
编码器可以将多个离散的信号用编码表示出来,比如3位的编码可以表示8个信号。
下面的例子给出了三种8:
3编码器的描述方法。
always@(abegin
if(a==8'
b00000001y=0;
elseif(a==8'
b00000010y=1;
b00000100y=2;
b00001000y=3;
b00010000y=4;
b00100000y=5;
b01000000y=6;
b10000000y=7;
elsey=3'
bX;
case(a
8'
b00000001:
y=0;
b00000010:
y=1;
b00000100:
y=2;
b00001000:
y=3;
b00010000:
y=4;
b00100000:
y=5;
b01000000:
y=6;
b10000000:
y=7;
y=3'
always@(abegin
test=8'
b00000001;
y=3'
for(i=0;
i<
8;
i=i+1begin
if(a==test
y=i;
test=test<
<
1;
优先级编码器
优先级编码器是一种特殊的编码器,就是当多个输入信号同时有效时,它只输出优先级最高的信号的编码。
下面的例子给出了8:
3优先级编译器的描述方法。
valid=1;
if(a[7]y=7;
elseif(a[6]y=6;
elseif(a[5]y=5;
elseif(a[4]y=4;
elseif(a[3]y=3;
elseif(a[2]y=2;
elseif(a[1]y=1;
elseif(a[0]y=0;
elsebegin
valid=0;
bx;
casez(a
b1?
?
:
b01?
b001?
b0001?
b00001?
b000001?
b0000001?
begin
always@(aornbegin
for(i=8;
if(a[i]begin
译码器
译码器的作用恰好与编码器相反,它从编好的码中把原始信号还原出来。
下面的例子给出了三种3:
8译码器的描述方法:
if(a==0y=8'
elseif(a==1y=8'
b00000010;
elseif(a==2y=8'
b00000100;
elseif(a==3y=8'
b00001000;
elseif(a==4y=8'
b00010000;
elseif(a==5y=8'
b00100000;
elseif(a==6y=8'
b01000000;
elsey=8'
b10000000;
y=8'
always@(aornbegin
if(a==ny[i]=1;
elsey[i]=0;
比较器
比较器用于比较两个或多个输入的关系,如相等、不等、大小等。
下面的例子给出了三种6位比较器的描述方法。
always@(a1ora2ora3orb1orb2orb3begin
y1=1;
for(n=0;
n<
6;
n=n+1
if(a1[n]!
=b1[n]y1=0;
y2=0;
if(a2==b2y2=1;
if(a3==b3y3=1;
elsey3=0;
时序逻辑时序逻辑包括latch、触发器、计数器等,latch产生的主要原因是if或case语句中的条件不完整,这是要努力避免的。
D触发器always@(posedgeclkbeginif(!
rst_syny1<
=0;
elsey1<
=d1;
endalways@(posedgeclkornegedgerst_nbeginif(!
rst_ny2<
elsey2<
=d2;
rst_ny3<
elseif(rst_syny3<
elsey3<
=d3;
endalways@(posedgeclkif(eny4<
=d4;
always@(posedgeclkif(rst_syny5<
elseif(eny5<
=d5;
always@(posedgeclkornegedgerst_nif(rst_ny6<
elseif(eny6<
=d6;
计数器always@(posedgeclkornegedgerst_nbeginif(!
rst_ncounter=0;
elsebegincase({up,down}2'
counter<
=counter+1;
2'
=counter-1;
endcaseendend
有限状态机FSM由状态寄存器、下一状态逻辑和输出逻辑组成。
下面的例子给出了一个FSM的描述方法。
modulefsm1(ds,rd,go,ws,clk,rst_n;
outputds,rd;
inputgo,ws;
inputclk,rst_n;
regds,rd;
parameter[1:
0]IDLE=2'
b00,READ=2'
b01,DLY=2'
b10,DONE=2'
b11;
reg[1:
0]state,next;
always@(posedgeclkornegedgerst_nif(!
rst_nstate<
=IDLE;
elsestate<
=next;
always@(stateorgoorwsbeginnext=2'
ds=1'
b0;
rd=1'
case(stateIDLE:
if(gonext=READ;
elsenext=IDLE;
READ:
beginrd=1'
b1;
next=DLY;
endDLY:
if(wsnext=READ;
elsenext=DONE;
endDONE:
beginds=1'
next=IDLE;
endendcaseendendmodule