集成电路设计实验报告.docx

上传人:b****4 文档编号:11355917 上传时间:2023-05-31 格式:DOCX 页数:26 大小:20.96KB
下载 相关 举报
集成电路设计实验报告.docx_第1页
第1页 / 共26页
集成电路设计实验报告.docx_第2页
第2页 / 共26页
集成电路设计实验报告.docx_第3页
第3页 / 共26页
集成电路设计实验报告.docx_第4页
第4页 / 共26页
集成电路设计实验报告.docx_第5页
第5页 / 共26页
集成电路设计实验报告.docx_第6页
第6页 / 共26页
集成电路设计实验报告.docx_第7页
第7页 / 共26页
集成电路设计实验报告.docx_第8页
第8页 / 共26页
集成电路设计实验报告.docx_第9页
第9页 / 共26页
集成电路设计实验报告.docx_第10页
第10页 / 共26页
集成电路设计实验报告.docx_第11页
第11页 / 共26页
集成电路设计实验报告.docx_第12页
第12页 / 共26页
集成电路设计实验报告.docx_第13页
第13页 / 共26页
集成电路设计实验报告.docx_第14页
第14页 / 共26页
集成电路设计实验报告.docx_第15页
第15页 / 共26页
集成电路设计实验报告.docx_第16页
第16页 / 共26页
集成电路设计实验报告.docx_第17页
第17页 / 共26页
集成电路设计实验报告.docx_第18页
第18页 / 共26页
集成电路设计实验报告.docx_第19页
第19页 / 共26页
集成电路设计实验报告.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

集成电路设计实验报告.docx

《集成电路设计实验报告.docx》由会员分享,可在线阅读,更多相关《集成电路设计实验报告.docx(26页珍藏版)》请在冰点文库上搜索。

集成电路设计实验报告.docx

集成电路设计实验报告

 

集成电路设计实验报告

 

济南大学信息科学与工程学院

 

2013-02-26

 

实验一

简单的组合逻辑设计

实验内容:

组合逻辑设计与实现。

实验目的:

掌握基本组合逻辑的实现方法;

初步了解两种基本给合逻辑电路的生成方法;

学习测试模块的编写;

通过综合和布局布线了解不同层次仿真的物理意义。

实验要求:

学生自己动手编程实现。

实验方法:

利用Modsim实现程序的仿真。

实验过程:

简单的组合逻辑设计(参考程序)

//(方法一):

//---------------文件名compare.v-----------------

modulecompare(equal,a,b);

inputa,b;

outputequal;

assignequal=(a==b)?

1:

0;

//a等于b时,equal输出为1;a不等于b时,equal输出为0。

endmodule

//(方法二):

modulecompare(equal,a,b);

inputa,b;

outputequal;

regequal;

always@(aorb)

if(a==b)//a等于b时,equal输出为1;

equal=1;

else//a不等于b时,equal输出为0。

equal=0;//思考:

如果不写else部分会产生什么逻辑?

endmodule

//-------------------------------------------------------------

//----------测试模块源代码(方法之一):

`timescale1ns/1ns//定义时间单位。

`include"./compare.v"//包含模块文件。

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

//而需要从调试环境的菜单中键入有关模块文件的路径和名称

modulet;

rega,b;

wireequal;

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

begin

a=0;

b=0;

#100a=0;b=1;

#100a=1;b=1;

#100a=1;b=0;

#100a=0;b=0;

#100$stop;//系统任务,暂停仿真以便观察仿真波形。

end

comparem(.equal(equal),.a(a),.b(b));//调用被测试模块t.m

endmodule

 

//----------测试模块源代码(方法之二):

-------------------------

`timescale1ns/1ns//定义时间单位。

`include"./compare.v"//包含模块文件。

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

//而需要从调试环境的菜单中键入有关模块文件的路径和名称

modulet;

rega,b;

regclock;

wireequal;

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

begin

a=0;

b=0;

clock=0;//定义一个时钟变量

end

always#50clock=~clock;//产生周期性的时钟

always@(posedgeclock)//在每次时钟正跳变沿时刻产生不同的a和b

begin

a={$random}%2;//每次a是0还是1是随机的。

b={$random}%2;//每次b是0还是1是随机的。

end

initial

begin#100000$stop;end//系统任务,暂停仿真以便观察仿真波形。

comparem(.equal(equal),.a(a),.b(b));//调用被测试模块t.m

endmodule

实验结果:

学生归纳

 

实验二

简单分频时序逻辑电路的设计

实验内容:

时序逻辑电路的设计

实验目的:

掌握最基本的时序电路的实现方法;

学习时序电路测试模块的编写;

学习综合和不同层次的仿真。

实验方法:

利用Modsim和Quatus2实现程序的仿真。

实验过程:

简单分频时序逻辑电路的设计(参考程序):

//-------------------------文件名:

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;

end

endmodule

 

//----------测试模块的源代码:

------------------------

//-------------------文件名top.v-----------------------------

`timescale1ns/100ps

`defineclk_cycle50

moduletop;

regclk,reset;

wireclk_out;

always#`clk_cycleclk=~clk;//产生测试时钟

initial

begin

clk=0;

reset=1;

#10reset=0;

#110reset=1;

#100000$stop;

end

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

endmodule

实验结果:

(学生归纳)

 

实验三

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

实验内容:

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

实验目的:

掌握条件语句在简单时序模块设计中的使用;

学习在VerilogHDL模块中应用计数器;

学习测试模块的编写、综合和不同层次的仿真。

实验方法:

利用Quartus2实现综合和仿真。

实验过程:

利用条件语句实现计数分频时序电路(参考程序):

//--------------模块源代码:

-----------------------------

//---------------fdivision.v-----------------------------

modulefdivision(RESET,F10M,F500K);

inputF10M,RESET;

outputF500K;

regF500K;

reg[7:

0]j;

always@(posedgeF10M)

if(!

RESET)//低电平复位。

begin

F500K<=0;

j<=0;

end

else

begin

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

begin

j<=0;

F500K<=~F500K;

end

else

j<=j+1;

end

endmodule

 

//-------------测试模块源代码:

-------------------------

//---------------fdivision_Top.v------------------------

`timescale1ns/100ps

`defineclk_cycle50

moduledivision_Top;

regF10M,RESET;

wireF500K_clk;

always#`clk_cycleF10M_clk=~F10M_clk;

initial

begin

RESET=1;

F10M=0;

#100RESET=0;

#100RESET=1;

#10000$stop;

end

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

endmodule

 

实验结果:

(学生总结)

 

实验四

用always块实现较复杂的组合逻辑电路

实验内容:

用always块实现较复杂的组合逻辑电路。

实验目的:

掌握用always实现较大组合逻辑电路的方法;

进一步了解assign与always两种组合电路实现方法的区别与注意点;

学习测试模块中随机数的产生和应用;

学习综合不同层次的仿真,并比较结果。

实验方法:

利用Quartus2软件实再仿真。

实验过程:

用always块实现较复杂的组合逻辑电路(参考程序)

//---------------文件名alu.v--------------------------

`defineplus3'd0`defineminus3'd1`defineband3'd2

`definebor3'd3

`defineunegate3'd4

modulealu(out,opcode,a,b);

output[7:

0]out;

reg[7:

0]out;

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

endmodule

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

--------------

//-------------alutest.v-----------------

`timescale1ns/1ns

`include"./alu.v"

modulealutest;

wire[7:

0]out;

reg[7:

0]a,b;

reg[2:

0]opcode;

parametertimes=5;

initial

begin

a={$random}%256;//Givearadomnumberblongsto[0,255].

b={$random}%256;//Givearadomnumberblongsto[0,255].

opcode=3'h0;

repeat(times)

begin

#100a={$random}%256;//Givearadomnumber.

b={$random}%256;//Givearadomnumber.

opcode=opcode+1;

end

#100$stop;

end

alualu1(out,opcode,a,b);

endmodule

 

实验结果:

(学生总结)

 

实验五

在VerilogHDL中使用任务(Task)

实验内容:

在VerilogHDL中使用任务(Task)

实验目的:

掌握任务在VerilogHDL模块中的设计与应用;

学会在电平敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂的组合逻辑的高级方法。

实验方法:

结合Quartus2软件实现程序的验证。

实验过程:

在VerilogHDL中使用任务(task)(参考程序)

//--------------模块源代码:

----------------

//-----------------文件名sort4.v------------------

modulesort4(ra,rb,rc,rd,a,b,c,d);

output[3:

0]ra,rb,rc,rd;

input[3:

0]a,b,c,d;

reg[3:

0]ra,rb,rc,rd;

reg[3:

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);//va与vb互换。

sort2(vc,vd);//vc与vd互换。

sort2(vb,vc);//vb与vc互换。

{ra,rb,rc,rd}={va,vb,vc,vd};

end

tasksort2;

inout[3:

0]x,y;

reg[3:

0]tmp;

if(x>y)

begin

tmp=x;//x与y变量的内容互换,要求顺序执行,所以采用阻塞赋值方式。

x=y;

y=tmp;

end

endtask

endmodule

//---------测试模块源代码:

---------------

`timescale1ns/100ps

`include"sort4.v"

moduletask_Top;

reg[3:

0]a,b,c,d;

wire[3:

0]ra,rb,rc,rd;

initial

begin

a=0;b=0;c=0;d=0;

repeat(50)

begin

#100a={$random}%15;

