HDLBits中文版,标准参考答案 |2.5 More Verilog Features | 更多Verilog 要点

news2024/11/23 21:57:45

关注 望森FPGA  查看更多FPGA资讯

这是望森的第 7 期分享

作者 | 望森
来源 | 望森FPGA

目录

1 Conditional ternary operator | 条件三目运算符

2 Reduction operators | 归约运算器

3 Reduction: Even wider gates | 归约:更宽的门电路

4 Combinational for-loop: Vector reversal 2 | 组合 for 循环:向量反转 2

5 Combinational for-loop: 255-bit population count | 组合 for 循环:255 位人口计数

6 Generate for-loop: 100-bit binary adder 2 | Generate for 循环:100 位二进制加法器 2

7 Generate for-loop: 100-digit BCD adder | Generate for 循环:100 位 BCD 加法器


本文中的代码都能够正常运行,请放心食用😋~

练习的官方网站是:https://hdlbits.01xz.net/

注:作者将每个练习的知识点都放在了题目和答案之后


1 Conditional ternary operator | 条件三目运算符

题目:

给定四个无符号数,找出最小值。无符号数可以用标准比较运算符 (a < b) 进行比较。使用条件运算符制作双向最小电路,然后组合其中几个以创建 4 路最小电路。您可能需要一些wire向量来获取中间结果。

答案:

module top_module (
    input [7:0] a, b, c, d,
    output [7:0] min);//
 
    wire [7:0] minab;
    wire [7:0] mincd;
    assign minab         = (a<b)? a: b;
    assign mincd         = (c<d)? c: d;
    assign min           = (minab<mincd)? minab: mincd;
 
endmodule

知识点:

Verilog 有一个三元条件运算符 ( ? : ),与 C 非常相似:
(condition ? if_true : if_false)

这可用于根据一行中的条件 (mux!) 选择两个值中的一个,而无需在组合 always 块中使用 if-then。

示例:
(0 ? 3 : 5) // 这是 5,因为条件为假。
(sel ? b : a) // 由 sel 选择的 a 和 b 之间的 2 对 1 多路复用器。

always @(posedge clk) // T 触发器。
q <= toggle ? ~q : q;

always @(*) // 单输入 FSM 的状态转换逻辑
case (state)
A: next = w ? B : A;
B: next = w ? A : B;
endcase

