EDA技术与verilog语言练习题Word下载.docx

上传人:b****5 文档编号:20974819 上传时间:2023-01-26 格式:DOCX 页数:20 大小:31.23KB
下载 相关 举报
EDA技术与verilog语言练习题Word下载.docx_第1页
第1页 / 共20页
EDA技术与verilog语言练习题Word下载.docx_第2页
第2页 / 共20页
EDA技术与verilog语言练习题Word下载.docx_第3页
第3页 / 共20页
EDA技术与verilog语言练习题Word下载.docx_第4页
第4页 / 共20页
EDA技术与verilog语言练习题Word下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

EDA技术与verilog语言练习题Word下载.docx

《EDA技术与verilog语言练习题Word下载.docx》由会员分享,可在线阅读,更多相关《EDA技术与verilog语言练习题Word下载.docx(20页珍藏版)》请在冰豆网上搜索。

EDA技术与verilog语言练习题Word下载.docx

在有的仿真调试环境中并不需要此语句。

regclock;

//initial常用于仿真时信号的给出。

clock=0;

//定义一个时钟变量

 

always#50clock=~clock;

//产生周期性的时钟

always@(posedgeclock)

〃在每次时钟正跳变沿时刻产生不同的a和b

begin

a={$random}%2;

〃每次a是0还是1是随机的。

b={$random}%2;

〃每次b是0还是1是随机的。

initial

begin#100000$stop;

end〃系统任务,暂停仿真以便观察仿真波形。

练习二.简单分频时序逻辑电路的设计

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;

end

//测试模块的源代码:

//文件名top.v'

timescale1ns/100ps'

defineclk_cycle50moduletop;

regclk,reset;

wireclk_out;

always#'

clk_cycleclk=~clk;

//产生测试时钟

clk=0;

reset=1;

#10reset=0;

#110reset=1;

#100000$stop;

half_clkm0(.reset(reset),.clk_in(clk),.clk_out(clk_out));

endmodule

练习三.利用条件语句实现计数分频时序电路

//模块源代码:

//fdivision.v

modulefdivision(RESET,F10M,F500K);

inputF10M,RESET;

outputF500K;

regF500K;

reg[7:

0]j;

always@(posedgeF10M)if(!

RESET)〃低电平复位。

F500K<

=0;

j<

else

if(j==19)//对计数器进行判断,以确定F500K信号是否反转。

=~F500K;

=j+1;

//测试模块源代码:

//fdivision_Top.v

timescale1ns/100ps

defineclk_cycle50

moduledivision_Top;

regF10M,RESET;

wireF500K_clk;

clk_cycleF10M_clk=~F10M_clk;

RESET=1;

F10M=0;

#100RESET=0;

#100RESET=1;

#10000$stop;

fdivisionfdivision(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk));

练习四.阻塞赋值与非阻塞赋值的区别

〃模块源代码:

-

//blocking.vmoduleblocking(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);

//non_blocking.v-

modulenon_blocking(clk,a,b,c);

always@(posedgeclk)begin

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;

$display(”"

);

#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块

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

//指令译码器的测试模块源代码:

//alutest.v'

./alu.v"

modulealutest;

wire[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.

b={$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的上沿触发同步运算。

reset)//reset为低时复位。

result<

=0;

result<

=n*factorial(n)/((n*2)+1);

end//verilog在整数除法运算结果中不考虑余数

//函数定义,返回的是一个32位的数

//输入只有一个四位的操作数

//函数内部计数用中间变量

//先定义操作数为零时函数的输岀为零,不为零时为

function[31:

0]factorial;

input[3:

0]operand;

reg[3:

0]index;

factorial=operand?

for(index=2;

index<

=operand;

index=index+1)factorial=index*factorial;

//表示阶乘的算术迭代运算

endfunctionendmodule

./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;

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;

0]va,vb,vc,vd;

always@(aorborcord)begin

{va,vb,vc,vd}={a,b,c,d};

sort2(va,vc);

//va

与vc互换。

sort2(vb,vd);

//vb

与vd互换。

sort2(va,vb);

与vb互换。

sort2(vc,vd);

//vc

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:

a=O;

b=O;

c=O;

d=O;

repeat(50)

#100a={$random}%15;

b={$random}%15;

c={$random}%15;

d={$random}%15;

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;

wirez;

A='

d1,B='

d2,

C='

d3,D='

E='

d5,F='

d6,

G='

d7;

parameterIDLE='

dO,assignz=(state==E&

&

x==0)?

//当x序列10010最后一个0刚到时刻,时钟沿立刻将状态变为E,此时z应该变为高

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==O)//第五个码位对,记状态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

inelude"

./seqdet.v"

moduleseqdet_Top;

regclk,rst;

reg[23:

0]data;

wire[2:

wire乙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);

inputreset,clk;

0]data,address;

outputsda,ack;

//sda负责串行数据输出;

//ack是一个对象操作完毕后,模块给出的应答信号reglink_write;

//link_write决定何时输出。

//主状态机的状态字。

reg[4:

0]sh8out_state;

//从状态机的状态字。

reg[7:

0]sh8out_buf;

//输入数据缓冲。

regfinish_F;

//用以判断是否处理完一个操作对象。

regack;

parameter

idle=0,addr_write=1,data_write=2,stop_ack=3;

bit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8;

assignsda=link_write?

sh8out_buf[7]:

1'

bz;

reset)〃复位。

link_write<

//挂起串行单总线

=idle;

finish_F<

//结束标志清零

sh8out_state<

=idle;

ack<

sh8out_buf<

case(state)

idle:

link_write<

〃断开串行单总线

=address;

〃并行地址存入寄存器state<

=addr_write;

//进入下一个状态

addr_write:

〃地址的输入。

if(finish_F==O)

beginshift8_out;

end//地址的串行输出

sh8out_state<

sh8out_buf<

=data;

〃并行数据存入寄存器state<

=data_write;

end//数据的串行输出

=stop_ack;

ack<

=1;

〃向信号源发出应答。

stop_ack:

//向信号源发出应答结束。

taskshift8_out;

//地址和数据的串行输出。

case(sh8out_state)

MSB)

link_write<

〃连接串行单总线,立即输出地址或数据的最高位(

=bit7;

bit7:

〃连接串行单总线

=bit6;

=sh8out_buf<

<

1;

〃输出地址或数据的次高位(bit6)end

bit6:

=bit5;

=sh8out_buf<

=bit4;

sh

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1