北邮电子院专业实验报告.docx

上传人:b****4 文档编号:24229813 上传时间:2023-05-25 格式:DOCX 页数:43 大小:1.85MB
下载 相关 举报
北邮电子院专业实验报告.docx_第1页
第1页 / 共43页
北邮电子院专业实验报告.docx_第2页
第2页 / 共43页
北邮电子院专业实验报告.docx_第3页
第3页 / 共43页
北邮电子院专业实验报告.docx_第4页
第4页 / 共43页
北邮电子院专业实验报告.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

北邮电子院专业实验报告.docx

《北邮电子院专业实验报告.docx》由会员分享,可在线阅读,更多相关《北邮电子院专业实验报告.docx(43页珍藏版)》请在冰豆网上搜索。

北邮电子院专业实验报告.docx

北邮电子院专业实验报告

北邮电子院专业实验报告

电子工程学院

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,

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

当前位置:首页 > 法律文书 > 判决书

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

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