《数字系统设计技术》实验报告专业:电子信息技术(物联网)班级:物联网(1121)姓名:Erin 徐学号:1132106128实验一:一位全加器设计一、 实验目的熟悉QuartusII 软件的使用,学会用原理图输入法设计逻辑电路,进一步巩固全加器原理及其EDA 实现。
二、 一位全加器原理电路示意图如下所示:A 、B 、Sum 均为四位矢量信号。
Sum i =A i ⊕i i Co i =A i B i +(A i +B i )Ci i三、 设计过程与步骤在D 盘建立了一个EDA 文件夹,在EDA 里新建了本次试验的adder 文件夹,打开quartus 软件后在file 里面进入new project wizard ,输入D 盘EDA ,adder 的路径,取名。
后打开新建verilog hdl file ,编写程序,后运行。
成功之后,在打开新建,选择other files 中的vector waveform file 。
之后在当前界面双击,点击node finder 在list 里面选中输入和输出的对应符号,即:a ,b ,sum ,ci ,co 。
确定之后,修改输入的相应数值,进行仿真。
再自己计算验证仿真的正确性。
CoSum四、仿真结果五、实验总结在实验之前对这个quartus软件还不是很熟悉,在正式实验之前,摸索过怎么建立文件等等之后慢慢开始熟悉了的。
一开始的时候程序还不会编译,查找了数字电路书后,对全加器的原理进行了理解后再动手的。
在编写程序时参照了老师上课讲的题,运行之后有很多问题出现,比如第一行一直提示出错,后来经过琢磨发现是命名的问题。
运行好之后再进行仿真。
对输入的a,b,ci进行数据调整。
之后结果就有了。
总的来说这个过程还是比较简单的。
实验二:数值比较器设计一、 实验目的巩固QuartusII 软件的使用,熟悉Verilog HDL 程序结构,学会用文本输入法设计逻辑电路。
二、 数值比较器原理根据两位二进制数的大小得到对应的比较结果,其电路示意图及电路特性表为: 比较器电路示意图 比较器特性表三、 程序module compare(y,a,b); input[1:0]a,b; output y;assign y=(a==b)?1:0; endmodule四、 仿真结果五、实验总结这个实验比较简单,就进行了两位二进制数比较,关键语句就是其中的assign 语句。
在进行仿真时改变了一下其中的初始值,周期,使得a和b有相等和不等的时候,保存,运行出结果。
实验三:四选一数据选择器设计一、实验目的掌握Verilog语言中的case语句、if-else语句。
二、四选一数据选择器原理电路功能表及其电路图如下:电路功能表三、程序module sixuanyi(y,D0,D1,D2,D3,A1,A0);output y;input D0,D1,D2,D3,A1,A0;reg y;always@(A1 or A0 or D0 or D1 or D2 or D3 )begincase({A1,A0})2'b00:y=D0;2'b01:y=D1;2'b10:y=D2;2'b11:y=D3;default:y=1'bx;endcaseendendmodule四、仿真结果五、实验总结这个实验相比之前的实验复杂了一点,在设计程序时就遇到了很多问题,关于reg,always,还有case语句还不太熟悉,后来参照了之前课堂上老师讲述时做的笔记,再加以和同学讨论终于运行出来了。
在进行仿真时,我把A1排在A0之前,D0到D3按顺序排列,输出y放在最下,这样方便查看和检验。
我对照真值表,改变了输入变量A1,A0,D0到D3的初始值,周期,保存运行后得出了结果。
再根据真值表进行核对。
实验四:8/3优先编码器设计一、 实验目的掌握VerilogHDL 语言中的if 条件语句和always 模块的使用。
二、8/3优先编码器原理电路功能表及其电路图如下:电路功能表三、 程序module bianmaqi(s,i0,i1,i2,i3,i4,i5,i6,i7,y0,y1,y2); input s,i0,i1,i2,i3,i4,i5,i6,i7; output y0,y1,y2; reg[2:0]y;assign{y2,y1,y0}=y;always@(s or i0 or i1 or i2 or i3 or i4 or i5 or i6 or i7) beginif(s) y=3'b000;else if(!i7) y=3'b000; else if(!i6) y=3'b001; else if(!i5) y=3'b010; else if(!i4) y=3'b011; else if(!i3) y=3'b100; else if(!i2) y=3'b101; else if(!i1) y=3'b110; else if(!i0) y=3'b111; else y=3'b000; endI 0I 1I 2I 3I 4I 5I 6I 7Y 2Y 1Y 011111111111X X X X X X X 0000X X X X X X 01001X X X X X 011010X X X X 0111011X X X 01111100X X 011111101X 011111111001111111111输出I 3I 4I 5I 6I 7I 0I 1I 2012endmodule四、仿真结果五、实验总结在编程之前我参考了数字电路书,了解了8/3编码器的相关知识,再根据老师上课时记录的笔记进行编译,但是屡次失败,后来我换成了if-else的形式,根据真值表进行编译便成功了,我觉得最主要的还是写出真值表然后表达出来。
然后进行仿真,根据程序对i0到i7进行赋值,变得出了结果。
实验五:十六进制加/减可逆计数器设计一、实验目的练习时序逻辑电路的Verilog实现。
二、实验要求实现一个具有加减可逆计数功能的十六进制计数器,用一位控制信号,控制加/减两种计数模式。
三、程序module counter(rst,clk,q,m);input rst,clk,m;output[3:0] q;reg[3:0]q;always@(posedge clk)if(!rst)q<=0;else if(m==0)if(q==15)q<=0;else q<=q+1;else if(m==1)if(q==0)q<=15;else q<=q-1;endmodule四、仿真结果加法:减法:五、实验总结关于加减的程序老师在课上其实已经提到过很多了,定义好reg型变量q,运用always,if-else语句进行编译,整个过程基本上很顺利。
运行成功后进行仿真,要注意的是Rst不能为0,否则q都为0了,所以在m为1或0时rst都为1。
M 为0时做加法,m为1时做减法。
实验六:四位抢答器设计一、实验目的练习用QuartusII软件设计具有一定复杂度和实际意义的功能电路。
二、四位抢答器原理1.功能描述4人电子优先抢答器可同时供4位选手或者4个代表队参加比赛,分别用paler1、player2、player3、player4表示。
节目主持人设置一个复位按键clear,用来控制系统的清零,使编号数码管灯清零。
抢答器具有锁存和显示功能,能够显示那位选手获得抢答,并能够显示处理具体选手的号码,同时能够屏蔽别的选手再选择按钮信号。
在选手回答问题的时候给出时间限制,在规定时间到达时候报警,主持人然后按键清零,一次抢答结束。
2.设计思路与实现在本设计中,共四位选手,即四个输入信号,我们考虑到优先原则,所以引用一个标志状态变量,当这个标志变化为“1”的时候,说明有选手已经抢答,则对其它选手输入信号进行屏蔽,然后锁存这个选手的编号并显示。
设计中回答问题限制时间是99秒,采用两个数码管显示,计数采用BCD码输出。
三、程序module qiangdaqi(clk,clear,player,count_time,result,alert,flag);//四人抢答器设计input clk,clear;//clk用于计时,clear用于主持人将抢答器复位input[3:0] player;//四位选手output[7:0]count_time;//共8位宽度,驱动两个数码管,用于回答时间显示output[3:0] result;//用于抢答结果显示output alert;//计时结束报警,当为1的时候报警output flag;//其中有选手已经抢答就报警reg flag;//寄存器变量,留给任何一位获得抢答获胜者reg[7:0] count;//为了计时99秒,分两个数码管,reg[3:0] result;//显示哪位选手按键reg alert;assign count_time=count;//让计时显示always @(player or clear)//抢答器处理模块beginif(clear)beginif(!flag)//为了屏蔽其它的选手begincase(player)1:beginflag=1;result=4'b0001;//显示第一位选手获得抢答 end2:beginflag=1;result=4'b0010;//显示第二位选手获得抢答 end4:beginflag=1;result=4'b0011;//显示第三位选手获得抢答 end8:beginflag=1;result=4'b0100;//显示第四位选手获得抢答 enddefault:result=4'b0000;endcaseendendelsebeginflag=0;result=4'b0000;endendalways @(posedge clk)//回答时间计数beginif(flag)beginif(!alert)//防止在报警后再计数beginif(count>0)beginif(count[3:0]==0)//先考虑减到0没有?begincount[3:0]=4'b1001;//如果低位减到0,则置位成9 count[7:4]=count[7:4]-1;//如果减到零高位减一endelsecount[3:0]=count[3:0]-1;endelsebeginalert=1;//倒计时到0报警count=8'b10011001;endendendelsebeginalert=0;count=8'b10011001;endendendmodule四、仿真结果五、实验总结这个实验比较困难,程序是老师给的,我就进行了仿真。