b={$random}%15;

c={$random}%15;

d={$random}%15;

end

#100$stop;

end

sort4sort4(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd));

endmodule

实验结果:

(学生实验后总结)

 

实验六

利用状态机实现接口的设计

实验内容:

利用状态机实现接口的设计。

实验目的:

学习运用状态机控制的逻辑开关,设计出一个比较复杂的接口逻辑;

在复杂设计中使用任务结构,以提高程序的可读性;

加深对可综合风格模块的认识。

实验方法:

结合仿真软件实现对程序的检验。

实验过程:

利用状态机实现接口的设计。

(参考程序)

//---------模块源代码:

----------------------------

modulewriting(reset,clk,address,data,sda,ack);

inputreset,clk;

input[7:

0]data,address;

outputsda,ack; //sda负责串行数据输出;

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

reglink_write; //link_write 决定何时输出。

reg[3:

0]state; //主状态机的状态字。

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;

parameter

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

assignsda=link_write?

sh8out_buf[7]:

1'bz;

always@(posedgeclk)

begin

if(!

reset)//复位。

begin

link_write<=0;//挂起串行单总线

state<=idle;

finish_F<=0;//结束标志清零

sh8out_state<=idle;

ack<=0;

sh8out_buf<=0;

end

else

case(state)

idle:

begin

link_write<=0;//断开串行单总线

finish_F<=0;

sh8out_state<=idle;

ack<=0;

sh8out_buf<=address;//并行地址存入寄存器

state<=addr_write;//进入下一个状态

end

addr_write:

//地址的输入。

begin

if(finish_F==0)

beginshift8_out;end//地址的串行输出

else

begin

sh8out_state<=idle;

sh8out_buf<=data;//并行数据存入寄存器

state<=data_write;

finish_F<=0;

end

end

data_write:

//数据的写入。

begin

if(finish_F==0)

beginshift8_out;end//数据的串行输出

else

begin

link_write<=0;

state<=stop_ack;

finish_F<=0;

ack<=1;//向信号源发出应答。

end

end

stop_ack:

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

begin

ack<=0;

state<=idle;

end

endcase

end

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

begin

case(sh8out_state)

idle:

begin

link_write<=1;//连接串行单总线,立即输出地址或数据的最高位(MSB)

sh8out_state<=bit7;

end

bit7:

begin

link_write<=1;//连接串行单总线

sh8out_state<=bit6;

sh8out_buf<=sh8out_buf<<1;//输出地址或数据的次高位(bit6)

end

bit6:

begin

sh8out_state<=bit5;

sh8out_buf<=sh8out_buf<<1;

end

bit5:

begin

sh8out_state<=bit4;

sh8out_buf<=sh8out_buf<<1;

end

bit4:

begin

sh8out_state<=bit3;

sh8out_buf<=sh8out_buf<<1;

end

bit3:

begin

sh8out_state<=bit2;

sh8out_buf<=sh8out_buf<<1;

end

bit2:

begin

sh8out_state<=bit1;

sh8out_buf<=sh8out_buf<<1;

end

bit1:

begin

sh8out_state<=bit0;

sh8out_buf<=sh8out_buf<<1;//输出地址或数据的最低位(LSB)

end

bit0:

begin

link_write<=0;//挂起串行单总线

finish_F<=1;//建立结束标志

end

endcase

end

endtask

endmodule

//-------------测试模块源代码:

----------------

`timescale1ns/100ps

`defineclk_cycle50

modulewritingTop;

regreset,clk;

reg[7:

0]data,address;

wireack,sda;

always#`clk_cycleclk=~clk;

initial

begin

clk=0;

reset=1;

data=0;

address=0;

#(2*`clk_cycle)reset=0;

#(2*`clk_cycle)reset=1;

#(100*`clk_cycle)$stop;

end

always@(posedgeack)//接收到应答信号后,给出下一个处理对象。

begin

data=data+1;

address=address+1;

end

writingwriting(.reset(reset),.clk(clk),.data(data),

.address(address),.ack(ack),.sda(sda));

endmodule

实验结果:

(学生实验后总结)

 

实验七

Verilog中函数的应用设计

实验内容:

在VerilogHDL中使用函数。

实验目的:

了解函数的定义和在模块设计中的使用;

了解函数的可综合性问题;

了解许多综合器不能综合复杂的算术运算。

实验方法:

利用综合软件包实现对程序的综合。

实验过程:

在VerilogHDL中使用函数(参考程序)

//---------------模块源代码:

---------------

//-----------文件名tryfunct.v--------------------

moduletryfunct(clk,n,result,reset);

output[31:

0]result;

input[3:

0]n;

inputreset,clk;

reg[31:

0]result;

always@(posedgeclk)//clk的上沿触发同步运算。

begin

if(!

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2