电子技术实验大作业实验报告
1. 实验名称
四位二进制数的可控加法 / 减法
2. 设计思路
本作业主要完成的是四位二进制数的可控加法。实现了附加功能中的在四位数码管上显示和数值溢出的显示功能。
本作业主要由两个模块组成,一个是主程序模块,负责较简单的加法运算;另外一个是a_to_g子程序模块,输入一个4位二进制数字,用来把数字显示在数字管上。数值溢出则是看cout位是否为1,为1则溢出。
3. 程序代码
`timescale 1ns / 1ps
w(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;
》
end
end
num=2;
always @(*)
case(num)
0:dp_a_to_g=7'b0000001;
$
endmodule
endcase
1:dp_a_to_g=7'b1001111; 2:dp_a_to_g=7'b0110000;
default: dp_a_to_g=7'b1111111;
4.
<
5.
实验心得
让四位数码管循环显示时,如果设定的循环间隔太短,则因为毛刺等之类的原因,会使整个数码管亮起来,人眼只能看到四个八。而设定的频率太低的话,则无法造成人眼短暂停留视觉的效果,而是一个一个亮。选择正确的频率才能得到正确的结果。
做此次试验的最大心得就是编程序得走一步看一步,按模块功能一块一块做。做完一块,检查一块。之前一开始我选的题目是数字时钟,一鼓作气把功能大部分都写出来之后,发现了一堆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
因篇幅问题不能全部显示,请点此查看更多更全内容