assign out = ena ? q : 1'bz; // 三态缓冲器
((sel[1:0] == 2'h0) ? a : // 3 对 1 多路复用器
(sel[1:0] == 2'h1) ? b : c )


2 Reduction operators | 归约运算器

题目:

奇偶校验通常用作在通过不完美信道传输数据时检测错误的简单方法。创建一个电路,用于计算 8 位字节的奇偶校验位(将第 9 位添加到字节)。我们将使用“偶”奇偶校验,其中奇偶校验位只是所有 8 个数据位的异或。

答案:

module top_module (
    input [7:0] in,
    output parity); 
 
    assign parity = ^in;
    
endmodule

知识点:

您已经熟悉了两个值之间的按位运算,例如 a & b 或 a ^ b。有时,您想要创建一个对一个向量的所有位进行运算的宽门,例如 (a[0] & a[1] & a[2] & a[3] ... ),如果向量很长,这会变得很繁琐。

归约运算符可以对向量的位进行 AND、OR 和 XOR 运算,从而产生一位输出:
& a[3:0] // AND: a[3]&a[2]&a[1]&a[0]. Equivalent to (a[3:0] == 4'hf)
| b[3:0] // OR: b[3]|b[2]|b[1]|b[0]. Equivalent to (b[3:0] != 4'h0)
^ c[2:0] // XOR: c[2]^c[1]^c[0]

这些是只有一个操作数的一元运算符(类似于 NOT 运算符 ! 和 ~)。您还可以反转这些运算符的输出以创建 NAND、NOR 和 XNOR 门,例如 (~& d[7:0])。

现在您可以重新访问 4 输入门和 100 输入门。


3 Reduction: Even wider gates | 归约:更宽的门电路

题目:

构建一个具有 100 个输入的组合电路,in[99:0]。

有 3 个输出:

  • out_and:100 个输入与门的输出。

  • out_or:100 个输入或门的输出。

  • out_xor:100 个输入异或门的输出。

答案:

module top_module( 
    input [99:0] in,
    output out_and,
    output out_or,
    output out_xor 
);
 
    assign out_and = ∈
    assign out_or = |in;
    assign out_xor = ^in;
    
endmodule

4 Combinational for-loop: Vector reversal 2 | 组合 for 循环:向量反转 2

题目:

给定一个 100 位输入向量 [99:0],反转其位顺序。

答案:

module top_module( 
    input [99:0] in,
    output [99:0] out
);
 
    genvar i;
    generate 
        for(i=0;i<100;i=i+1)begin:name1
            assign out[i] = in[99-i];
        end
    endgenerate
    
endmodule

知识点:

错解及分析:
module top_module( 
    input [99:0] in,
    output [99:0] out
);
 
    genvar i;
    generate 
        for(i=0;i<99;i=i+1)begin
            out[i] = in[99-i];
        end
    endgenerate
    
endmodule

Error (10170): Verilog HDL syntax error at top_module.v(9) near text: "="; expecting ".", or an identifier. Check for and fix any syntax errors that appear immediately before or at the specified keyword.

通过组合逻辑进行变量赋值,需要使用assign语句。

Error (10644): Verilog HDL error at top_module.v(8): this block requires a name File: /home/h/work/hdlbits.18346683/top_module.v Line: 8

需要给 Generate 中的 for 循环块命名。


5 Combinational for-loop: 255-bit population count | 组合 for 循环:255 位人口计数

题目:

“人口计数”电路计算输入向量中“1”的数量。为 255 位输入向量构建人口计数电路。

答案:

module top_module( 
    input [254:0] in,
    output [7:0] out );
 
    integer i;
    always@(*)begin:name1
        out = 8'd0;
        for(i=0;i<255;i=i+1)begin
            if(in[i])
                out = out + 1;
            else
                out = out;
        end
    end
    
endmodule

6 Generate for-loop: 100-bit binary adder 2 | Generate for 循环:100 位二进制加法器 2

题目:

通过实例化 100 个全加器来创建一个 100 位二进制行波进位加法器。该加法器将两个 100 位数和一个进位相加,以产生 100 位和并输出进位。为了鼓励您实际实例化全加器,还输出行波进位加法器中每个全加器的进位。cout[99] 是最后一个全加器的最终进位,也是您通常看到的进位。

答案:

module top_module( 
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );
 
    full_adder adder_0( 
        .a(a[0]), 
        .b(b[0]),
        .cin(cin),
        .cout(cout[0]),
        .sum(sum[0]) 
    );
    
    genvar i;
    generate 
        for(i=1;i<100;i=i+1)begin:name1
            full_adder adder_i( 
                .a(a[i]), 
                .b(b[i]),
                .cin(cout[i-1]),
                .cout(cout[i]),
                .sum(sum[i]) 
            );
        end
    endgenerate
    
endmodule
 
module full_adder( 
    input a, b,
    input cin,
    output cout,
    output sum );
 
    assign cout = a&b | a&cin | b&cin;
    assign sum = a ^ b ^ cin;
    
endmodule

7 Generate for-loop: 100-digit BCD adder | Generate for 循环:100 位 BCD 加法器

题目:

您将获得一个名为 bcd_fadd 的 BCD 一位数加法器,它将两个 BCD 数字和进位相加,并产生一个和及进位输出。

module bcd_fadd (
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );

实例化 100 个 bcd_fadd 副本以创建一个 100 位 BCD 行波进位加法器。您的加法器应将两个 100 位 BCD 数字(打包成 400 位向量)和一个进位相加,以产生一个 100 位和及进位输出。

答案:

module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
 
    wire [99:0] cout_t;
    bcd_fadd add_0(
        .a(a[3:0]),
        .b(b[3:0]),
        .cin(cin),
        .cout(cout_t[0]),
        .sum(sum[3:0]) 
    );
    
    genvar i;
    generate 
        for (i=1;i<100;i=i+1)begin:name1
                bcd_fadd add_i(
                .a(a[i*4+3:i*4]),
                .b(b[i*4+3:i*4]),
                .cin(cout_t[i-1]),
                .cout(cout_t[i]),
                .sum(sum[i*4+3:i*4]) 
            );
        end
    endgenerate
    
    assign cout = cout_t[99];
    
endmodule

- END -

公z号/CSDN/EETOP搜索【望森FPGA】,查看更多FPGA资讯~

相关推荐文章,点击跳转:

望森FPGA的HDLBits合集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时域交织ADC建模文档

时域交织ADC建模文档 Time-interleaved SAR ADC modeling 32-way 6-bit TI SAR ADC 发货内容 仅有19页PDF&#xff0c;内有MATLAB代码&#xff08;3页&#xff09; MATLAB建模&#xff1b;TI SAR ADC;

微博创作平台:编辑技巧

文章目录 I 编辑技巧II 变形工具微博个人认证升级体系(橙V、金V体系规则)广告共享计划V+粉丝订阅I 编辑技巧 图片和视频一起发的时候,要求图+视频的总数不能大于9.微博app编辑文字时,图N可自动链接图片,例如图1可自动关联第一张图片,点击文字可直接打开第一张图片 II 变形…

GPU Puzzles讲解(二)

GPU-Puzzles项目是一个很棒的学习cuda编程的项目&#xff0c;可以让你学习到GPU编程和cuda核心并行编程的概念&#xff0c;通过一个个小问题让你理解cuda的编程和调用&#xff0c;创建共享显存空间&#xff0c;实现卷积和矩阵乘法等 https://github.com/srush/GPU-Puzzleshttp…

羚羊种类检测系统源码分享

羚羊种类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

项目——超级马里奥——Day(3)

一、游戏开发思路&#xff1a; 1.Frame--->BackGround--->Obstacle---->BufferedImage&#xff0c;人物等 2.BackGround的构造函数&#xff1a; 只要记住窗口里边的每一个场景&#xff0c;只要游戏一开始就已经出现在屏幕里边的&#xff0c;都是在构造函数里边 3.绘…

就业市场需求分析:基于前程无忧岗位数据分析

背景介绍&#xff1a;在前程无忧网站&#xff0c;以"数据分析师""武汉"作为搜索关键词&#xff0c;爬取50页岗位数据合计980条。以该数据为基础&#xff0c;从岗位搜索匹配度、HR活跃度、不同区域/行业/企业的岗位数量和薪资分布等角度进行分析。 1、原始数…

自动驾驶 车道检测实用算法

自动驾驶 | 车道检测实用算法 车道识别是自动驾驶领域的一个重要问题&#xff0c;今天介绍一个利用摄像头图像进行车道识别的实用算法。该算法利用了OpenCV库和Udacity自动驾驶汽车数据库的相关内容。 该算法包含以下步骤&#xff1a; 摄像头校准&#xff0c;以移除镜头畸变&…

百度所有网页都打不开,可能是这个原因

今天笔记本连着手机热点在使用浏览器&#xff0c;突然百度的网页就打不开了&#xff0c;不管是百度一下、百家号、百度汉语、百度经验&#xff0c;只要是百度旗下的网页全都打不开,浏览器直接显示下图这个样子。但是别的网页都能正常打开。 然后我赶紧试了一下ping命令&#xf…

cnn突破五(三层bpnet网络公式)

三层网络反向传播公式推导&#xff1a; X【196】-》HI【80】/HO【80】-》YI【10】/YO【10】&#xff0c;期望是d【10】 X&#xff0c;HI之间用w1【196&#xff0c;80】 HO&#xff0c;YI之间用w2【80,10】 k10;j80;i196 (yo[k]-d[k])*ds(yo[k])*ho[j]; (yo[k]-d[k])*ds(yo[…

推荐一款强大的书签管理工具,让你的网址不在落灰

在信息爆炸的互联网时代&#xff0c;我们每天都会浏览大量的网页&#xff0c;收藏各种各样的网址。然而&#xff0c;随着时间的推移&#xff0c;这些杂乱无章的书签往往让我们感到头疼。别担心&#xff0c;今天我要向你推荐一款强大的书签管理工具&#xff0c;它将帮助你轻松整…

训练验证器解决数学应用题

人工智能咨询培训老师叶梓 转载标明出处 数学问题解决不仅要求模型能够理解问题的语言表述&#xff0c;还要求其能够准确地执行一系列数学运算&#xff0c;每一步的准确性都至关重要。遗憾的是&#xff0c;现有的语言模型在这一领域的性能远远未能达到人类的水平&#xff0c;它…

小绿书开启副业模式(保姆级教程)

大家好&#xff0c;我是凡人。 是一个不黑、不吹、不跟风、有知识、有骨气的五好小号主。 好多小伙伴给我私信&#xff0c;问我有最近没有非常火爆的副业项目&#xff0c;现在很多赛道人满为患&#xff0c;有没有值得推荐的&#xff0c;别说还真有&#xff0c;可能大家都没注…

理解Spring中静态代理

参考https://blog.csdn.net/weixin_43005654/article/details/109317773 无论是静态代理还是动态代理&#xff0c;都有四大角色&#xff1a; 抽象角色&#xff1a;一般会使用接口或者抽象类来解决真实角色&#xff1a;被代理的角色代理角色&#xff1a;代理真实角色&#xff0…

ultralytics yolo pose 示例:加载官方pose模型进行推理

Ultralytics YOLO 是计算机视觉和 ML 领域专业人士的高效工具。 安装 ultralytics 库&#xff1a; pip install ultralytics 官方YoLo Pose 模型列表信息&#xff1a; 实现代码如下&#xff1a; from ultralytics import YOLO import cv2 # Load a model ckpt_dir "…

基于PHP的校园二手书交易管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园二手书交易管理系统 一 介绍 此二手书交易管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注…

3. BBP系列运动控制板(飞控板)简介

3.1. 概述 Bread Board Pilot(简称BBP) 是在积累了前期 Single Pilot 及 PH7 飞控板大量设计及使用经验的基础上&#xff0c;全新基于PH47代码框架开发的高灵活性&#xff0c; 高性能&#xff0c; 超低成本的最新一代飞控板设计。 目前&#xff0c;因为其使用便捷灵活&#xf…

D30【python 接口自动化学习】- python基础之输入输出与文件操作

day30 F-strings输出 学习日期&#xff1a;20241007 学习目标&#xff1a;输入输出与文件操作&#xfe63;-42 F-strings-如何通过定义好的格式进行输出&#xff1f; 学习笔记&#xff1a; F-strings 介绍 F-strings 的计算功能 F-strings 宽度和精度调整 练习 # 宽度为10个…

【计算机网络 - 基础问题】每日 3 题(二十九)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

platformio.ini工程配置文件入门

主要参考资料&#xff1a; “platformio.ini” (Project Configuration File): https://docs.platformio.org/en/latest/projectconf/index.html 目录 简介语法[platformio]: PlatformIO配置选项[env]:配置环境 简介 .ini是一个配置文件&#xff0c;它可以设置开发环境&#x…

4.循环结构在存储过程中的应用(4/10)

引言 在数据库管理中&#xff0c;存储过程是一种强大的工具&#xff0c;它允许将一组SQL语句封装为一个独立的、可重用的单元。存储过程不仅可以提高数据处理的效率&#xff0c;还可以增强代码的安全性和可维护性。在复杂的数据库操作中&#xff0c;循环结构扮演着至关重要的角…