0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Verilog/SystemVerilog硬件描述语言 (HDL) 练习数字硬件设计

OpenFPGA 来源:OpenFPGA 作者:碎碎思 2022-09-15 09:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

题目说明

给出了一个可以做16bit加法的模块add16,实例化两个add16以达到32bit加法的。

1229a180-3493-11ed-ba43-dac502259ad0.png

这个题目的核心就是上面的图片,将两个16bit加法合成32bit加法即可。

模块端口声明

moduletop_module(
input[31:0]a,
input[31:0]b,
output[31:0]sum
);

题目解析

这个题目重点是进位的处理,一个add16模块计算结果的低16位,另一个add16模块在接收到第一个的进位后计算结果的高16位。此32bit加法器不需要处理输入进位(假设为0)和输出进位(无需进位),但为了内部模块为了结果的正确仍要处理进位信号。(换句话说,add16模块执行16bit的a+b+cin,而顶层模块执行32bit的a+b)

moduletop_module(
inputlogic[31:0]a,
inputlogic[31:0]b,
outputlogic[31:0]sum
);

wirelogic[15:0]sum_temp0,sum_temp1;
varlogiccout1;
add16d1(
.a(a[15:0]),
.b(b[15:0]),
.cin(1'd0),
.sum(sum_temp0),
.cout(cout1)
);

add16d2(
.a(a[31:16]),
.b(b[31:16]),
.cin(cout1),
.sum(sum_temp1),
.cout()
);

assignsum={sum_temp1,sum_temp0};
endmodule


1273475e-3493-11ed-ba43-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

12a995c0-3493-11ed-ba43-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 25-Module fadd

题目说明

在本练习中,将创建具有两个层次结构的电路。top_module将实例化add16(提供)的两个副本,每个副本将实例化add1(必须自己编写)的 16 个副本。因此,必须编写两个模块:top_module和add1。与Problem 24: Adder 1(Module add)一样,提供给您一个执行16bit的加法的模块。您需要实例化两个16bit加法模块来实现32bit加法器。一个add16计算加法结果的低16位,另一个计算结果的高16位。您的32位加法器同样不需要处理进位输入(假设为0)和进位输出(无需进位)信号。

如下图所示,将add16模块连接在一起,给出的add16模块如下:

moduleadd16(input[15:0]a,input[15:0]b,inputcin,output[15:0]sum,outputcout);

在每个add16中,16 个全加器(模块add1,未提供)被实例化以实际执行加法。必须编写具有以下声明的完整加法器模块:

moduleadd1(inputa,inputb,inputcin,outputsum,outputcout);

回想一下,全加器计算 a+b+cin 的和和进位。

综上所述,本设计共有三个模块:

top_module— 顶级模块包含两个add16

add16 — 一个 16 位加法器模块,由 16 个add1组成

add1 — 1 位全加器模块。

如果提交缺少add1模块,将收到一条错误消息,内容为:

Error(12006):Nodeinstance"user_fadd[0].a1"instantiatesundefinedentity"add1".
136825bc-3493-11ed-ba43-dac502259ad0.png 

模块端口声明

moduletop_module(
input[31:0]a,
input[31:0]b,
output[31:0]sum
);

题目解析

只比上一题复杂些,核心内容没变。

moduletop_module(
inputlogic[31:0]a,
inputlogic[31:0]b,
outputlogic[31:0]sum
);//

wirelogiccout;

add16u1_add16(
.a(a[15:0]),
.b(b[15:0]),
.cin(1'd0),
.sum(sum[15:0]),
.cout(cout)
);

add16u2_add16(
.a(a[31:16]),
.b(b[31:16]),
.cin(cout),
.sum(sum[31:16]),
.cout()
);

endmodule

moduleadd1(inputlogica,
inputlogicb,
inputlogiccin,
outputlogicsum,
outputlogiccout
);

//Fulladdermodulehere
assign{cout,sum}=a+b+cin;
endmodule



13b7c2a2-3493-11ed-ba43-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

14596c10-3493-11ed-ba43-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 26-Module_cseladd

题目说明

上一个练习中(Problem 25: Adder 2(Module fadd))实现的加法器应该叫做行波进位加法器(RCA: Ripple-Carry Adder)。这种加法器的缺点是计算进位输出的延迟是相当慢的(最坏的情况下,来自于进位输入)。并且如果前一级加法器计算完成之前,后一级加法器不能开始计算。这又使得加法器的计算延迟变大。

一种改进是进位选择加法器,如下所示。第一级加法器与之前相同,但我们复制第二级加法器,一个假设进位=0,一个假设进位=1,然后使用快速2对1多路复用器选择哪个结果碰巧是正确的。

在本练习中,将获得与上一个练习相同的模块add16,该模块将两个 16 位数字与进位相加,并产生一个进位和 16 位和。必须实例化其中的三add16来构建进位选择加法器,同时实现16bit的2选1选择器来选择结果。

如下图所示将模块连接在一起。提供的模块add16具有以下声明:

moduleadd16(input[15:0]a,input[15:0]b,inputcin,output[15:0]sum,outputcout);
1493103c-3493-11ed-ba43-dac502259ad0.png 

模块端口声明

moduletop_module(
input[31:0]a,
input[31:0]b,
output[31:0]sum
);

题目解析

这题是上一题的改进版本的加法器,其实这也是我们数电上学到的CSA(Carry-Select Adder,选择进位加法器),其相对于行波进位加法器延迟小一半左右,但是其是利用资源换取的,所以相应消耗的资源增加约一倍。

moduletop_module(
inputlogic[31:0]a,
inputlogic[31:0]b,
outputlogic[31:0]sum
);

wirelogiccout_sel;
wirelogic[15:0]upperbit_sum0,upperbit_sum1;
add16u0_add16(
.a(a[15:0]),
.b(b[15:0]),
.cin(1'd0),
.sum(sum[15:0]),
.cout(cout_sel)
);

add16u1_add16(
.a(a[31:16]),
.b(b[31:16]),
.cin(1'd0),
.sum(upperbit_sum0),
.cout()
);

add16u2_add16(
.a(a[31:16]),
.b(b[31:16]),
.cin(1'd1),
.sum(upperbit_sum1),
.cout()
);

always_comb
begin
uniquecase(cout_sel)

1'd0:sum[31:16]=upperbit_sum0;
1'd1:sum[31:16]=upperbit_sum1;
default:sum[31:16]=upperbit_sum0;
endcase
end
endmodule


14dc2d44-3493-11ed-ba43-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

15530ec8-3493-11ed-ba43-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 27-Module addsub

题目说明

减法器可以通过选择性地取反一个输入而从加法器构建,这相当于将输入反相然后加 1。最终结果是一个可以执行两种操作的电路:(a + b + 0) 和 ( a + ~b + 1)。

题目要求构建下面的加减法器。

提供了一个 16 位加法器模块,需要对其进行两次实例化:

moduleadd16(input[15:0]a,input[15:0]b,inputcin,output[15:0]sum,outputcout);

每当sub为 1 时,使用 32 位宽的 XOR 门来反转b输入。(这也可以被视为b[31:0]与sub复制32次相异或)。同时sub信号连接到加法器的进位。

157e92d2-3493-11ed-ba43-dac502259ad0.png 图片来自 HDLBits

模块端口声明

moduletop_module(
input[31:0]a,
input[31:0]b,
inputsub,
output[31:0]sum
);

题目解析

这个题目考察的是减法器,这里就用到数电小常识:减去一个数等于加上这个数的补码(就是题中的按位取反再加1)。

moduletop_module(
inputlogic[31:0]a,
inputlogic[31:0]b,
inputlogicsub,
outputlogic[31:0]sum
);

wirelogiccout_0;
wirelogic[31:0]b_reverse;
assignb_reverse=b^{32{sub}};

add16u1_add16(
.a(a[15:0]),
.b(b_reverse[15:0]),
.cin(sub),
.sum(sum[15:0]),
.cout(cout_0)
);


add16u2_add16(
.a(a[31:16]),
.b(b_reverse[31:16]),
.cin(cout_0),
.sum(sum[31:16]),
.cout()
);
endmodule


15b47b9a-3493-11ed-ba43-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

1655d166-3493-11ed-ba43-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    31

    文章

    1374

    浏览量

    114839
  • HDL
    HDL
    +关注

    关注

    8

    文章

    332

    浏览量

    49090
  • 加法器
    +关注

    关注

    6

    文章

    183

    浏览量

    31606

原文标题:HDLBits: 在线学习 SystemVerilog(六)-Problem 24-27

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    2026年可编程逻辑与EDA/IC设计实战:用Gemini镜像站辅助FPGA开发与芯片验证硬核教程

    设计与验证闭环。 一、AI如何理解硬件描述语言与设计意图 Verilog/VHDL这类硬件描述语言,本质上是对并行逻辑电路的文字刻画。Gem
    的头像 发表于 05-26 16:31 20次阅读
    2026年可编程逻辑与EDA/IC设计实战:用Gemini镜像站辅助FPGA开发与芯片验证硬核教程

    探索Microchip数字电源入门套件:功能、硬件与应用全解析

    探索Microchip数字电源入门套件:功能、硬件与应用全解析 在当今电子技术飞速发展的时代,数字电源技术凭借其高效、灵活和智能的特点,正逐渐成为电源设计领域的主流趋势。Microchip的
    的头像 发表于 04-06 16:40 1175次阅读

    【黑金云课堂笔记】第一~二期知识点总结

    知识卡片一:【FPGA 基础篇】开启硬件编程之门 FPGA 的本质 : FPGA(现场可编程门阵列)并非在运行软件程序,而是在 构建电路本身 。用户可以通过 Verilog/VHDL 等硬件
    的头像 发表于 04-01 16:10 279次阅读

    Verilog HDL语法学习笔记

    Verilog HDL 语 言 最 初 是 作为 Gateway Design Automation 公 司 ( Gateway DesignAutomation 公司后来被著名的 Cadence Design Systems 公司收购)模拟器产品开发的
    的头像 发表于 03-04 15:04 5963次阅读
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>语法学习笔记

    HLS设计中的BRAM使用优势

    高层次综合(HLS)是一种将高级编程语言(如C、C++或SystemC)转换为硬件描述语言HDL)的设计方法。在FPGA设计中,设计者可以灵活地利用FPGA内部的资源,如块RAM(B
    的头像 发表于 01-28 14:36 503次阅读

    基于FPGA VHDL的FSK调制与解调设计

    VHDL诞生于1982年。在1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言
    的头像 发表于 01-27 10:58 679次阅读
    基于FPGA VHDL的FSK调制与解调设计

    通过vivado HLS设计一个FIR低通滤波器

    Vivado HLS是一款强大的高层次综合工具,可将C/C++代码转换为硬件描述语言HDL),显著提升FPGA开发效率。
    的头像 发表于 01-20 16:19 629次阅读
    通过vivado HLS设计一个FIR低通滤波器

    FPGA 入门必看:Verilog 与 VHDL 编程基础解析!

    很多开发者第一次接触FPGA,都会有同样的疑问:FPGA是硬件,不是软件,怎么写程序?答案就是用硬件描述语言HDL),最常用的就是Verilog
    的头像 发表于 01-19 09:05 843次阅读
    FPGA 入门必看:<b class='flag-5'>Verilog</b> 与 VHDL 编程基础解析!

    如何使用Modelsim仿真I2C控制器

    ModelSim是Model Technology(Mentor Graphics的子公司)的HDL硬件描述语言的仿真软件。该软件可以用来实现对设计的VHDL、Verilog
    的头像 发表于 01-10 14:14 5748次阅读
    如何使用Modelsim仿真I2C控制器

    【产品介绍】Modelsim:HDL语言仿真软件

    概述ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核
    的头像 发表于 11-13 11:41 789次阅读
    【产品介绍】Modelsim:<b class='flag-5'>HDL</b><b class='flag-5'>语言</b>仿真软件

    复杂的软件算法硬件IP核的实现

    模型,它是从传统的计算机汇编语言演变而来,同时它是支持指令集级的并行执行。可以认为 HASM 是一种比 VHDL 或Verilog 稍微高级一点的硬件描述语言,但是和 C
    发表于 10-30 07:02

    如何利用Verilog HDL在FPGA上实现SRAM的读写测试

    本篇将详细介绍如何利用Verilog HDL在FPGA上实现SRAM的读写测试。SRAM是一种非易失性存储器,具有高速读取和写入的特点。在FPGA中实现SRAM读写测试,包括设计SRAM接口模块
    的头像 发表于 10-22 17:21 4655次阅读
    如何利用<b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>在FPGA上实现SRAM的读写测试

    硬件:我就说还得靠我

    硬件
    扬兴科技
    发布于 :2025年05月26日 18:27:09