湖工大电信大四一学期EDAVerilog HDL考试资料.docx
《湖工大电信大四一学期EDAVerilog HDL考试资料.docx》由会员分享,可在线阅读,更多相关《湖工大电信大四一学期EDAVerilog HDL考试资料.docx(29页珍藏版)》请在冰豆网上搜索。
湖工大电信大四一学期EDAVerilogHDL考试资料
1.什么叫EDA技术?
EDA技术,就是以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化、逻辑布局布线、逻辑仿真,直至完成对于特定目标芯片的适配编译、逻辑映射、编程下载等工作,最终形成集成电子系统或专用集成芯片的一门新技术。
2.利用EDA技术进行电子系统的设计,具有以下几个特点:
①用软件的方式设计硬件;②用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成的;③设计过程中可用有关软件进行各种仿真;④系统可现场编程,在线升级;⑤整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。
⑥从以前的“组合设计”转向真正的“自由设计”;⑦设计的移植性好,效率高,⑧非常适合分工设计,团体协作。
3.硬件描述语言(HDL):
常用的硬件描述语言有VHDL、Verilog、ABEL。
4.EDA软件系统应当包含以下子模块:
设计输入子模块、设计数据库子模块、分析验证子模块、综合仿真子模块、布局布线子模块等。
5.EDA的工程设计流程:
第一需要进行“源程序的编辑和编译”——用一定的逻辑表达手段将设计表达出来;第二要进行“逻辑综合”——将用一定的逻辑表达手段表达出来的设计,经过一系列的操作,分解成一系列的基本逻辑电路及对应关系(电路分解);第三要进行“目标器件的布线/适配”——在选定的目标器件中建立这些基本逻辑电路及对应关系(逻辑实现);第四,目标器件的编程/下载——将前面的软件设计经过编程变成具体的设计系统(物理实现);最后,要进行硬件仿真/硬件测试——验证所设计的系统是否符合设计要求。
同时,在设计过程中要进行有关“仿真”——模拟有关设计结果与设计构想是否相符。
【例3.27】3-8线译码器(高电平有效)
//3-8线译码器(高电平有效)decode3_8a.v
moduledecoder3_8a(ain,en,yout)
inputen;
input[2:
0]ain;
output[7:
0]yout;
reg[7:
0]yout;
always@(enorain)
begin
if(!
en)
yout=8’b00000000;
else
case(ain)
3’b000:
yout=8’b00000001;
3’b001:
yout=8’b00000010;
3’b010:
yout=8’b00000100;
3’b011:
yout=8’b00001000;
3’b100:
yout=8’b00010000;
3’b101:
yout=8’b00100000;
3’b110:
yout=8’b01000000;
3’b111:
yout=8’b10000000;
deflaut:
yout=8’b00000000;
endcase
end
【例3.28】3-8线译码器(低电平有效)
//3-8线译码器(低电平有效)decode3_8b.v
moduledecoder3_8b(g1,g2a,g2b,c,b,a,y7,y6,y5,y4,y3,y2,y1,y0);
inputg1,g2a,g2b;
inputc,b,a;
outputy7,y6,y5,y4,y3,y2,y1,y0;
regy7,y6,y5,y4,y3,y2,y1,y0;
always@(g1org2aorg2borcorbora)
begin
if((g1==1’b0)||(g2a==1’b1)||(g2b==1’b1))
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11111111;
elseif((g1==1’b1)&&(g2a==1’b0)&&(g2b==1’b0))
begin
case({c,b,a})
3’b000:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11111110;
3’b001:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11111101;
3’b010:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11111011;
3’b011:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11110111;
3’b100:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11101111;
3’b101:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11011111;
3’b110:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b10111111;
3’b111:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b01111111;
deflaut:
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11111111;
endcase
end
else
{y7,y6,y5,y4,y3,y2,y1,y0}<=8’b11111111;
end
endmodule
2.编码器
【例3.29】8-3线优先编码器。
//8-3线优先编码器:
encode8_3.v
Moduleencode8_3(y,a);
Output[2:
0]y;
Input[7:
0]a;
Reg[2:
0]y;
Always@(a)
Casex(a)
8’b?
?
?
?
?
?
?
1:
y=3’d000;
8’b?
?
?
?
?
?
10:
y=3’d001;
8’b?
?
?
?
?
100:
y=3’d010;
8’b?
?
?
?
1000:
y=3’d011;
8’b?
?
?
10000:
y=3’d100;
8’b?
?
100000:
y=3’d101;
8’b?
1000000:
y=3’d110;
8’b10000000:
y=3’d111;
deflaut:
y=3’bzzz;
endcase
endmodule
3.比较器
【例3.30】8位二进制比较器
//8位二进制比较器compare8.v
Modulecompare8(a,b,eq,gt,lt);
Input[7:
0]a,b;
Outputeq,gt,lt;
Regeq,gt,lt;
Always@(aorb)
Begin
If(a==b)
{eq,gt,lt}<=3’b100;
Elseif(a>b)
{eq,gt,lt}<=3’b010;
ElseIf(a
{eq,gt,lt}<=3’b001;
else
{eq,gt,lt}<=3’b000;
End
Endmodule
4.选择器
【例3.31】四选一信号选择器一。
Modulemul4_1a(y,s,x);
Outputy;
Input[1:
0]s;
Input[3:
0]x;
Regy;
Always@(sorx)
Begin
Case(s)
2’b00:
y=x[0];
2’b01:
y=x[1];
2’b10:
y=x[2];
2’b11:
y=x[3];
Deflaut:
y=1’b0;
Endcase
End
Endmoduse
【例3.32】四选一信号选择器二
//使用if语句的四选一信号选择器mul4_1b.v
Modulemul4_1b(y,s,x);
Outputy;
Input[1:
0]s;
Input[3:
0]x;
Regy;
Always@(sorx)
Begin
If(s==2’b00)
Y=x[0];
If(s==2’b01)
Y=x[1];
If(s==2’b10)
Y=x[2];
else
Y=x[3];
End
Endmodule
【例3.33】四选一数据选择器。
//四选一数据选择器mul4_1c.v
Modulemul4_1c(y,s,data0,data1,data2,data3);
Output[7:
0]y;
Input[1:
0]s;
Input[7:
0]data0,data1,data2,data3;
Regy;
Always@(sordata0ordata1ordata2ordata3)
Begin
If(s==2’b00)
Y=data0;
ElseIf(s==2’b01)
Y=data1;
ElseIf(s==2’b10)
Y=data2;
Else
Y=data3;
End
Endmodule
5.驱动电路
1)【例3.34】三态门电路
//三态门电路tritate.v
Moduletristate(en,din,dout);
Inouten,din;
Outputdout;
Regdout;
Always@(enordin)
If(en==1’b1)
Dout<=din;
Else
Dout<=1’bz;
End
endmodule
【例3.35】单向总线驱动器。
//单向总线驱动器tri_bufs.v
Moduletri_bufs(en,din,dout);
Inputen;
Input[7:
0]din;
Output[7:
0]dout;
Reg[7:
0]dout;
Always@(enordin)
Begin
If(en==1’b1)
Dout<=din;
Else
Dout<=8’bzzzzzzz;
End
Endmodule
3)【例3.36】双向总线缓冲器。
//双向总线缓冲器bidir_bufs.v
Modulebidir_bufs(a,b,en,dir);
Inout[7:
0]a,b;
Inputen,dir;
Reg[7:
0]sa,sb;
Always@(aorenordir)
Begin
If(en==1’b0)
If(dir==1’b0)
Sb<=a;
Else
Sb<=8’bzzzzzzz;
End
Assignb=sb;
Always@(borenordir)
Begin
If(en==1’b0)if(dir==1’b1)
Sa<=b;
Else
Sa<=8’bzzzzzzz;
End
Assigna=sa;
Endmodule;
【例3.37】D触发器
//D触发器d_ff.v
Moduled_ff(d,clk,q,qn);
Inputd;
Inputclk;
Outputq,qn;
Regq,qn;
Always@(posedgeclk)
Begin
q<=d;
qn<=~d;
end
endmodule
【例3.38】非同步复位/置位的D触发器、
//非同步复位/置位的D触发器asynd_ff.v
Moduleasynd_ff(clk,d,preset,clr,q);
Inputclk,d,preset,clr;
Outputq;
Regq;
Always@(posedgeclk)
Begin
If(preset)
q<=1’b1;
elseif(clr)
q<=1’b0;
else
q<=d;
end
endmodule
【例3.39】同步复位的D触发器。
//同步复位的D触发器asynd_ff.v
Modulesynd_ff(clk,d,reset,q);
Inputclk,d,reset;
Outputq;
Regq;
Always@(posedgeclk)
Begin
If(reset)
q<=1b’0;
else
q<=d;
end
endmodule
【例3.40】JK触发器。
//JK触发器jk_ff.v
Modulejk_ff(j,k,c,q,qn);
Inputj,k;
Inputc;
Outputq,qn;
Regq,qn;
Always@(negedgec)
Begin
Case({j,k})
2’b00:
beginq<=q;qn<=qn;end;
2’b01:
beginq<=1’b0;qn<=1’b1;end;
2’b10:
beginq<=1’b1;qn<=1’b0;end;
2’b11:
beginq<=qn;qn<=q;end;
default:
beginq<=q;qn<=qn;end;
endcase
end
endmodule
【例3.41】T触发器
//T触发器t_ff.v
Modulet_ff(en,t,q,qn);
Inputen;
Inputt;
Outputq,qn;
Regq,qn;
Always@(posedget)
Begin
If(en==1’b1)
Begin
Qn<=q;
Q<=~q;
End
Else
Begin
Qn<=q;
Q<=qn;
End
End
Endmodule
【例3.42】8位数据寄存(锁存)器。
//8位数据寄存(锁存)器reg8.v
Modulereg8(clk,d,q);
Inputclk;
Input[7:
0]d;
Output[7:
0]q;
Regq;
Always@(posedgeclk)
Begin
Q<=d;
End
Endmodule
【例3.43】具有左移或右移1位、并行输入和同步复位功能的8位移位寄存器。
//移位寄存器sftreg8.v
Modulesftreg8(clk,reset,lsft,rsft,data,mode,qout);
Inputclk,reset;
Inputlsft,rsft;
Input[7:
0]data;
Input[1:
0]mode;
Output[7:
0]qout;
Reg[7:
0]qout;
Always@(posedgeclk)
Begin
If(reset)
Qout<=8’b00000000;
Else
Case(mode)
2’b01:
qout<={rsft,qout[7:
1]};
2’b10:
qout<={qout[6:
0],left};
2’b11:
qout<=data;
Default:
qout<=8b’00000000;
Endcase
End
Endmodule
【例3.44】带时钟使能的十进制同步计数器。
//有时钟使能的十进制同步计数器cnt10.v
Modulecnt10(clk,clr,ena,cq,co);
Inputclk;
Inputclr;
Inputena;
Output[3:
0]cq;
Outputco;
Reg[3:
0]cnt;
Regco;
//计数过程
Always@(posedgeclkorposedgeclr)
Begin
If(clr)
Cnt<=4’b0;
Else
If(ena)
If(cnt==4’h9)
Cnt<=4’h0;
Else
End
Assigncq=cnt;
//控制进位输出并去毛刺
Always@(posedgeclk)
Begin
If(cnt==4’h9)
Co=4’h1;
Else
Co=4’h0;
End
Endmodule
【例3.45】具有异步复位、同步置数功能的8421BCD码六十进制同步计数器。
//有时钟使能的十进制同步计数器cnt10.v
Modulecnt10(clk,clr,ena,cq,co);
Inputclk;
Inputclr;
Inputena;
Output[3:
0]cq;
Outputco;
Reg[3:
0]cnt;
Regco;
//计数控制过程
Always@(posedgeclkorposedgeclr)
Begin
If(clr)
Cnt<=4’b0;
Else
If(ena)
If(cnt==4’h9)
Cnt<=4’h0;
Else
Cnt<=cnt+1;
End
Assigncq=cnt;
//控制进位输出并去毛刺
Always@(pposedgeclk)
Begin
If(cnt==4’h9)
Co=4’h1;
Else
Co=4’h0;
End
Endmodule
//有时钟使能的六进制同步计数器cnt6.v
Modulecnt6(clk,clr,ena,cq,co);
Inputclk;
Inputclr;
output[3:
0]cq;
Outputco;
Reg[3:
0]cnt;
Regco;
//计数控制过程
Always@(posedgeclkorposedgeclr)
Begin
If(clr)
Cnt<=4’b0;
Else
If(ena)
If(cnt==4’h5)
Cnt<=4’h0;
Else
Cnt<=cnt+1;
End
Assigncq=cnt;
//控制进位输出并去毛刺
Always@(posedgeclk)
Begin
If(cnt==4’h5)
Co=4’h1;
Else
Co=4’h0;
End
Endmodule
//六十进制计数器cnt60a.v
Modulecnt60a(clk,clr,ena,dout);
Inputclk;
Inputclr;
Inputena;
Output[7:
0]dout;
Wires0;
Cnt10u0(.ena(ena),.clk(clk),.clr(clr),.cq(dout[3:
0]),.co(s0));
Cnt6u1(.ena(ena),.clk(s0),.clr(clr),.cq(dout[7:
4]),.co());
Endmodule
【例3.46】具有异步复位、同步置数功能的8421BCD码六十进制同步计数器。
//六十进制同步计数器cnt60b.v
Modulecnt60b(clk,reset,load,ena,d,qh,ql,co);
Inputclk;
Inputreset;
Input[7:
0]d;
Inputload;
Inputena;
Output[3:
0]qh;
Output[3:
0]ql;
Regco;
//计数控制过程
Always@(posedgeclkornegedgereset)
Begin
If(!
reset)
Begin
Qh<=4’h0;
Ql<=4’h0;
End
Else
If(load)
Begin
Qh<=d[7:
4];
Ql<=d[3:
0];
End
Else
Begin
If(ena)
If(ql==4’h9)
Begin
Ql<=4’h0;
If(qh==4’h5)
Qh<=4’h0;
Else
Qh<=qh+1;
End
Else
Ql<=ql+1;
End
End
//进位输出控制过程
Always@(qhorqlorena)
If(qh==4’h5&&q1==4’h9&&ena==1’b1)
Co<=4’h1;
Else
Co<=4’h0;
Endmodule
【例3.47】由8个D触发器构成的异步计数器。
//D触发器d_ff1.v
Moduled_ff1(clk,clr,d,q,qn);
Inputclk,clr;
Inputd;
Outputq,qn;
Regq,qn;
Regq_in;
Always@(posedgeclk)
Begin
If(clr)
Begin
Q<=q_in;
Qn<=~q_in;
End
Else
Begin
Q<=d;
Qn<=~d;
End
End
Endmodule
//由8个D触发器构成的8位计数器dcnt8.v
Moduledcnt8(clk,clr,cnt);
Inputclk;
Inputclr;
Output[7:
0]cnt;
Wire[8:
0]cnt;
Wires1,s2,s3,s4,s5,s6,s7,s8;
D_ff1uut0(.clk(clk),.clr(clr),.d(s1),.q(cnt[0]),.qn(s1));
D_ff1uut1(.clk(s1),.clr(clr),.d(s2),.q(cnt[1]),.qn(s2));
D_ff1uut2(.clk(s2),.clr(clr),.d(s3),.q(cnt[2]),.qn(s3));
D_ff1uut3(.clk(s3),.clr(clr),.d(s4),.q(cnt[3]),.qn(s4));
D_ff1uut4(.clk(s4),.clr(clr),.d(s5),.q(cnt[4]),.qn(s5));
D_ff1uut5(.clk(s5),.clr(clr),.d(s6),.q(cnt[5]),.qn(s6));
D_ff1uut6(.clk(s6),.clr(clr),.d(s7),.q(cnt[6]),.qn(s7));
D_ff1uut7(.clk(s7),.clr(clr),.d(s8),.q(cnt[7]),.qn(s8));
Endmodule
【例3.48】将1KHz的方波信号变为正、负周不等的50Hz信号的非均匀分频电路
//将1KHz的信号变为50Hz非均匀分频器fjydiv.v
Modulefjydiv(cl