北航电子电路设计训练数字部分实验报告.doc_第1页
北航电子电路设计训练数字部分实验报告.doc_第2页
北航电子电路设计训练数字部分实验报告.doc_第3页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

2014-2015-2-G02A3050-1电子电路设计训练(数字EDA部分)实验报告( 2015 年 6月 24 日)仪器科学与光电工程学院目 录目 录1实验一、简单组合逻辑和简单时序逻辑31.1 实验任务1简单组合逻辑31.1.1 实验要求31.1.2 模块的核心逻辑设计31.1.3 测试程序的核心逻辑设计41.1.4 仿真实验关键结果及其解释41.2 实验任务2简单时序逻辑51.2.1 实验要求51.2.2 模块的核心逻辑设计51.2.3 测试程序的核心逻辑设计51.2.4 仿真实验关键结果及其解释61.3 实验小结6实验二、条件语句和always过程块72.1 实验任务1条件语句实现计数分频时序电路72.1.1 实验要求72.1.2 模块的核心逻辑设计72.1.3 测试程序的核心逻辑设计82.1.4 仿真实验关键结果及其解释82.2 实验任务2always块实现较复杂的组合逻辑电路92.2.1 实验要求92.2.2 模块的核心逻辑设计92.2.3 测试程序的核心逻辑设计102.2.4 仿真实验关键结果及其解释102.3 实验小结11实验三、赋值、函数和任务123.1 实验任务1阻塞赋值与非阻塞赋值的区别123.1.1 实验要求123.1.2 模块的核心逻辑设计123.1.3 测试程序的核心逻辑设计133.1.4 仿真实验关键结果及其解释133.2 实验任务2在Verilog HDL中使用函数143.2.1 实验要求143.2.2 模块的核心逻辑设计143.2.3 测试程序的核心逻辑设计153.2.4 仿真实验关键结果及其解释163.3 实验任务3在Verilog HDL中使用任务(task)173.3.1 实验要求173.3.2 模块的核心逻辑设计173.3.3 测试程序的核心逻辑设计183.3.4 仿真实验关键结果及其解释18实验四、有限状态机194.1 实验任务1利用有限状态机进行时序逻辑的设计194.1.1 实验要求194.1.2 模块的核心逻辑设计194.1.3 测试程序的核心逻辑设计204.1.4 仿真实验关键结果及其解释204.2 实验任务2串行数据采样器214.2.1 实验要求214.2.2 模块的核心逻辑设计214.2.3 测试程序的核心逻辑设计234.2.4 仿真实验关键结果及其解释254.3 实验小结262北京航空航天大学 电子电路设计训练(数字EDA部分)实验报告实验一、简单组合逻辑和简单时序逻辑1.1 实验任务1简单组合逻辑1.1.1 实验要求实验代码提供的是一个可综合的数据比较器。从语句中可以看出是比较数据a,b的结果,结果相同输出1,否则输出0.测试模块用于检测模块设计是否正确,给出输入信号,观察模块的内部信号和输出信号以确定设计是否正确。练习题:设计一个字节(8位)的比较器,比较两个字节的大小,如a7:0大于b7:0则输出高电平,否则输出低电平。1.1.2 模块的核心逻辑设计4/compare.v第一种实现方式:assignmodule compare(equal,a,b); input a,b; /a、b为输入 output equal; /equal为输出 assign equal=(a=b)?1:0; /a=b时输出为1,否则输出为0endmodule/compare.v第二种实现方式:alwaysmodule compare(equal,a,b); input a,b; output equal; reg equal; always (a or b) /a或b的值发生变化时执行判断 if(a=b) equal=1; else equal=0;endmodule/练习题compare_8.v:module compare_8(a,b,out);/与练习一的不同只在于a、b要定义为8位 input7:0 a; input7:0 b; output out; reg out; always (a or b) begin if(ab) out=1; else out=0; endendmodule1.1.3 测试程序的核心逻辑设计/compare_test.vtimescale 1ns/1ns /仿真时间及步长设置initial begin a=0; b=0; /a、b都初始化为0 #100 a=0;b=1; #100 a=1;b=1; #100 a=1;b=0; #100 a=0;b=0; /用所有可能情况赋值测试 #100 $stop; end compare m(.equal(equal),.a(a),.b(b); /compare模块实例化/compare_8_test.vinitial /变量初始化 begin a=0; b=0; clock=0; end always #50 clock=clock;/ 产生周期为100ns时钟信号 always(posedge clock) /每次时钟上升沿到来,用随机数给a、b赋值,观察输出的变化 begin/ a=$random%8; b=$random%8;/产生8位随机二进制数字 end北京航空航天大学 电子电路设计训练(数字EDA部分)实验报告1.1.4 仿真实验关键结果及其解释练习一的仿真结果如图 1所示。可以看到,随着a和b的值变化,输出值按照要求变化,并且在功能仿真中没有延迟,同步变化。图 1 练习一仿真波形练习题的仿真结果如下图所示。可以看到,每次时钟上升沿到来时a、b的值发生变化,输出随之变化。图 2 练习题仿真结果1.2 实验任务2简单时序逻辑1.2.1 实验要求设计二分之一分频器的可综合模型。1.2.2 模块的核心逻辑设计always (posedge clk_in) begin if(! reset) /reset为同步复位输入端 clk_out=0; else clk_out=clk_out;/每次输入时钟的上升沿让输出时钟反转,实现二分频 end1.2.3 测试程序的核心逻辑设计define clk_cycle 50 /宏定义 always #clk_cycle clk=clk; /产生输入时钟 initial begin clk=0; reset=1; #10 reset=0; #110 reset=1; /将初始时的不定态进行复位,开始分频输出。 #100000 $stop; /停止仿真 end1.2.4 仿真实验关键结果及其解释仿真结果如下图所示。可以看到,输出时钟clk_out的周期是输入时钟clk的二倍,即实现了二分频。图 3 练习二仿真结果1.3 实验小结本次实验中,我们第一次学习使用Modelsim软件,对课上所学的Verilog语法进行了巩固和提高,参考书中给出的例子自己进行了基本组合电路和时序电路的设计,也学会了编写简单的测试模块对系统进行较为全面的测试。实验二、条件语句和always过程块2.1 实验任务1条件语句实现计数分频时序电路2.1.1 实验要求通过定义计数器,利用条件语句,获得一个1/20分频器,将10MHz的时钟分频为500KHz。练习题:利用10MHz的时钟设计一个单周期形状的周期波形。2.1.2 模块的核心逻辑设计16/练习三fdivision.v:always(posedge F10M) if(!reset) /同步复位端 begin F500K=0; j=0; end else begin if(j=9)/*用j实现计数,从0开始每个时钟上升沿自增1,增加到9后输出反转,实现20分频。这里书中是增加到19后反转,这样得到的信号周期是原信号的1/40,并不是1/20,故在实验中进行了修改*/ begin j=0; F500K=F500K; end else j=j+1; end/练习题:wave.valways(posedge F10M) if(!reset) begin outwave=0; j=0; end else begin if(j=200) begin /从0开始累加到200后输出置1 j=j+1; outwave=1; end else if(j=300) begin/累加到300时输出置0 j=j+1; outwave=0; end else if(j=500) begin/累加到500时,完成一个周期,计数器清零 j=0; outwave=0; end else j=j+1; end2.1.3 测试程序的核心逻辑设计/fdivision_test.v always #clk F10M=F10M; /产生输入时钟信号 initial begin reset=1; F10M=0; #100 reset=0; #100 reset=1; #10000 $stop; endfdivision fdivision(.reset(reset),.F10M(F10M),.F500K(F500K); /模块实例化/wave_test.valways #clk F10M=F10M; /产生输入时钟 initial begin reset=1; F10M=0; #100 reset=0; #100 reset=1; #1000000 $stop; end 2.1.4 仿真实验关键结果及其解释练习三的仿真结果如下图所示。可以看到,输出时钟F500K的周期是输入F10M的1/20,符合题目要求,说明对书中代码的修改是正确的。图 4 练习三仿真结果练习题的功能仿真结果如下图所示。可以看到,最终输出的波形周期为50us,符合题目要求。图 5 练习题仿真结果2.2 实验任务2always块实现较复杂的组合逻辑电路2.2.1 实验要求设计一个简单的指令译码电路。通过判断指令,对输入数据执行相应的操作,包括加减与或求反,需要做出及时的反应。练习题:运用always块设计一个8路数据选择器。2.2.2 模块的核心逻辑设计/练习五:alu.vdefine plus 3d0define minus 3d1define band 3d2define bor 3d3define unegate 3d4 /宏定义不同的操作方式always(opcode or a or b) begin case(opcode) /判断操作方式,对操作数a、b进行相应的操作 plus:out=a+b; minus:out=a-b; band:out=ab; bor:out=a|b; unegate:out=a; default:out=8hx; endcase end/练习题:mux_8.valways (addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in0 or ncs) /in0至in7为8个数据输入端,三维寄存器addr为选择输入,用case分支完成选择 beginif(!ncs) case(addr)3b000: mout = in0; 3b001: mout = in1; 3b010: mout = in2; 3b011: mout = in3; 3b100: mout = in4; 3b101: mout = in5; 3b110: mout = in6; 3b111: mout = in7; endcaseelsemout = 0; end2.2.3 测试程序的核心逻辑设计/alu_test.vparameter t=5; initial begin a=$random%256; b=$random%256; opcode=3h0; repeat(t) begin #100 a=$random%256; b=$random%256;/给a、b随机赋值 opcode=opcode+1; end #100 $stop; end/mux_8_test.vinitial begin ncs=0; in0=$random%16; in7=$random%16; addr=3b000; repeat(9) /用随机数每次给数据输入端赋不同的值,观察输出结果 begin#10 in0=$random%16; in7=$random%16; addr=addr+1; end #10 $stop; end2.2.4 仿真实验关键结果及其解释练习五仿真结果如下图所示,可以看到操作数取0、1、2、3、4时,分别完成了加、减、与、或、求反操作。图 6 练习五仿真结果练习题仿真结果如下图所示。从图中看出,addr取不同值时,输出mout分别等于不同输入端的值,说明仿真结果是正确的。图 7 练习题仿真结果2.3 实验小结本次实验中比第一次更为复杂,有更多需要自己编程实现的部分,并且书中也有一些错误的地方需要修改,因此我们使用Verilog进行开发的能力进一步增强,也学会了if、case条件分支的使用以及always块在较复杂的组合逻辑电路中的应用。实验三、赋值、函数和任务3.1 实验任务1阻塞赋值与非阻塞赋值的区别3.1.1 实验要求通过实验,掌握阻塞赋值和非阻塞赋值的区别,了解两者的不同使用场合。3.1.2 模块的核心逻辑设计/练习四blocking.vmodule blocking(clk,a,b,c); output3:0 b,c; input3:0 a; input clk; reg3:0b,c; always(posedge clk) begin b=a; c=b; $display(Blocking:a=%d,b=%d,c=%d.,a,b,c); endendmodule/练习四non_blocking.vmodule non_blocking(clk,a,b,c); output3:0 b,c; input3:0 a; input clk; reg3:0b,c; always(posedge clk) begin b=a; c=b; $display(Non_Blocking:a=%d,b=%d,c=%d.,a,b,c); end endmodule/练习四练习题blocking1.vmodule blocking1(clk,a,b,c); output3:0 b,c; input3:0 a; input clk; reg3:0b,c; always(posedge clk) begin c=b; b=a; $display(Blocking1:a=%d,b=%d,c=%d.,a,b,c); endendmodule/练习四练习题blocking2.vmodule blocking2(clk,a,b,c); output3:0 b,c; input3:0 a; input clk; reg3:0b,c; always(posedge clk) b=a; always(posedge clk) c=b;endmodule3.1.3 测试程序的核心逻辑设计/compare_Top.vtimescale 1ns/100psmodule compare_Top; wire3:0b1,c1,b2,c2,b3,c3,b4,c4; reg3:0a; reg clk; initial begin clk=0; forever #50 clk=clk; end initial begin a=4h3; $display(-); #100 a=4h7; $display(-); #100 a=4hf; $display(-); #100 a=4ha; $display(-); #100 a=4h2; $display(-); #100 $display(-); $stop; end non_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1); blocking1 blocking1(clk,a,b3,c3); blocking2 blocking2(clk,a,b4,c4);endmodule3.1.4 仿真实验关键结果及其解释图 8 练习四仿真结果 仿真图中a对应输入,b1、c1对应blocking.v的模块逻辑输出,b1=c1,可以看出在时序逻辑中使用阻塞赋值有可能会导致输出逻辑结果不正确。而在blocking1中,改变了两者的赋值顺序,就可以实现和non_blocking.v一样的效果。Blocking2.v中使用多个时钟,在无优化的仿真中,逻辑输出也有错误。3.2 实验任务2在Verilog HDL中使用函数3.2.1 实验要求利用一个函数调用的实例,采用同步时钟触发运算的执行,每个clk时钟周期前都会执行一次运算,并在测试模块中,通过调用系统任务$display及在时钟下降沿显示每次计算的结果。3.2.2 模块的核心逻辑设计/练习六tryfunct.vmodule tryfunct(clk,n,result,reset); output31:0 result; input3:0 n; input reset,clk; reg31:0 result; always (posedge clk) beginif(!resetmodule tryfunct(clk,n,result,reset); output31:0 result; input3:0 n; input reset,clk; reg31:0 result; always (posedge clk) begin if(!reset) result=0; else begin result=n*factorial(n)/(n*2)+1); end endfunction 31:0 factorial; input 3:0 operand; reg 3:0 index; begin factorial=operand?1:0; for(index=2;index=operand;index=index+1) factorial=index*factorial; end endfunctionendmodule ) result=0; else begin result=n*factorial(n)/(n*2)+1); end endfunction 31:0 factorial; input 3:0 operand; reg 3:0 index; begin factorial=operand?1:0; for(index=2;index=operand;index=index+1) factorial=index*factorial; end endfunctionendmodule/练习六练习题controlfunc.vmodule controlfunc(clk,n,result,reset,a);output7:0 result;input3:0 n;input1:0 a;input reset,clk;reg7:0 result;always (posedge clk or a)beginif(!reset) result=0;elsebegin case(a) 2b00: result=1; 2b01: result=factorial(n); 2b10: result=pf(n); 2b11: result=lf(n); endcase endendfunction 7:0 factorial;input 3:0 operand;reg 3:0 index;beginfactorial=(operand6 operand=0)?1:0;for(index=2;index=operand;index=index+1)factorial=index*factorial;endendfunction function 7:0pf; input 3:0 operand; reg 3:0 index; begin pf=operand*operand; endendfunction function 7:0lf; input 3:0 operand; reg 3:0 index; begin lf=operand*operand*operand; endendfunctionendmodule3.2.3 测试程序的核心逻辑设计/练习六tryfuctTop.vinclude./tryfunct.vtimescale 1ns/100psdefine clk_cycle 50module tryfuctTop; reg3:0 n,i; reg reset,clk; wire31:0 result; initial begin clk=0; n=0; reset=1; #100 reset=0; #100 reset=1; for(i=0;i=15;i=i+1) begin #200 n=i; end#100 $stop; endalways #clk_cycle clk=clk;tryfunct m(.clk(clk),.n(n),.result(result),.reset(reset);endmodule/练习六练习题test.vinclude./controlfunc.vtimescale 1us/1nsdefine clk_cycle 50module test;reg3:0 n;reg1:0 a;reg reset,clk;wire7:0 result;parameter t=16;initialbeginclk=0;n=0;reset=1;a=2b0;#10 reset=0;#50 reset=1;repeat(t)begin#200 a=$random%3;#200 n=$random%15;end#100 $stop;endalways #clk_cycle clk=clk;controlfunc m(.clk(clk),.n(n),.result(result),.reset(reset),.a(a);endmodule北京航空航天大学 电子电路设计训练(数字EDA部分)实验报告3.2.4 仿真实验关键结果及其解释/练习六仿真结果图 9 练习六仿真结果 仿真结果利用十进制表示,模块调用函数来完成输入值n的阶乘,之后输出n*n!/(n*2+1)的整数部分,机result值。/实验六练习题图 10 练习六练习题仿真结果 图中定义a为控制变量,a=1,表示求阶乘,a=2表示求平方,a=3表示求立方,其他输出结果为0。利用随机数产生输入值n,当n为负值时,输出为0。3.3 实验任务3在Verilog HDL中使用任务(task)3.3.1 实验要求利用always块和一个比较两变量大小排序的任务,设计出4个(4位)并行输入数的高速排列组合逻辑。3.3.2 模块的核心逻辑设计19module sort4(ra,rb,rc,rd,a,b,c,d); output3:0 ra,rb,rc,rd; input3:0 a,b,c,d; reg3:0 ra,rb,rc,rd; reg3:0 va,vb,vc,vd; always(a or b or c or d) begin va,vb,vc,vd=a,b,c,d; sort2(va,vc); sort2(vb,vd); sort2(vc,vd); sort2(vb,vc); ra,rb,rc,rd=va,vb,vc,vd; end task sort2; inout3:0 x,y; reg3:0 tmp; if(xy) begin tmp=x; x=y; y=tmp; end endtaskendmodule3.3.3 测试程序的核心逻辑设计timescale 1ns/100psinclude sort4.vmodule task_Top; reg3:0 a,b,c,d; wire3:0 ra,rb,rc,rd; initial begin a=0;b=0;c=0;d=0; repeat(50) begin #100 a=$random%15; b=$random%15; c=$random%15; d=$random%15; end #100 $stop; end sort4 sort4(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd);endmodule3.3.4 仿真实验关键结果及其解释图 11 练习七仿真结果 从实验仿真结果可以看出,利用task非常方便的实现两数据之间的交换排序,通过在电平敏感的always块中多次调用,实现4变量的高速排序,是用函数无法实现相同的功能。另外,task也避免了直接用一般语句来描述所引起的不易理解和综合时产生冗余逻辑的问题。实验四、有限状态机4.1 实验任务1利用有限状态机进行时序逻辑的设计4.1.1 实验要求设计一个串行数据检测器。要求是:连续4个或4个以上为1时输出为1,其他输入情况为0。编写测试模块对设计的模块进行各种层次的仿真,并观察波形。4.1.2 模块的核心逻辑设计module serial(x,result,clk,rst,state); input x,clk,rst; output result; output1:0 state; reg1:0 state; wire result; reg2:0 count; parameter IDLE=0, HEAD=1, TAIL=2; assign result=(state=TAIL)?1:0; always(posedge clk) if(!rst) begin state=IDLE; end else casex(state) IDLE:if(x=1) begin state=HEAD;count=1; end HEAD:if(x=1) begincount=count+1; if(count=4) beginstate=TAIL; end end else begin state=IDLE; count=0; end TAIL:if(x=0) begin state=IDLE; count=0; end default:state=IDLE; endcaseendmodul北京航空航天大学 电子电路设计训练(数字EDA部分)实验报告4.1.3 测试程序的核心逻辑设计25timescale 1ns/1nsinclude ./serial.vmodule serial_top; reg clk,rst; reg23:0 data; wire2:0 state; wire result,x; assign x=data23; always #10 clk=clk; always(negedge clk) data=data22:0,data23; initial begin clk=0; rst=1; #2 rst=0; #30 rst=1; data=b0011_1110_1101_1111_0000_0101_1111_1111; #10000 $stop; end serial serial(x,result,clk,rst,state);endmodule4.1.4 仿真实验关键结果及其解释仿真结果如图8所示。蓝框位置显示输出result为1 时,当输入x变为0 后输出也变为0.黄框位置显示当输入x连续4个1后,输出result变为1。图 12 练习八仿真结果4.2 实验任务2串行数据采样器4.2.1 实验要求对于输入的串行非归零码(NRZ)的串行数字矩形脉冲信号rxd采样。外部提供码元同步信号shift_strobe(移位触发)和采样脉冲串信号shift_bclk(移位位时钟)。其中, shift_strobe对应每个数据位码元起始时刻shift_bclk的周期为码元宽度的16分之一。为了抗干扰,在一个码元宽度内,shift_bclk的最前3个和最后2个采样值被忽略,取中间11个采样值作多数判决。判决结果打入移位寄存器,该寄存器具有并行输出端output 8:0 packet_raw_data。4.2.2 模块的核心逻辑设计module uart_rx_detector ( rst_n, rxd, shift_strobe, shift_bclk, packet_raw_data ); input rst_n; input rxd; input shift_strobe, shift_bclk; output 8:0 packet_raw_data; / 9-bit for the longest frame reg 8:0 packet_raw_data; parameter THRESHOLD_ONE = 6 ;parameter 1:0 S_IDLE = 2b00;parameter 1:0 S_HEAD = 2b01;parameter 1:0 S_BODY = 2b11;parameter 1:0 S_TAIL = 2b10;reg 3:0 dcnt ; reg 3:0 cnt ; reg1:0 state,nextstate;reg 3:01cnt;always(posedge shift_bclk) if(!rst_n)state=S_IDLE; else state=nextstate; always(state or posedge shift_bclk) case(state) S_IDLE:if(shift_strobe)begin nextstate=S_HEAD; 1cnt=0; cnt=1; end S_HEAD: begin cnt=cnt+1; if(cnt1)nextstate=S_BODY; end S_BODY: begin cnt=cnt+1; if(cnt13)nextstate=S_TAIL; end S_TAIL:nextstate=S_IDLE; default:nextstate=S_IDLE; endcase always(state or rst_n or cnt) if(!rst_n)packet_raw_data=9b0000_0000_0; else if(state=S_TAIL) begin if(1cnt=THRESHOLD_ONE)begin packet_raw_data=packet_raw_data1; packet_raw_data0=1; end else begin packet_raw_data=packet_raw_data1; packet_raw_data0=0; end end else if(state=S_BODY) 1cnt=1cnt+rxd; endmodule4.2.3 测试程序的核心逻辑设计timescale 10ns / 1nsinclude uart_rx_detector.vinclude uart_rx_timer.vinclude negedge_detector.vmodule tb_uart_rx_detector; reg high_freq_clk ; reg clk ; reg rst_n ; / controlled signal reg enable_n ; / controlled signal wire shift_strobe, shift_bclk, data_end ; wire data_end_

温馨提示

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

评论

0/150

提交评论