北邮电子院专业实验报告_第1页
北邮电子院专业实验报告_第2页
北邮电子院专业实验报告_第3页
北邮电子院专业实验报告_第4页
北邮电子院专业实验报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ASIC专业实验报告班级 姓名 学号班内序号:第一部分 语言级仿真LAB 1:简单的组合逻辑设计实验目的掌握基本组合逻辑电路的实现方法。实验原理sel = 0 时,给出 out = a ,否则 assign 结构。 equal=(a=b)1:0 定义的 size 参数决定位宽。测试 观察模块的内部信号和输出信号。本实验中描述的是一个可综合的二选一开关,它的功能是当给出结果out = b。在Verilog HDL中,描述组合逻辑时常使用 是一种在组合逻辑实现分支判断时常用的格式。 parameter 模块用于检测模块设计的是否正确, 它给出模块的输入信号,源代码mux.v module scal

2、e_mux(out,sel,b,a);parameter size=1; outputsize-1:0 out; inputsize-1:0b,a;input sel;assign out = (!sel)a: (sel)b: size1'bx;endmodulemux_test.v 'defi ne width 8 'timescale 1 ns/1 ns module mux_test;reg'width:1a,b;wire'width:1out;reg sel;scale_mux#('width)m1(.out(out),.sel(sel)

3、,.b(b),.a(a);initialbegin$monitor($stime,"sel=%b a=%b b=%b out=%b",sel,a,b,out);$dumpvars(2,mux_test);sel=0;b='width1'b0;a='width1'b1;#5sel=0;b='width1'b1;a='width1'b0;#5sel=1;b='width1'b0;a='width1'b1;#5sel=1;b='width1'b1;a='widt

4、h1'b0;#5 $finish;endendmodule四、仿真结果与波形LAB 2:简单时序逻辑电路的设计实验目的掌握基本时序逻辑电路的实现。实验原理在 Verilog HDL 中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。在可综合的Verilog HDL 模型中,我们常使用always 块和(posedge elk)或(门egedge elk)的结构来表述时序逻辑。在 always 块中,被赋值的信号都必须定义为 reg 型,这是由时序逻辑电路的特点所决定的对 于 reg 型数据, 如果未对它进行赋值,仿真工具会认为它是不定态。为了正确地观察到仿真结 果,在可综合的模块

5、中我们通常定义一个复位信号 rst- ,当它为低电平时对电路中的寄存器 进行复位。源代码eounter.v'timeseale 1 ns/100 psmodule eounter(ent,elk,data,rst_,load);output4:0ent ;input 4:0data;clk;rst_;load;4:0cnt;always(posedge clk or negedge rst_)if(!rst_)input input input reg#1.2 cnt<=0; else if(load) cnt<=#3 data; else cnt<=#4 cnt +

6、 1; endmodule counter_test.v'timescale 1 ns/1 ns module counter_test;wire4:0cnt;rst_; load; clk;reg 4:0data; reg regreg counter c1(.cnt (cnt),.clk (clk), .data(data), .rst_(rst_), .load(load);initial begin clk=0; forever begin #10 clk=1'b1; #10 clk=1'b0; endendinitialbegin $timeformat(-9

7、,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); endtask expect;input 4:0expects;if(cnt !=expects)begin$display("At time %t cnt is %b and should be %b", $time,cnt,expects);$display("TES

8、T FAILED");$finish;endendtask initialbegin(negedge clk)rst_,load,data=7'b0_X_XXXXX;(negedge clk)expect(5'h00);rst_,load,data=7'b1_1_11101;(negedge clk)expect(5'h1D);rst_,load,data=7'b1_0_11101;repeat(5)(negedge clk);expect(5'h02);rst_,load,data=7'b1_1_11111;(negedge

9、clk)expect(5'h1F);rst_,load,data=7'b0_X_XXXXX;(negedge clk)expect(5'h00);$display("TEST PASSED");$finish;endendmodule四、仿真结果与波形五、思考题该电路中, rst- 是同步还是异步清零端?在 counter.v 的 always 块中 reset 没有等时钟,而是直接清零。所以是异步清零端。LAB 3:简单时序逻辑电路的设计实验目的使用预定义的库元件来设计八位寄存器。实验原理八位寄存器中,每一位寄存器由一个二选一MU%口一个触发器df

10、fr组成,当load=1 ,装载数据;当 load=0 ,寄存器保持。 对于处理重复的电路,可用数组条用的方式, 使电路描述清晰、 简洁。源代码clock.v'timescale 1 ns /1 nsmodule clock(clk); reg clk; output clk;initial begin clk=0;forever begin #10 clk=1'b1; #10 clk=1'b0;endend endmodulemux及dffr模块调用代码 mux mux7(.out(n17),.sel(load),.b(data7),.a(out7);dffr dff

11、r7(.q(out7),.d(n17), .clk(clk), .rst_(rst_) );mux mux6 (.out(n16), .sel(load), .b(data6), .a(out6);dffr dffr6(.q(out6), .d(n16), .clk(clk), .rst_(rst_) );mux mux5 (.out(n15), .sel(load), .b(data5), .a(out5);dffr dffr5(.q(out5),.d(n15), .clk(clk), .rst_(rst_) );mux mux4 (.out(n14), .sel(load), .b(dat

12、a4), .a(out4) );dffr dffr4(.q(out4), .d(n14), .clk(clk), .rst_(rst_) );mux mux3 (.out(n13), .sel(load), .b(data3), .a(out3);dffr dffr3(.q(out3),.d(n13), .clk(clk), .rst_(rst_) );mux mux2(.out(n12), .sel(load), .b(data2), .a(out2);dffr dffr2 (.q(out2), .d(n12), .clk(clk), .rst_(rst_) );mux mux1(.out(

13、n11), .sel(load), .b(data1), .a(out1);dffr dffr1 (.q(out1), .d(n11), .clk(clk), .rst_(rst_) );mux mux0(.out(n10), .sel(load), .b(data0), .a(out0) );dffr dffr0 (.q(out0), .d(n10), .clk(clk), .rst_(rst_) );例化寄存器 register r1 ( .data(data), .out(out), .load(load), .clk(clk), .rst_(rst_);例化时钟 clock c1(.c

14、lk(clk) ); 添加检测信号 initialbegin $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四、仿真结果与波形LAB 4:用 always 块实现较复杂的组合逻辑电路实验目的掌握用 always 实现组合逻辑电路的方法;了解 assign 与 always 两种组合逻辑电路实现方法之间的区别。实验原理仅使用 assign

15、结构来实现组合逻辑电路, 在设计中会发现很多地方显得冗长且效率低下。 适当地使用 always 来设计组合逻辑,会更具实效。对输入本实验描述的是一个简单的 ALU指令译码电路的设计示例。它通过对指令的判断, 数据执行相应的操作,包括加、减、或和传数据,并且无论是指令作用的数据还是指令本身发 生变化,结果都要做出及时的反应。示例中使用了电平敏感的always 块,电平敏感的触发条件是指在 后括号内电平列表的任何一个电平发生变化就能触发always 块的动作,并且运用了 case 结构来进行分支判断。在always中适当运用default (在case结构中)和else (子ifelse结构中),

16、通常 可以综合为纯组合逻辑, 尽管被赋值的变量一定要定义为 reg 型。如果不使用 default 或 else 对缺省项进行说明,易产生意想不到的锁存器。源代码电路描述always(opcode or data or accum) beginif(accum=8'b00000000)#1.2 zero=1;else#1.2 zero=0; case(opcode) PASS0: #3.5 out =accum; PASS1: #3.5 out =accum;ADD: #3.5 out = data + accum;AND: #3.5 out =data&accum;XOR:

17、#3.5 out ndataaccum;PASSD: #3.5 out=data;PASS6:#3.5 out=accum;PASS7:#3.5 out=accum; default:#3.5 out=8'bx;endcaseend四、仿真结果与波形LAB 5:存储器电路的设计实验目的设计和测试存储器电路。实验原理本实验中,设计一个模块名为 mem勺存储器仿真模型, 该存储器具有双线数据总线及异步处理 功能。由于数据是双向的,所以要注意,对memory的读写在时序上要错开。源代码自行添加的代码assign data= (read)memoryaddr:8'hZ; always

18、(posedge write) beginmemoryaddr<=data7:0;end四、仿真结果与波形LAB 6:设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别实验目的明确掌握阻塞赋值与非阻塞赋值的概念和区别; 了解阻塞赋值的使用情况。实验原理在 always 块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为并发 执行的。实际时序逻辑设计中, 一般情况下非阻塞赋值语句被更多的使用, 有时为了在同一周 期实现相互关联的操作,也使用阻塞赋值语句。源代码blocking.v'timescale 1 n s/ 100 psmodule blocking(clk,a,

19、b,c); output3:0b,c;input 3:0a;input clk;reg 3:0b,c;always(posedge clk)beginb =a;c =b;$display("Blocking: a=%d,b=%d,c=%d.",a,b,c);endendmodulenon_blocking.v'timescale 1 ns/ 100 psmodule non_blocking(clk,a,b,c);output3:0 b,c;input3:0 a;input clk;reg 3:0b,c;always (posedge clk)beginb<=

20、a;c<=b;$display("Non_blocking:a=%d,b=%d,c=%d",a,b,c); endendmodulecompareTop.v'timescale 1 n s/ 100 psmodule compareTop;wire 3:0 b1,c1,b2,c2;reg3:0a;reg clk;initialbeginclk=0;forever #50 clk=clk;endinitial$dumpvars (2,compareTop);initialbegina=4'h3;$display("# 100 a =4'

21、h7;$display("# 100 a =4'hf;$display("# 100 a =4'ha;$display("# 100 a =4'h2;$display("# 100 $display("$finish;endnon_blocking nonblocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1);endmodule四、仿真结果与波形LAB 7:利用有限状态机进行复杂时序逻辑的设计实验目的掌握利用有限状态机 (FSM) 实现复杂时序逻辑的方法。实验原理CPU

22、可时进行控制器是CPU的控制核心,用于产生一系列的控制信号,启动或停止某些部件。 读指令,何时进行 RAM和I/O端口的读写操作等,都由控制器来控制。源代码补充代码nexstate<=state+1'h01;case(state)1:begin sel=1;rd=0;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 2:begin sel=1;rd=1;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 3:begin sel=1;rd=1;ld_ir

23、=1;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 4:begin sel=1;rd=1;ld_ir=1;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 5:begin sel=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;end6:begin sel=0;rd=alu_op;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;w

24、r=0;end7:begin sel=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;end0: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=

25、9;STO)wr=1;end/default:begin sel=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;endendcase endcontrol_test.v/* TEST BENCH FOR CONTROLLER * */'timescale 1 ns / 1 nsmodule control_test ; reg 8:0 response 0:127; reg 3:0 s

26、timulus 0:15; reg 2:0 opcode;clk; rst_;regregzero;reginteger i,j; reg(3*8):1 mnemonic;/ Instantiate controllercontrol c1( rdwr ld_irld_acld_pc inc_pc halt data_e sel , opcode zeroclk , rst_ );/ Define clock initial begin clk = 1 ; forever begin #10 clk = 0 ; #10 clk = 1 ;endend/ Generate mnemonic fo

27、r debugging purposes always ( opcode )begincase ( 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 : mne

28、monic = "STO" ;3'h7 : mnemonic = "JMP" ; default : mnemonic = "" ;endcase end / Monitor signals initial begin$timeformat ( -9, 1, " ns", 9 ) ; $display zero state" ) ;$display " ) ;( " time rdwr ld_ir ld_ac ld_pc inc_pc halt data_e sel opcod

29、e$shm_open ( "waves.shm" ) ; $shm_probe ( "A" ) ; $shm_probe ( c1.state ) ;end/ Apply stimulus initial begin$readmemb ( "stimulus.pat", stimulus ) ; rst_=1; ( negedge clk ) rst_ = 0 ; ( negedge clk ) rst_ = 1 ; for ( i=0; i<=15; i=i+1 ) ( posedge ld_ir ) ( negedge cl

30、k ) opcode, zero = stimulusi ; end/ Check response initial/begin$readmemb ( "response.pat", response ) ; ( posedge rst_ )for ( j=0; j<=127; j=j+1 ) ( negedge clk )begin$display("%t %b %b %b %b %b %b %b %b %b %b %b %b",$time,rd,wr,ld_ir,ld_ac,ld_pc,inc_pc,halt,data_e,sel,opcode

31、,zero,c1.state ) ; if ( rd,wr,ld_ir,ld_ac,ld_pc,inc_pc,halt,data_e,sel != responsej )begin : blkreg 8:0 r;r = responsej;$display ( "ERROR - response should be:" ) ;$display( "%t %b %b %b %b %b %b %b %b %b",$time,r8,r7,r6,r5,r4,r3,r2,r1,r0 ) ; $display ( "TEST FAILED" )

32、; $stop;$finish ;endend$display ( "TEST PASSED" ) ;$stop;$finish ;end endmodule四、仿真结果与波形LAB 8:通过模块间的调用实现自顶向下 CPU的是设计实验目的学习和使用层次化、结构化设计方法。实验原理Verilog HDL中,上层模块引用下层模块与 C语言中程序调用有些类似,被引用的子模块在综 合时作为其父模块的一部分被综合, 形成相应的电路结构。在进行模块实例引用时,必须注意 的是模块之间对应的端口,即子模块端口与父模块的内部信号必须是一一对应。源代码assembly codeCPUtest

33、1.dat00 111_11110/ 00 BEGIN:JMP TST_JMP00000000/01HLT/JMP did not work at all00000000/02HLT/JMP10111010/03JMP_OK:LDA DATA_100100000/04SKZ00000000/05HLT/SKZ or LDA did not work10111011/06LDA DATA_200100000/07SKZ11101010/08JMP SKZ_OKdid not load PC, it skipped/opcode_operand / addr / / 000_00000/09HLT

34、 /SKZ or LDA did not work110_11100/0A101_11010/0BSKZ_OK: STO TEMP /store non-zero value in TEMP LDA DATA_1110_11100/0CSTO TEMP /store zero value in TEMP101_11100/0DLDA TEMP001_00000/0ESKZ /check to see if STO worked000_00000/0FHLT /STO did not work100_11011/10XOR DATA_2001_00000/11SKZ/check to see i

35、f XOR worked111_10100/12JMP XOR_OK000_00000/13HLT/XOR did not work at all100_11011/14XOR_OK:XOR DATA_2001_00000/15SKZ000_00000/16HLT/XOR did not switch all bits000_00000/17END: HLT /CONGRATULATIONS- TEST1PASSED!111_00000/181A 00000000/ 1AJMP BEGIN /run test againDATA_1: /constant 00(hex)1E 111_00011

36、000_00000 / 1F/ 1ETST_JMP: JMP JMP_OK HLT/JMP is brokenCPUtest2.dat/opcode_operand / addr / / assembly code00 101_11011011_11100/ 00BEGIN: LDA DATA_2/01100_11011/02AND DATA_3XOR DATA_2001_00000/03SKZ000_00000/04HLT/AND doesn't work010_11010/05ADD DATA_1001_00000/06SKZ111_01001/07JMP ADD_OK000_00

37、000/08HLT/ADD doesn't work100_11100/09XOR DATA_3010_11010/0A110_11101/0BADD DATA_1 /FF plus 1 makes -1STO TEMP101_11010/0CLDA DATA_1010_11101/0D001_00000/0EADD TEMP /-1 plus 1 should make zero SKZ000_00000/0FHLT/ADD Doesn't work000_00000/10END: HLT/CONGRATULATIONS- TEST2PASSED!111_000001A 00

38、000001JMP BEGIN /run test again / 1A DATA_1: /constant 1(hex)00000000/1D TEMP:/11CPUtest3.datassembly code/opcode_operand / addr /111_00011 /0003 101_11011/ 03JMP LOOP /jump to the address of LOOP LOOP: LDA FN2 /load value in FN2 into accum110_11100/04STO TEMP /store accumulator in TEMP010_11010/05A

39、DDFN1 /add value in FN1 to accumulator110_11011/06STO FN2/store result in FN2101_11100/07LDA TEMP/load TEMP into the accumulator110_11010/08STO FN1/store accumulator in FN1100_11101/09001_00000/0AXOR LIMIT /compare accumulator to LIMIT SKZ/if accum = 0, skip to DONE111_00011/0B000_00000/0C101_11111/

40、0DJMP LOOP /jump to address of LOOP DONE: HLT/end of programAGAIN: LDA ONE110_11010/0ESTO FN1101_11110/0FLDA ZERO110_11011/10STO FN2111_00011/111A 00000001JMP LOOP /jump to address of LOOP FN1:/variable - stores 1st Fib. No.00000000/1BFN2:/variable - stores 2nd Fib. No.00000000/1CTEMP:/temporary var

41、iable00000000/1EZERO:/constant 000000001/1FONE:/constant 1/ 1A自己编写的 CPUtest ,实现乘法器CPUtest4.datassembly code/opcode_operand / addr /03 111_00100/ 03JMP LOOP /jump to the address of LOOP101_11011/04LOOP: LDA DATA2 /A=5010_11010/05ADD DATA1/A=5+5=10110_11011/06STO DATA2/DATA2=10101_11101/07LDA TIME/A=T

42、IME011_11111/08AND TIME/A =TIME010_11100/O9ADD TEMP/A=TIME+1110_11101/0ASTO TIME/TIME=TIME+1100_11110/0BXOR LIMIT /compare accumulator to LIMIT001_00000/0CSKZ/if accum = 0, skip to DONE111_00100/0DJMP LOOP/jump to address of LOOP000_00000/0E DONE: HLT/end of program1A 00000101/ 1Adata1:/5 variable - stores 1stFib. No.00000101/ 1Bdata2:1/5 variable - stores 2nd四、四、五、Fib. No.00000001/ 1CTEMP:/1/ 1/ 6temporary variable 00000001/ 1Dcon sta nt 144 - max valuetime:00000110/ 1E LIMIT:con sta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论