北邮电子院专业实验报告.docx
- 文档编号:24229813
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:43
- 大小:1.85MB
北邮电子院专业实验报告.docx
《北邮电子院专业实验报告.docx》由会员分享,可在线阅读,更多相关《北邮电子院专业实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
北邮电子院专业实验报告
北邮电子院专业实验报告
电子工程学院
ASIC专业实验报告
班级:
姓名:
学号:
班内序号:
第一部分语言级仿真
LAB1:
简单的组合逻辑设计
一、实验目的
掌握基本组合逻辑电路的实现方法。
二、实验原理
本实验中描述的是一个可综合的二选一开关,它的功能是当sel=0时,给出out=a,否则给出结果out=b。
在VerilogHDL中,描述组合逻辑时常使用assign结构。
equal=(a==b)?
1:
0是一种在组合逻辑实现分支判断时常用的格式。
parameter定义的size参数决定位宽。
测试模块用于检测模块设计的是否正确,它给出模块的输入信号,观察模块的内部信号和输出信号。
三、源代码
mux.v
modulescale_mux(out,sel,b,a);
parametersize=1;
output[size-1:
0]out;
input[size-1:
0]b,a;
inputsel;
assignout=(!
sel)?
a:
(sel)?
b:
{size{1'bx}};
endmodule
mux_test.v
`definewidth8
`timescale1ns/1ns
modulemux_test;
reg[`width:
1]a,b;
wire[`width:
1]out;
regsel;
scale_mux#(`width)m1(.out(out),.sel(sel),.b(b),.a(a));
initial
begin
$monitor($stime,,"sel=%ba=%bb=%bout=%b",sel,a,b,out);
$dumpvars(2,mux_test);
sel=0;b={`width{1'b0}};a={`width{1'b1}};
#5sel=0;b={`width{1'b1}};a={`width{1'b0}};
#5sel=1;b={`width{1'b0}};a={`width{1'b1}};
#5sel=1;b={`width{1'b1}};a={`width{1'b0}};
#5$finish;
end
endmodule
四、仿真结果与波形
LAB2:
简单时序逻辑电路的设计
一、实验目的
掌握基本时序逻辑电路的实现。
二、实验原理
在VerilogHDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的VerilogHDL模型中,我们常使用always块和@(posedgeclk)或@(negedgeclk)的结构来表述时序逻辑。
在always块中,被赋值的信号都必须定义为reg型,这是由时序逻辑电路的特点所决定的对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态。
为了正确地观察到仿真结果,在可综合的模块中我们通常定义一个复位信号rst-,当它为低电平时对电路中的寄存器进行复位。
三、源代码
counter.v
`timescale1ns/100ps
modulecounter(cnt,clk,data,rst_,load);
output[4:
0]cnt;
input[4:
0]data;
inputclk;
inputrst_;
inputload;
reg[4:
0]cnt;
always@(posedgeclkornegedgerst_)
if(!
rst_)
#1.2cnt<=0;
else
if(load)
cnt<=#3data;
else
cnt<=#4cnt+1;
endmodule
counter_test.v
`timescale1ns/1ns
modulecounter_test;
wire[4:
0]cnt;
reg[4:
0]data;
regrst_;
regload;
regclk;
counterc1
(
.cnt(cnt),
.clk(clk),
.data(data),
.rst_(rst_),
.load(load)
);
initialbegin
clk=0;
foreverbegin
#10clk=1'b1;
#10clk=1'b0;
end
end
initial
begin
$timeformat(-9,1,"ns",9);
$monitor("time=%t,data=%h,clk=%b,rst_=%b,load=%b,cnt=%b",
$stime,data,clk,rst_,load,cnt);
$dumpvars(2,counter_test);
end
taskexpect;
input[4:
0]expects;
if(cnt!
==expects)begin
$display("Attime%tcntis%bandshouldbe%b",
$time,cnt,expects);
$display("TESTFAILED");
$finish;
end
endtask
initial
begin
@(negedgeclk)
{rst_,load,data}=7'b0_X_XXXXX;@(negedgeclk)expect(5'h00);
{rst_,load,data}=7'b1_1_11101;@(negedgeclk)expect(5'h1D);
{rst_,load,data}=7'b1_0_11101;
repeat(5)@(negedgeclk);
expect(5'h02);
{rst_,load,data}=7'b1_1_11111;@(negedgeclk)expect(5'h1F);
{rst_,load,data}=7'b0_X_XXXXX;@(negedgeclk)expect(5'h00);
$display("TESTPASSED");
$finish;
end
endmodule
四、仿真结果与波形
五、思考题
该电路中,rst-是同步还是异步清零端?
在counter.v的always块中reset没有等时钟,而是直接清零。
所以是异步清零端。
LAB3:
简单时序逻辑电路的设计
一、实验目的
使用预定义的库元件来设计八位寄存器。
二、实验原理
八位寄存器中,每一位寄存器由一个二选一MUX和一个触发器dffr组成,当load=1,装载数据;当load=0,寄存器保持。
对于处理重复的电路,可用数组条用的方式,使电路描述清晰、简洁。
三、源代码
clock.v
`timescale1ns/1ns
moduleclock(clk);
regclk;
outputclk;
initialbegin
clk=0;
foreverbegin
#10clk=1'b1;
#10clk=1'b0;
end
end
endmodule
mux及dffr模块调用代码
muxmux7
(.out(n1[7]),
.sel(load),
.b(data[7]),
.a(out[7])
);
dffrdffr7
(.q(out[7]),
.d(n1[7]),
.clk(clk),
.rst_(rst_)
);
muxmux6
(.out(n1[6]),
.sel(load),
.b(data[6]),
.a(out[6])
);
dffrdffr6
(.q(out[6]),
.d(n1[6]),
.clk(clk),
.rst_(rst_)
);
muxmux5
(.out(n1[5]),
.sel(load),
.b(data[5]),
.a(out[5])
);
dffrdffr5
(.q(out[5]),
.d(n1[5]),
.clk(clk),
.rst_(rst_)
);
muxmux4
(.out(n1[4]),
.sel(load),
.b(data[4]),
.a(out[4])
);
dffrdffr4
(.q(out[4]),
.d(n1[4]),
.clk(clk),
.rst_(rst_)
);
muxmux3
(.out(n1[3]),
.sel(load),
.b(data[3]),
.a(out[3])
);
dffrdffr3
(.q(out[3]),
.d(n1[3]),
.clk(clk),
.rst_(rst_)
);
muxmux2
(.out(n1[2]),
.sel(load),
.b(data[2]),
.a(out[2])
);
dffrdffr2
(.q(out[2]),
.d(n1[2]),
.clk(clk),
.rst_(rst_)
);
muxmux1
(.out(n1[1]),
.sel(load),
.b(data[1]),
.a(out[1])
);
dffrdffr1
(.q(out[1]),
.d(n1[1]),
.clk(clk),
.rst_(rst_)
);
muxmux0
(.out(n1[0]),
.sel(load),
.b(data[0]),
.a(out[0])
);
dffrdffr0
(.q(out[0]),
.d(n1[0]),
.clk(clk),
.rst_(rst_)
);
例化寄存器
registerr1
(
.data(data),
.out(out),
.load(load),
.clk(clk),
.rst_(rst_)
);
例化时钟
clockc1
(
.clk(clk)
);
添加检测信号
initial
begin
$timeformat(-9,1,"ns",9);
$monitor("time=%t,clk=%b,data=%h,load=%b,out=%h",
$stime,clk,data,load,out);
$dumpvars(2,register_test);
end
四、仿真结果与波形
LAB4:
用always块实现较复杂的组合逻辑电路
一、实验目的
掌握用always实现组合逻辑电路的方法;
了解assign与always两种组合逻辑电路实现方法之间的区别。
二、实验原理
仅使用assign结构来实现组合逻辑电路,在设计中会发现很多地方显得冗长且效率低下。
适当地使用always来设计组合逻辑,会更具实效。
本实验描述的是一个简单的ALU指令译码电路的设计示例。
它通过对指令的判断,对输入数据执行相应的操作,包括加、减、或和传数据,并且无论是指令作用的数据还是指令本身发生变化,结果都要做出及时的反应。
示例中使用了电平敏感的always块,电平敏感的触发条件是指在@后括号内电平列表的任何一个电平发生变化就能触发always块的动作,并且运用了case结构来进行分支判断。
在always中适当运用default(在case结构中)和else(子if…else结构中),通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为reg型。
如果不使用default或else对缺省项进行说明,易产生意想不到的锁存器。
三、源代码
电路描述
always@(opcodeordataoraccum)
begin
if(accum==8'b00000000)
#1.2zero=1;
else
#1.2zero=0;
case(opcode)
PASS0:
#3.5out=accum;
PASS1:
#3.5out=accum;
ADD:
#3.5out=data+accum;
AND:
#3.5out=data&accum;
XOR:
#3.5out=data^accum;
PASSD:
#3.5out=data;
PASS6:
#3.5out=accum;
PASS7:
#3.5out=accum;
default:
#3.5out=8'bx;
endcase
end
四、仿真结果与波形
LAB5:
存储器电路的设计
一、实验目的
设计和测试存储器电路。
二、实验原理
本实验中,设计一个模块名为mem的存储器仿真模型,该存储器具有双线数据总线及异步处理功能。
由于数据是双向的,所以要注意,对memory的读写在时序上要错开。
三、源代码
自行添加的代码
assigndata=(read)?
memory[addr]:
8'hZ;
always@(posedgewrite)
begin
memory[addr]<=data[7:
0];
end
四、仿真结果与波形
LAB6:
设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别
一、实验目的
明确掌握阻塞赋值与非阻塞赋值的概念和区别;
了解阻塞赋值的使用情况。
二、实验原理
在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为并发执行的。
实际时序逻辑设计中,一般情况下非阻塞赋值语句被更多的使用,有时为了在同一周期实现相互关联的操作,也使用阻塞赋值语句。
三、源代码
blocking.v
`timescale1ns/100ps
moduleblocking(clk,a,b,c);
output[3:
0]b,c;
input[3:
0]a;
inputclk;
reg[3:
0]b,c;
always@(posedgeclk)
begin
b=a;
c=b;
$display("Blocking:
a=%d,b=%d,c=%d.",a,b,c);
end
endmodule
non_blocking.v
`timescale1ns/100ps
modulenon_blocking(clk,a,b,c);
output[3:
0]b,c;
input[3:
0]a;
inputclk;
reg[3:
0]b,c;
always@(posedgeclk)
begin
b<=a;
c<=b;
$display("Non_blocking:
a=%d,b=%d,c=%d",a,b,c);
end
endmodule
compareTop.v
`timescale1ns/100ps
modulecompareTop;
wire[3:
0]b1,c1,b2,c2;
reg[3:
0]a;
regclk;
initial
begin
clk=0;
forever#50clk=~clk;
end
initial
$dumpvars(2,compareTop);
initial
begin
a=4'h3;
$display("_______________________________");
#100a=4'h7;
$display("_______________________________");
#100a=4'hf;
$display("_______________________________");
#100a=4'ha;
$display("_______________________________");
#100a=4'h2;
$display("_______________________________");
#100$display("_______________________________");
$finish;
end
non_blockingnonblocking(clk,a,b2,c2);
blockingblocking(clk,a,b1,c1);
endmodule
四、仿真结果与波形
LAB7:
利用有限状态机进行复杂时序逻辑的设计
一、实验目的
掌握利用有限状态机(FSM)实现复杂时序逻辑的方法。
二、实验原理
控制器是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。
CPU何时进行读指令,何时进行RAM和I/O端口的读写操作等,都由控制器来控制。
三、源代码
补充代码
nexstate<=state+1'h01;
case(state)
1:
beginsel=1;rd=0;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end
2:
beginsel=1;rd=1;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end
3:
beginsel=1;rd=1;ld_ir=1;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end
4:
beginsel=1;rd=1;ld_ir=1;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end
5:
beginsel=0;rd=0;ld_ir=0;inc_pc=1;ld_pc=0;data_e=0;ld_ac=0;wr=0;
if(opcode==`HLT)
halt=1;
end
6:
beginsel=0;rd=alu_op;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end
7:
beginsel=0;rd=alu_op;ld_ir=0;halt=0;data_e=!
alu_op;ld_ac=0;wr=0;
if(opcode==`SKZ)
inc_pc<=zero;
if(opcode==`JMP)
ld_pc=1;
end
0:
beginsel=0;rd=alu_op;ld_ir=0;halt=0;data_e=!
alu_op;ld_ac=alu_op;inc_pc=(opcode==`SKZ)&zero||(opcode==`JMP);
if(opcode==`JMP)
ld_pc=1;
if(opcode==`STO)
wr=1;
end
//default:
beginsel=1'bZ;rd=1'bZ;ld_ir=1'bZ;inc_pc=1'bZ;halt=1'bZ;ld_pc=1'bZ;data_e=1'bZ;ld_ac=1'bZ;wr=1'bZ;end
endcase
end
control_test.v
/*****************************
*TESTBENCHFORCONTROLLER*
*****************************/
`timescale1ns/1ns
modulecontrol_test;
reg[8:
0]response[0:
127];
reg[3:
0]stimulus[0:
15];
reg[2:
0]opcode;
regclk;
regrst_;
regzero;
integeri,j;
reg[(3*8):
1]mnemonic;
//Instantiatecontroller
controlc1
(
rd,
wr,
ld_ir,
ld_ac,
ld_pc,
inc_pc,
halt,
data_e,
sel,
opcode,
zero,
clk,
rst_
);
//Defineclock
initialbegin
clk=1;
foreverbegin
#10clk=0;
#10clk=1;
end
end
//Generatemnemonicfordebuggingpurposes
always@(opcode)
begin
case(opcode)
3'h0:
mnemonic="HLT";
3'h1:
mnemonic="SKZ";
3'h2:
mnemonic="ADD";
3'h3:
mnemonic="AND";
3'h4:
mnemonic="XOR";
3'h5:
mnemonic="LDA";
3'h6:
mnemonic="STO";
3'h7:
mnemonic="JMP";
default:
mnemonic="?
?
?
";
endcase
end
//Monitorsignals
initial
begin
$timeformat(-9,1,"ns",9);
$display("timerdwrld_irld_acld_pcinc_pchaltdata_eselopcodezerostate");
$display("--------------------------------------------------------------");
//$shm_open("waves.shm");
//$shm_probe("A");
//$shm_probe(c1.state);
end
//Applystimulus
initial
begin
$readmemb("stimulus.pat",stimulus);
rst_=1;
@(negedgeclk)rst_=0;
@(negedgeclk)rst_=1;
for(i=0;i<=15;i=i+1)
@(posedgeld_ir)
@(negedgeclk)
{opcode,zero}=stimulus[i];
end
//Checkresponse
initial
begin
$readmemb("response.pat",response);
@(posedgerst_)
for(j=0;j<=127;j=j+1)
@(negedgeclk)
begin
$display("%t%b%b%b%b%b%b%b%b%b%b%b%b",
$time,rd,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 邮电 专业 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)