fpga第一次作业

一、

1、基于Quartus件完成一个1位全加器的设计,分别采用:1)原理图输入 以及 2)Verilog编程 这两种设计方法。

2、在此基础上,用原理图以及Verilog 编程两种方式,完成4位全加器的设计,对比二者生成的 RTL差别;使用modelsim验证逻辑设计的正确性。

2、了解全加器:
1 1位全加器的真值表:
num1和num2是加数,cin是低位进位,cout是高位进位,sum是本位和
在这里插入图片描述

2 输出公式:
sum=num1⊕num2⊕cin
cout=(num1⊕num2)* cin+num1* num2=(num1&num2)∣(num1&cin)∣(num2&cin)

3 原理图:
在这里插入图片描述
3、输入原理图实现1位全加器

1 创建工程项目

在这里插入图片描述
然后在出现的界面下先Next,填写工程的路径和名称,我这里创建的项目名称为full_add_1bit;然后接着Next,直到出现下面界面并进行相应操作。接着一路Next,直到Finish,完成工程的创建。在这里插入图片描述

2 全加器原理图输入

点击File->New之后会显示如下界面,然后选择被方框框住的选项
在这里插入图片描述
然后就会进入到编辑界面,然后按照下面的步骤进行操作。input/output组件也是这样获得的
在这里插入图片描述
双击器件可以修改器件名称,为了之后的试验,将两个input分别修改为num1和num2,and2的输出为cout,xor的输出为sum。绘制出来的原理图如下图所示
在这里插入图片描述
保存文件(ctrl+s),并编译
在这里插入图片描述

等待编译完成之后就可以通过Tool->Netlist Viewers->RTL Viewer,来查看电路图
在这里插入图片描述

3 仿真实现

创建一个向量波形文件,File->New,然后选择“University Program VWF”
在这里插入图片描述
之后会进入到这个界面,然后按照图片中的步骤进入到信号添加界面
在这里插入图片描述
然后先选择Node Finder这个选项,然后再点击List,之后点击’>>',然后点击两次OK,就可以回到上面的那个界面,并且,此时信号也添加成功了。
在这里插入图片描述
编辑信号:
在这里插入图片描述
编辑好之后先保存这个文件
然后点击功能仿真按钮
在这里插入图片描述
时序仿真:
在这里插入图片描述
如果出现了错误,返回quartus界面,选择tool->launch simulation library complier进行配置。
在这里插入图片描述

4、Verilog实现加法器

1 创建并编写verilog文件

先创建一个verilog文件:
在这里插入图片描述
将代码复制到新建的verilog文件中,代码:

module full_add_1bit(   // 模块名和文件名相同,文件名和项目名相同
    num1, 
    num2,
    cin,
    cout, 
    sum,
);

input   num1;  // 加数
input   num2;  // 被加数
input   cin;  // 低位进位
output  cout;  // 向高位进位
output  sum;  // 结果

reg     sum;  
reg     cout;
always @(num1 or num2 or cin) begin
    sum = (num1 ^ num2) ^ cin;
    cout = (num1 & num2) | (num2 & cin) | (num1 & cin);
end
endmodule

2 查看生成的电路图

先将之前创建的电路图文件从项目中删除,也就是.bdf文件删除,否则会有报错。记得要把新建的verilog文件设置为顶层文件
然后进行编译,当编译完成之后就可以进行电路图的查看了。通过tool->Netlist Viewers->RTL Viewer进行查看。
在这里插入图片描述

3 仿真实现

创建一个vwf文件,然后接下来的操作和之前的相同,就不再过多赘述。这里就直接给出仿真结果
功能仿真结果:
在这里插入图片描述
时序仿真结果:
在这里插入图片描述
5、拓展:4位全加器
1 4位全加器原理图
这里面使用的组件是封装的,如何封装可以参考:参考博客
在这里插入图片描述

2 仿真实现
先创建一个向量波形文件,然后将信号添加进去。这里的操作和前面几乎相同。我们直接看仿真结果:
在这里插入图片描述
6、Verilog实现4位全加器
思路
实际上四位全加器和一位全加器的差别并不是很大。我们以一个例子来解释,比如说:这里有两个数,分别是num1=0011,num2=1110。我们算的时候是从最后一位开始一直向前加:
num1的最后一位是1,num2的最后一位是0,两个相加得到01,所以sum的最后一位是1,没有进位;
num1的倒数第二位是1,num2的倒数第二位是1,没有低位进位,相加得10,所以sum的倒数第二位是0,向前进位为1;
num1的第二位是0,num2的第二位是1,低位进位为1,所以相加得10,sum的第二位为0,向前进位为1;
num1的第一位是0,num2的第一位是1,低位进位为1,所以相加得10,sum的第一位为0,向前进位为1;
所以,通过上面的步骤,我们可以得到sum=0001,向前进位cout=1。

