您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页电子技术实验大作业实验报告 上海交通大学

电子技术实验大作业实验报告 上海交通大学

来源:筏尚旅游网
电子技术实验大作业实验报告

1. 实验名称

四位二进制数的可控加法 / 减法

2. 设计思路

本作业主要完成的是四位二进制数的可控加法。实现了附加功能中的在四位数码管上显示和数值溢出的显示功能。

本作业主要由两个模块组成,一个是主程序模块,负责较简单的加法运算;另外一个是a_to_g子程序模块,输入一个4位二进制数字,用来把数字显示在数字管上。数值溢出则是看cout位是否为1,为1则溢出。

3. 程序代码

`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: //

// Create Date: 05:40:39 04/18/2014 // Design Name:

// Module Name: adder // Project Name: // Target Devices: // Tool versions: // Description: //

// Dependencies: //

// Revision:

// Revision 0.01 - File Created // Additional Comments: //

////////////////////////////////////////////////////////////////////////////////// module adder( input [3:0]sw1,sw2, //input button, input clk, output [6:0]dp_a_to_g, output [3:0]out0

); reg cout; reg [3:0]sum; always @(sw1 or sw2)begin {cout,sum}=sw1+sw2; end a_to_g ATOG(.sw(sum),.clk(clk),.dp_a_to_g(dp_a_to_g),.out0(out0),.cout(cout));

endmodule

module a_to_g( input [3:0]sw, input clk, input cout, output reg [6:0]dp_a_to_g, output reg [3:0]out0 ); integer num; integer s; integer i; initial begin i=0; end always @(posedge clk) begin i=i+1; if (i[16:14]>3) i=0; s=i[15:14]; if (~cout) begin case(s) 0:out0=4'b0111; 1:out0=4'b1011; 2:out0=4'b1101; 3:out0=4'b1110; endcase

case(s) 0:num=sw[0]; 1:num=sw[1]; 2:num=sw[2]; 3:num=sw[3]; endcase end else begin out0=4'b0000; num=2; end end

always @(*) case(num) 0:dp_a_to_g=7'b0000001; 1:dp_a_to_g=7'b1001111; 2:dp_a_to_g=7'b0110000; default: dp_a_to_g=7'b1111111; endcase

endmodule

4. 实验心得

让四位数码管循环显示时,如果设定的循环间隔太短,则因为毛刺等之类的原因,会使整个数码管亮起来,人眼只能看到四个八。而设定的频率太低的话,则无法造成人眼短暂停留视觉的效果,而是一个一个亮。选择正确的频率才能得到正确的结果。

做此次试验的最大心得就是编程序得走一步看一步,按模块功能一块一块做。做完一块,检查一块。之前一开始我选的题目是数字时钟,一鼓作气把功能大部分都写出来之后,发现了一堆bug,改了好几个小时都没有办法排除 ,只能重新做。很可惜浪费了时间。

第二个体会是感受到了高级语言和verilog这种硬件描述语言的差异所在。对于一般使用的高级语言来说,有成熟的封装和函数,以及各种各样的数据类型,使用起来比较容易上手。而对verilog来说,因为跟硬件更为靠近,很多时候不能光码代码,还得想想能否实验。而且各种规则也不尽相同,很容易做无用功。需要从低级到高级循序渐进

的学习,以为掌握一种语言就可以吃遍天下的想法是幼稚的。 学习路上没有捷径,今天在学习verilog的路上真可是又复习了一遍这个人生哲理了!

module adder(number1,number2,sum,overflow); input [3:0] number1; input [3:0] number2; output [3:0] sum; output overflow; wire c1,c2,c3;

assign sum[0]=number1[0] ^ number2[0]; assign c1 = number1[0] & number2[0];

assign sum[1]=number1[1]^number2[1]^c1;

assign c2 = (number1[1] & number2[1]) | (number1[1] & c1) | (number2[1] & c1);

assign sum[2]=number1[2]^number2[2]^c2;

assign c3 = (number1[2] & number2[2]) | (number1[2] & c2) | (number2[2] & c2);

assign sum[3]=number1[3]^number2[3]^c3;

assign overflow= (number1[3] & number2[3]) | (number1[3] & c3) | (number2[3] & c3); endmodule

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务