西安邮电大学verilog课程实验报告院系:电子工程学院专业班级:电子10班学号:(17)姓名: 2222013年6月8 日实验一门级建模1.实验内容(1)使用nand门编写双输入端的与门,或门及非门my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真。
(2)本章中的一位全加器使用乘积项之和的形式可以表示为:Sum=a*b*c_in+a’b*c_in’+a’b’*c_in+a*b’*c_in’C_out=a*b+b*c_in+a*c_in其中a,b和c_in为输入,sum和c_out为输出;只使用与门、或门、非门实现一个一位全加器,写出Verilog描述,限制是每个门最多有四个输入端。
编写激励模块对功能进行检查,并对全部的输入组合进行测试。
2.实验目的(1)掌握门基本类型,并学习Verilog提供的门级原语(2)理解门的实例引用(3)熟悉门级建模的一般步骤(4)熟悉编程软件3.实验步骤(1)先根据题目要求构建my_or,my_and,my_not;其次根据所设计的门来设计my_xor,并且编写激励对所设计的进行验证实验代码及仿真激励代码如下module myxor(out,x,y);output out;input x,y;wire x,y;wire y0,y1,y2,y3;my_not mynot0(y0,x,1);my_not mynot1(y1,y,1);my_and myand0(y2,y,y0);my_and myand1(y3,y1,x);my_or myor0(out,y2,y3);endmodulemodule my_or(out,in0,in1);output out;input in0,in1;wire y0,y1;nand(y0,in0,1);nand(y1,in1,1);nand(out,y0,y1);endmodulemodule my_and(out,in0,in1);output out;input in0,in1;wire y0;nand(y0,in0,in1);nand(out,y0,1);endmodulemodule my_not(out,in0,);output out;input in0;nand (out,in0,1);endmodulemodule stimulus;reg in0,in1;wire OUT;myxor myxor1(OUT,in0,in1);initialbeginin0=0;in1=0;# 1 $display("in0=%b,in1=%b,OUT=%b\n",in0,in1,OUT); in0=0;in1=1;# 1 $display("in0=%b,in1=%b,OUT=%b\n",in0,in1,OUT); in0=1;in1=0;# 1 $display("in0=%b,in1=%b,OUT=%b\n",in0,in1,OUT); in0=1;in1=1;# 1 $display("in0=%b,in1=%b,OUT=%b\n",in0,in1,OUT); endendmodule其仿真结果及波形图如下:(2)实验二的代码如下module fulladd(sum,c_out,a,b,c_in);output sum,c_out;input a,b,c_in;wire y0,y1,y2,y3,y4,y5,y6,y7,y8,y9;not(y0,a);not(y1,b);not(y2,c_in);and (y3,a,b,c_in);and (y4,y0,b,y2);and (y5,y0,y1,c_in);and (y6,a,y2,y1);or(sum,y3,y4,y5,y6);and (y7,a,b);and (y8,b,c_in);and (y9,a,c_in);or(c_out,y7,y8,y9);endmodulemodule stimulus;reg in0,in1,in2;wire sum,c_out;fulladd fulladd1(sum,c_out,in0,in1,in2);initialbeginin0=0;in1=0;in2=0;# 1 $display("in0=%b in1=%b in2=%b sum=%b c_out=%b\n",in0,in1,in2,sum,c_out);in0=0;in1=0;in2=1;# 1 $display("in0=%b in1=%b in2=%b sum=%b c_out=%b\n",in0,in1,in2,sum,c_out);in0=0;in1=1;in2=0;# 1 $display("in0=%b in1=%b in2=%b sum=%b c_out=%b\n",in0,in1,in2,sum,c_out);in0=0;in1=1;in2=1;# 1 $display("in0=%b in1=%b in2=%b sum=%b c_out=%b\n",in0,in1,in2,sum,c_out);in0=1;in1=0;in2=0;# 1 $display("in0=%b in1=%b in2=%b sum=%b c_out=%b\n",in0,in1,in2,sum,c_out);in0=1;in1=0;in2=1;# 1 $display("in0=%b in1=%b in2=%b sum=%b c_out=%b\n",in0,in1,in2,sum,c_out);in0=1;in1=1;in2=0;# 1 $display("in0=%b in1=%b in2=%b sum=%b c_out=%b\n",in0,in1,in2,sum,c_out);in0=1;in1=1;in2=1;# 1 $display("in0=%b in1=%b in2=%b sum=%b c_out=%b\n",in0,in1,in2,sum,c_out);endendmodule仿真结果及波形如下:4.实验中遇到的问题及解决方法(1)因为是第一次做实验,所以首先得熟悉编程软件modesim的使用的过程中就出现了问题,简单的编程之后进行仿真的时候找不到work文件,最后发觉自己使用软件时出现了错误,在整个过程中要遵循以下流程:新建工程——新建Verilog文件——编程——保存——编译——仿真。
(2)端口定义的时候和后面实例化的过程端口顺序一定要一一对应5.心得体会在该实验中我第一次接触到了Verilog语言的应用,并且基本掌握了modesim的基本应用,第一次实验后,我发觉这样的实验是很重要的,这是课本知识和实际相结合的过程,所以这个非常具有使用价值,从正面来让我们了解和验证我们的思想是否正确。
同时将课本所学知识引用到实验中也用一定的差距,过程中一定要细心才能完成这些,是一种对课本知识的最直接的理解。
实验二数据流建模1.实验内容一个同步计数器可以使用JK触发器来设计。
设计一个同步计数器,其逻辑图和JK触发器的逻辑图已给,清零信号clear低电平有效,输入数据在时钟信号clock的上升沿被锁存,触发器在clock的下降沿输出;当count_enable信号为低电平时停止计数。
写出同步计数器的Verilog描述和激励模块,在激励模块中使用clear和count_enable对计数器进行测试,并显示输出数Q[3:0].2.实验目的(1) 学习连续赋值语句assign的使用,了解对于连续赋值语句的限制以及隐式连续赋值语句。
(2)掌握数据流结构对实际的数字电路建模。
3.实验步骤(1)实验代码如下module counter(Q,clear,clock,count_enable);output [3:0] Q;input clear,clock,count_enable;wire y0,y1,y2;assign y0=Q[0]&count_enable;assign y1=y0&Q[1];assign y2=y1&Q[2];JK_FF jk1(Q[0],clock,clear,count_enable,count_enable);JK_FF jk2(Q[1],clock,clear,y0,y0);JK_FF jk3(Q[2],clock,clear,y1,y1);JK_FF jk4(Q[3],clock,clear,y2,y2);endmodulemodule JK_FF(q,clock,clear,J,K);output q;input clock,clear,J,K;wire a,b,c,abar,ybar,y,d,cbar,qbar;assign cbar=~clock;assign a=~(qbar&J&clock&clear);assign b=~(clock&K&q);assign y=~(a&ybar);assign ybar=~(clear&y&b);assign c=~(y&cbar);assign d=~(cbar&ybar);assign q=~(c&qbar);assign qbar=~(q&clear&d);endmodule//`timescale 1ns/1psmodule stimulus;reg clock,clear,count_enable;wire [3:0] Q;initial$monitor($time,"Q=%bclear=%dclock=%dcount_enable=%d",Q[3:0],clear,clock,count_enable); counter c1(Q,clear,clock,count_enable);initialbeginclear=1'b0;#5 clear=1'b1;endinitialbegincount_enable=1'b1;endinitialbeginclock=1'b0;forever #5 clock=~clock;endendmodule实验结果及波形:4.实验中遇到的问题及解决方法(1)连续赋值语句的左值必须是一个标量或向量线网,或者是标量或向量线网的并接,而不能是向量或向量寄存器。