1 创建文件,编写代码

先创建一个verilog文件,并将下面代码复制到文件中

module four (
    num1,
    num2,
    cin,
    cout,
    sum
);

input   [3:0]   num1;
input   [3:0]   num2;
input           cin;
output          cout;
output  [3:0]   sum;


reg             cout;
reg     [3:0]   sum;
reg             add;

always @(num1 or num2 or cin)
begin
    // 第一位
    sum[0] = (num1[0] ^ num2[0]) ^ cin;
    cout = (num1[0] & num2[0]) | (num2[0] & cin) | (num1[0] & cin);
    add = cout;
    // 第二位
    sum[1] = (num1[1] ^ num2[1]) ^ add;
    cout = (num1[1] & num2[1]) | (num2[1] & add) | (num1[1] & add);
    add = cout;
    // 第三位
    sum[2] = (num1[2] ^ num2[2]) ^ add;
    cout = (num1[2] & num2[2]) | (num2[2] & add) | (num1[2] & add);
    add = cout;
    // 第四位
    sum[3] = (num1[3] ^ num2[3]) ^ add;
    cout = (num1[3] & num2[3]) | (num2[3] & add) | (num1[3] & add);
    add = cout;
end
endmodule

2 查看电路
记得将verilog文件设置为顶层文件之后再进行操作
在这里插入图片描述
3 仿真实现
在这里插入图片描述
7、ModelSim验证4位全加器
1 创建源文件和testbench文件
源文件,four.v

module four (
    num1,
    num2,
    cin,
    cout,
    sum
);

input   [3:0]   num1;
input   [3:0]   num2;
input           cin;
output          cout;
output  [3:0]   sum;


reg             cout;
reg     [3:0]   sum;
reg             add;
reg     [1:0]   cnt;
always @(num1 or num2 or cin)
begin
    // 第一位
    sum[0] = (num1[0] ^ num2[0]) ^ cin;
    cout = (num1[0] & num2[0]) | (num2[0] & cin) | (num1[0] & cin);
    add = cout;
    // 第二位
    sum[1] = (num1[1] ^ num2[1]) ^ add;
    cout = (num1[1] & num2[1]) | (num2[1] & add) | (num1[1] & add);
    add = cout;
    // 第三位
    sum[2] = (num1[2] ^ num2[2]) ^ add;
    cout = (num1[2] & num2[2]) | (num2[2] & add) | (num1[2] & add);
    add = cout;
    // 第四位
    sum[3] = (num1[3] ^ num2[3]) ^ add;
    cout = (num1[3] & num2[3]) | (num2[3] & add) | (num1[3] & add);
    add = cout;
end
endmodule

testbench文件,four_tb.v

module four_tb ();
    reg     [3:0]     num1;
    reg     [3:0]     num2;
    reg               cin;
    wire              cout;
    wire    [3:0]     sum;

    four uut(
        .num1(num1),
        .num2(num2),
        .cin (cin),
        .cout(cout),
        .sum (sum)
    );
    initial
    begin
            num1 <= 4'b0000; num2 <= 4'b0000; cin <= 0;
        #10 num1 <= 4'b0000; num2 <= 4'b0000; cin <= 1;
        #10 num1 <= 4'b0101; num2 <= 4'b0001; cin <= 0;
        #10 num1 <= 4'b1000; num2 <= 4'b0100; cin <= 0;
        #10 num1 <= 4'b1111; num2 <= 4'b1111; cin <= 0;
        #10 num1 <= 4'b1100; num2 <= 4'b0100; cin <= 1;
        #10 num1 <= 4'b0011; num2 <= 4'b0000; cin <= 1;
        #10 num1 <= 4'b1111; num2 <= 4'b1111; cin <= 1;
    end
endmodule

2 创建ModelSim项目
打开ModelSim之后创建一个项目,将刚才创建的两个文件加入到项目当中。然后将文件进行编译,成功之后就可以进行进行验证了。
3 验证结果
在这里插入图片描述

总结

这次实验回顾了之前学习的一些关于软件的使用知识使我受益很多。

参考链接

https://blog.csdn.net/molongqishi/article/details/129678242?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_43279579/article/details/115480406

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值