EDA技术与verilog语言练习题Word格式文档下载.docx
- 文档编号:22011025
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:23
- 大小:20.47KB
EDA技术与verilog语言练习题Word格式文档下载.docx
《EDA技术与verilog语言练习题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《EDA技术与verilog语言练习题Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
//系统任务,暂停仿真以便观察仿真波形。
end
comparem(.equal(equal),.a(a),.b(b));
//调用被测试模块t.m
endmodule
//----------测试模块源代码(方法之二):
-------------------------
regclock;
clock=0;
//定义一个时钟变量
always#50clock=~clock;
//产生周期性的时钟
always@(posedgeclock)//在每次时钟正跳变沿时刻产生不同的a和b
a={$random}%2;
//每次a是0还是1是随机的。
b={$random}%2;
//每次b是0还是1是随机的。
initial
begin#100000$stop;
end//系统任务,暂停仿真以便观察仿真波形。
练习二.简单分频时序逻辑电路的设计
//-------------------------文件名:
half_clk.v--------------------------------
modulehalf_clk(reset,clk_in,clk_out);
inputclk_in,reset;
outputclk_out;
regclk_out;
always@(posedgeclk_in)
begin
if(!
reset)clk_out=0;
elseclk_out=~clk_out;
//----------测试模块的源代码:
------------------------
//-------------------文件名top.v-----------------------------
`timescale1ns/100ps
`defineclk_cycle50
moduletop;
regclk,reset;
wireclk_out;
always#`clk_cycleclk=~clk;
//产生测试时钟
initial
clk=0;
reset=1;
#10reset=0;
#110reset=1;
#100000$stop;
half_clkm0(.reset(reset),.clk_in(clk),.clk_out(clk_out));
练习三.利用条件语句实现计数分频时序电路
//--------------模块源代码:
-----------------------------
//---------------fdivision.v-----------------------------
modulefdivision(RESET,F10M,F500K);
inputF10M,RESET;
outputF500K;
regF500K;
reg[7:
0]j;
always@(posedgeF10M)
RESET)//低电平复位。
F500K<
=0;
j<
else
if(j==19)//对计数器进行判断,以确定F500K信号是否反转。
=~F500K;
else
=j+1;
//-------------测试模块源代码:
//---------------fdivision_Top.v------------------------
moduledivision_Top;
regF10M,RESET;
wireF500K_clk;
always#`clk_cycleF10M_clk=~F10M_clk;
RESET=1;
F10M=0;
#100RESET=0;
#100RESET=1;
#10000$stop;
fdivisionfdivision(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk));
练习四.阻塞赋值与非阻塞赋值的区别
//----------模块源代码:
----------------------
//-------------blocking.v---------------
moduleblocking(clk,a,b,c);
output[3:
0]b,c;
input[3:
0]a;
inputclk;
reg[3:
always@(posedgeclk)
b=a;
c=b;
$display("
Blocking:
a=%d,b=%d,c=%d"
a,b,c);
end
//-------------non_blocking.v-------------------
modulenon_blocking(clk,a,b,c);
b<
=a;
c<
=b;
Non_Blocking:
//----------测试模块源代码:
--------------------------
//-------------compareTop.v-----------------------------
./blocking.v"
./non_blocking.v"
modulecompareTop;
wire[3:
0]b1,c1,b2,c2;
regclk;
forever#50clk=~clk;
//思考:
如果在本句后还有语句,能否执行?
为什么?
a=4'
h3;
____________________________"
);
#100a=4'
h7;
hf;
ha;
h2;
#100$display("
$stop;
non_blockingnon_blocking(clk,a,b2,c2);
blockingblocking(clk,a,b1,c1);
练习五.用always块实现较复杂的组合逻辑电路
//---------------文件名alu.v--------------------------
`defineplus3'
d0`defineminus3'
d1`defineband3'
d2
`definebor3'
d3
`defineunegate3'
d4
modulealu(out,opcode,a,b);
output[7:
0]out;
reg[7:
input[2:
0]opcode;
input[7:
0]a,b;
//操作数。
always@(opcodeoraorb)//电平敏感的always块
begin
case(opcode)
`plus:
out=a+b;
//加操作。
`minus:
out=a-b;
//减操作。
`band:
out=a&
b;
//求与。
`bor:
out=a|b;
//求或。
`unegate:
out=~a;
//求反。
default:
out=8'
hx;
//未收到指令时,输出任意态。
endcase
end
//-----------指令译码器的测试模块源代码:
--------------
//-------------alutest.v-----------------
`timescale1ns/1ns
./alu.v"
modulealutest;
wire[7:
reg[7:
reg[2:
parametertimes=5;
a={$random}%256;
//Givearadomnumberblongsto[0,255].
b={$random}%256;
//Givearadomnumberblongsto[0,255].
opcode=3'
h0;
repeat(times)
#100a={$random}%256;
//Givearadomnumber.
opcode=opcode+1;
alualu1(out,opcode,a,b);
练习六.在VerilogHDL中使用函数
//---------------模块源代码:
---------------
//-----------文件名tryfunct.v--------------------
moduletryfunct(clk,n,result,reset);
output[31:
0]result;
input[3:
0]n;
inputreset,clk;
reg[31:
always@(posedgeclk)//clk的上沿触发同步运算。
if(!
reset)//reset为低时复位。
result<
=0;
else
begin
result<
=n*factorial(n)/((n*2)+1);
end//verilog在整数除法运算结果中不考虑余数
end
function[31:
0]factorial;
//函数定义,返回的是一个32位的数
0]operand;
//输入只有一个四位的操作数
0]index;
//函数内部计数用中间变量
factorial=operand?
//先定义操作数为零时函数的输出为零,不为零时为1
for(index=2;
index<
=operand;
index=index+1)
factorial=index*factorial;
//表示阶乘的算术迭代运算
endfunction
//--------------测试模块源代码:
------------------
./tryfunct.v"
moduletryfuctTop;
reg[3:
0]n,i;
regreset,clk;
wire[31:
clk=0;
n=0;
reset=1;
#100reset=0;
//产生复位信号的负跳沿
#100reset=1;
//复位信号恢复高电平后才开始输入n
for(i=0;
i<
=15;
i=i+1)
#200n=i;
always#`clk_cycleclk=~clk;
tryfunctm(.clk(clk),.n(n),.result(result),.reset(reset));
练习七.在VerilogHDL中使用任务(task)
----------------
//-----------------文件名sort4.v------------------
modulesort4(ra,rb,rc,rd,a,b,c,d);
output[3:
0]ra,rb,rc,rd;
0]a,b,c,d;
reg[3:
0]va,vb,vc,vd;
always@(aorborcord)
{va,vb,vc,vd}={a,b,c,d};
sort2(va,vc);
//va与vc互换。
sort2(vb,vd);
//vb与vd互换。
sort2(va,vb);
//va与vb互换。
sort2(vc,vd);
//vc与vd互换。
sort2(vb,vc);
//vb与vc互换。
{ra,rb,rc,rd}={va,vb,vc,vd};
tasksort2;
inout[3:
0]x,y;
0]tmp;
if(x>
y)
tmp=x;
//x与y变量的内容互换,要求顺序执行,所以采用阻塞赋值方式。
x=y;
y=tmp;
endtask
//---------测试模块源代码:
sort4.v"
moduletask_Top;
wire[3:
b=0;
c=0;
d=0;
repeat(50)
begin
#100a={$random}%15;
b={$random}%15;
c={$random}%15;
d={$random}%15;
end
sort4sort4(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd));
练习八.利用有限状态机进行时序逻辑的设计
//-------------模块源代码:
//----------------文件名seqdet.v-----------------
moduleseqdet(x,z,clk,rst,state);
inputx,clk,rst;
outputz;
output[2:
0]state;
reg[2:
wirez;
parameterIDLE='
d0,A='
d1,B='
d2,
C='
d3,D='
d4,
E='
d5,F='
d6,
G='
d7;
assignz=(state==E&
&
x==0)?
//当x序列10010最后一个0刚到时刻,时钟沿立刻将状态变为E,此时z应该变为高
always@(posedgeclk)
rst)
state<
=IDLE;
casex(state)
IDLE:
if(x==1)//第一个码位对,记状态A
=A;
A:
if(x==0)//第二个码位对,记状态B
=B;
B:
if(x==0)//第三个码位对,记状态C
=C;
else//第三个码位不对,前功尽弃,记状态为F
=F;
C:
if(x==1)//第四个码位对
=D;
else//第四个码位不对,前功尽弃,记状态为G
=G;
D:
if(x==0)//第五个码位对,记状态E
=E;
//此时开始应有z的输出
//第五个码位不对,前功尽弃,只有刚进入的1有用,回到第一个码位对状态,记状态A
E:
if(x==0)
//连着前面已经输入的x序列10010考虑,又输入了0码位可以认为第三个码位已对,记状态C
else//前功尽弃,只有刚输入的1码位对,记状态为A
F:
if(x==1)//只有刚输入的1码位对,记状态为A
else//又有1码位对,记状态为B
G:
state=IDLE;
//缺省状态为初始状态。
//-----------------测试模块源代码:
//---------------文件名seqdet.v-------------------
./seqdet.v"
moduleseqdet_Top;
regclk,rst;
reg[23:
0]data;
wire[2:
wirez,x;
assignx=data[23];
always#10clk=~clk;
data={data[22:
0],data[23]};
//形成数据向左移环行流,最高位与x连接
rst=1;
#2rst=0;
#30rst=1;
data='
b1100_1001_0000_1001_0100;
#500$stop;
seqdetm(x,z,clk,rst,state);
练习九.利用状态机实现比较复杂的接口设计
//---------模块源代码:
----------------------------
modulewriting(reset,clk,address,data,sda,ack
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 技术 verilog 语言 练习题
![提示](https://static.bdocx.com/images/bang_tan.gif)