集成电路设计实验报告.docx
- 文档编号:24696260
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:26
- 大小:20.96KB
集成电路设计实验报告.docx
《集成电路设计实验报告.docx》由会员分享,可在线阅读,更多相关《集成电路设计实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
集成电路设计实验报告
集成电路设计实验报告
济南大学信息科学与工程学院
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(!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集成电路设计 实验 报告