您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 北邮电子院专业实验报告
电子工程学院ASIC专业实验报告班级:姓名:学号:班内序号:第一部分语言级仿真LAB1:简单的组合逻辑设计一、实验目的掌握基本组合逻辑电路的实现方法。二、实验原理本实验中描述的是一个可综合的二选一开关,它的功能是当sel=0时,给出out=a,否则给出结果out=b。在VerilogHDL中,描述组合逻辑时常使用assign结构。equal=(a==b)?1:0是一种在组合逻辑实现分支判断时常用的格式。parameter定义的size参数决定位宽。测试模块用于检测模块设计的是否正确,它给出模块的输入信号,观察模块的内部信号和输出信号。三、源代码mux.vmodulescale_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}};endmodulemux_test.v`definewidth8`timescale1ns/1nsmodulemux_test;reg[`width:1]a,b;wire[`width:1]out;regsel;scale_mux#(`width)m1(.out(out),.sel(sel),.b(b),.a(a));initialbegin$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;endendmodule四、仿真结果与波形LAB2:简单时序逻辑电路的设计一、实验目的掌握基本时序逻辑电路的实现。二、实验原理在VerilogHDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。在可综合的VerilogHDL模型中,我们常使用always块和@(posedgeclk)或@(negedgeclk)的结构来表述时序逻辑。在always块中,被赋值的信号都必须定义为reg型,这是由时序逻辑电路的特点所决定的对于reg型数据,如果未对它进行赋值,仿真工具会认为它是不定态。为了正确地观察到仿真结果,在可综合的模块中我们通常定义一个复位信号rst-,当它为低电平时对电路中的寄存器进行复位。三、源代码counter.v`timescale1ns/100psmodulecounter(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;elseif(load)cnt=#3data;elsecnt=#4cnt+1;endmodulecounter_test.v`timescale1ns/1nsmodulecounter_test;wire[4:0]cnt;reg[4:0]data;regrst_;regload;regclk;counterc1(.cnt(cnt),.clk(clk),.data(data),.rst_(rst_),.load(load));initialbeginclk=0;foreverbegin#10clk=1'b1;#10clk=1'b0;endendinitialbegin$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);endtaskexpect;input[4:0]expects;if(cnt!==expects)begin$display(Attime%tcntis%bandshouldbe%b,$time,cnt,expects);$display(TESTFAILED);$finish;endendtaskinitialbegin@(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;endendmodule四、仿真结果与波形五、思考题该电路中,rst-是同步还是异步清零端?在counter.v的always块中reset没有等时钟,而是直接清零。所以是异步清零端。LAB3:简单时序逻辑电路的设计一、实验目的使用预定义的库元件来设计八位寄存器。二、实验原理八位寄存器中,每一位寄存器由一个二选一MUX和一个触发器dffr组成,当load=1,装载数据;当load=0,寄存器保持。对于处理重复的电路,可用数组条用的方式,使电路描述清晰、简洁。三、源代码clock.v`timescale1ns/1nsmoduleclock(clk);regclk;outputclk;initialbeginclk=0;foreverbegin#10clk=1'b1;#10clk=1'b0;endendendmodulemux及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));添加检测信号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四、仿真结果与波形LAB4:用always块实现较复杂的组合逻辑电路一、实验目的掌握用always实现组合逻辑电路的方法;了解assign与always两种组合逻辑电路实现方法之间的区别。二、实验原理仅使用assign结构来实现组合逻辑电路,在设计中会发现很多地方显得冗长且效率低下。适当地使用always来设计组合逻辑,会更具实效。本实验描述的是一个简单的ALU指令译码电路的设计示例。它通过对指令的判断,对输入数据执行相应的操作,包括加、减、或和传数据,并且无论是指令作用的数据还是指令本身发生变化,结果都要做出及时的反应。示例中使用了电平敏感的always块,电平敏感的触发条件是指在@后括号内电平列表的任何一个电平发生变化就能触发always块的动作,并且运用了case结构来进行分支判断。在always中适当运用default(在case结构中)和else(子if…else结构中),通常可以综合为纯组合逻辑,尽管被赋值的变量一定要定义为reg型。如果不使用default或else对缺省项进行说明,易产生意想不到的锁存器。三、源代码电路描述always@(opcodeordataoraccum)beginif(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;endcaseend四、仿真结果与波形LAB5:存储器电路的设计一、实验目的设计和测试存储器电路。二、实验原理本实验中,设计一个模块名为mem的存储器仿真模型,该存储器具有双线数据总线及异步处理功能。由于数据是双向的,所以要注意,对memory的读写在时序上要错开。三、源代码自行添加的代码assigndata=(read)?memory[addr]:8'hZ;always@(posedgewrite)beginmemory[addr]=data[7:0];end四、仿真结果与波形LAB6:设计时序逻辑时采用阻塞赋值与非阻塞赋值的区别一、实验目的明确掌握阻塞赋值与非阻塞赋值的概念和区别;了解阻塞赋值的使用情况。二、实验原理在always块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为并发执行的。实际时序逻辑设计中,一般情况下非阻塞赋值语句被更多的使用,有时为了在同一周期实现相互关联的操作,也使用阻塞赋值语句。三、源代码blocking.v`timescale1ns/100psmoduleblocking(clk,a,b,c);output[3:0]b,c;inp
本文标题:北邮电子院专业实验报告
链接地址:https://www.777doc.com/doc-4133128 .html