四位全加器实验Verilog

2019-04-22 16:34

实验四 四位全加器

一、实验目的

l. 用组合电路设计4位全加器。

2.了解Verilog HDL语言的行为描述的优点。 二、实验原理

4位全加器工作原理 1)全加器

除本位两个数相加外,还要加上从低位来的进位数,称为全加器。被加数Ai、加数Bi从低位向本位进位Ci-1作为电路的输入,全加和Si与向高位的进位Ci作为电路的输出。能实现全加运算功能的电路称为全加电路。全加器的逻辑功能真值表如表中所列。

2)1位全加器

一位全加器(FA)的逻辑表达式为:S=A⊕B⊕Cin;Co=AB+BCin+ACin 其中A,B为要相加的数,Cin为进位输入;S为和,Co是进位输出;

这两幅图略微有差别,但最后的结果是一样的。 3)4位全加器

4位全加器可看作4个1位全加器串行构成, 具体连接方法如下图所示:

采用Verilog HDL语言设计该4位全加器,通过主模块调用子模块(1位全加器)的方法来实现。

三、实验步骤

新建文件 定义模块,顶层模块与工程名字一致,不可有并列的顶层模块 每个模块中设置端口及内部变量,注意调用接口 子模块写好1位全加器 主模块中设定时钟上升沿控制计数(always) 全加输出 计数输出信号控制扬声器与数码管(case) 配置引脚,连接硬件,

编译后,把程序下载到硬件中运行输入不同的数值, 根据LED灯验证结果,输入clk信号,听不同数值控制的不同频率的扬声器声音

四、实验连线

K1-K4:14-11 K5-K8:18-15 L5-L8:7-10 VIJN:83 L4:6 4KHZ:80

五、心得体会

首先,实现这一段全加器代码并不难,但是由于困惑给的三个时钟输入,没有太懂意思,所以只写了全加器控制LED灯的代码;后来问清楚后,运行全加器代码,有错误,原来是建文件时用的是verilog hdl,我建的是其他类型的;后来还有错,原来是把冒号打成分号;编译成功后,LED不亮,后来发现是硬件老化,换了箱子。这一部分做好后,我准备把控制声音的加上去,本来准备再加一个模块,可是不能有两个顶层块,就对主模块做了补充,用case命令调用不同的状态,因为时间紧迫,所以代码写得比较简单,没有用经典的分频代码。这里附一小段,是我在研究分频控制时看懂的网上的经典分频代码,适合乐曲自动播放等高级的实现,仅供分享

assign preclk=(divider==16383)?1:0;//divider==16383,preclk=1 always @(posedge clk) //基频上升沿触发 begin

if(preclk) //preclk=1 divider=origin; else

divider=divider+1; end

always @(posedge preclk) //调整占空比 begin

speaker=~speaker; //2 分频产生方波信号 end

这部分实现了分频功能,其中origin+divider=16384=2^14,这个数根据自己的需要而定。

在这个过程中我明白了: 1)细心,每个步骤不能错;

2)出现问题要仔细排查,软硬件都要; 3)注意reg wire的设定; 4)学到了额外的扩展知识

六、代码分析:

module full_add1(SUM,C_OUT,A,B,C_IN);//一位全加器子模块 output SUM,C_OUT; input A,B,C_IN;

wire C1,C2,C3;

and (C1,A,B); //内部门实现 xor (C3,A,B);

and (C2,C3,C_IN); xor (SUM,C_IN,C3); xor (C_OUT,C1,C2); endmodule

module shiyan4(speaker,s,c_out,a,b,c_in,clk_4MHz,);//主模块 output [3:0]s; output c_out; output speaker; input clk_4MHz; input [3:0]a,b; input c_in; reg speaker; wire c1,c2,c3;

full_add1 f0(s[0],c1,a[0],b[0],c_in);//调用子模块(4个一位全加器) full_add1 f1(s[1],c2,a[1],b[1],c1); full_add1 f2(s[2],c3,a[2],b[2],c2); full_add1 f3(s[3],c_out,a[3],b[3],c3);

always @(posedge clk_4MHz) //时钟信号上升沿触发

if(c_out==1) //全加器部分进位输出为1的情况 case(s)

4'b0000: speaker=clk_4MHz; //全加器s为0扬声器输出的频率 4'b0001: speaker=clk_4MHz; //全加器s为1扬声器输出的频率 (同样目的,以下依次分成不同频率) 4'b0010: speaker=clk_4MHz; 4'b0011: speaker=clk_4MHz; 4'b0100: speaker=2*clk_4MHz; 4'b0101: speaker=2*clk_4MHz; 4'b0110: speaker=2*clk_4MHz; 4'b0111: speaker=2*clk_4MHz; 4'b1000: speaker=3*clk_4MHz; 4'b1001: speaker=3*clk_4MHz; 4'b1010: speaker=3*clk_4MHz; 4'b1011: speaker=3*clk_4MHz;

4'b1100: speaker=10*clk_4MHz; 4'b1101: speaker=10*clk_4MHz; 4'b1110: speaker=10*clk_4MHz; 4'b1111: speaker=10*clk_4MHz; endcase else

case(s) //全加器部分进位输出为1的情况 4'b0000: speaker=10000*clk_4MHz; 4'b0001: speaker=10000*clk_4MHz; 4'b0010: speaker=10000*clk_4MHz; 4'b0011: speaker=10000*clk_4MHz; 4'b0100: speaker=1000*clk_4MHz; 4'b0101: speaker=1000*clk_4MHz; 4'b0110: speaker=1000*clk_4MHz; 4'b0111: speaker=1000*clk_4MHz; 4'b1000: speaker=6000*clk_4MHz; 4'b1001: speaker=6000*clk_4MHz; 4'b1010: speaker=6000*clk_4MHz; 4'b1011: speaker=6000*clk_4MHz; 4'b1100: speaker=100*clk_4MHz; 4'b1101: speaker=100*clk_4MHz; 4'b1110: speaker=100*clk_4MHz; 4'b1111: speaker=100*clk_4MHz; endcase

endmodule


四位全加器实验Verilog.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:贵州大学2015-2016学年上学期公共课期末考试时间安排

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: