Verilog学习之位拆分与运算设计

2023-11-04


前言

今天我们做的是第五道题——位拆分与运算,这道题比较简单,我们只需要用到状态机的思想和“+”运算以及数据锁存的问题。接下来就让我们看看如何写这道题。位拆分和运算


一、题目描述

现在输入了一个压缩的16位数据,其实际上包含了四个数据[3:0][7:4][11:8][15:12],
现在请按照sel选择输出四个数据的相加结果,并输出valid_out信号(在不输出时候拉低)
0:不输出且只有此时的输入有效
1:输出[3:0]+[7:4]
2:输出[3:0]+[11:8]
3:输出[3:0]+[15:12]
信号示意图
在这里插入图片描述
波形示意图
在这里插入图片描述
输入描述:
输入信号 d, clk, rst
类型 wire
在testbench中,clk为周期5ns的时钟,rst为低电平复位

输出描述:
输出信号 validout out
类型 reg

二、实现思路

1.题意分析

题中输入的是一个16位的数字,需要我们将其拆分成4个4位的数据并进行组合相加运算。但我们好像没有学过可以拆分数据的运算符,所以我们可以定义一个 reg 型的中间变量 data1 来存储输入变量 d ,因为 reg 型变量是可以一位一位进行单独运算的,并不是一个输入就一定是一个数据,在很多情况下,一个输入既包括数据又包括地址等其他有效信息。

另外我们还需要考虑的是数据锁存问题,根据题意我们知道,只有在sel为0的时候进行锁存,数据的写入才是有效的(validout的下降沿写入有效),同时存在多种情况且没有优先级问题,所以我们使用case语句。

2.状态分析

四个状态之间的转换如下:

sel out validout
0 0锁存输入 0
1 [3:0]+[7:4] 1
1 [3:0]+[11:8] 1
1 [3:0]+[15:12] 1

三、代码展示

按照我们正常的思路编写出来的代码是这样的,但它会报错(main.v:23: error: out is not a valid l-value in data_cal. main.v:9: : out is declared here as wire.……)其余错误与它类似,就不一 一例举了,他的大致意思就是说赋值符号左右两边的变量数据类型不同,我们可以发现题目中给出的输出都没有规定类型,所以都是默认(wire)类型,但我们却是用 reg 的变量 data1 作为中间变量赋值的,所以我们需要把输出变量 out 和 validout 的类型改为 reg 型。

`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output [4:0]out,
output validout
);
reg [15:0]data1;   
//位拆分,将输入的每一位存至寄存器类型变量data1中
always @(posedge clk or negedge rst) begin
    if(!rst)
        data1 <= 0;
    else if(sel == 0)
        data1 <= d;
end
//运算以及输出部分
always @(posedge clk or negedge rst) begin
    if(!rst) begin
        out <= 'b0;
        validout <= 0;
    end
    else begin
        case(sel)
            0: begin
                out <= 'b0;
                validout <= 0;
            end
            1: begin
                out <= data1[3:0]+data1[7:4];
                validout <= 1;   
            end
            2: begin
                out <= data1[3:0]+data1[11:8];
                validout <= 1;
            end
            3: begin
                out <= data1[3:0]+data1[15:12];
                validout <= 1;
            end
        endcase
    end
end
endmodule

更改后的代码如下:

`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output reg [4:0]out,
output reg validout
);
reg [15:0]data1;   
//位拆分,将输入的每一位存至寄存器类型变量data1中
always @(posedge clk or negedge rst) begin
    if(!rst)
        data1 <= 0;
    else if(sel == 0)
        data1 <= d;
end
//运算以及输出部分
always @(posedge clk or negedge rst) begin
    if(!rst) begin
        out <= 'b0;
        validout <= 0;
    end
    else begin
        case(sel)
            0: begin
                out <= 'b0;
                validout <= 0;
            end
            1: begin
                out <= data1[3:0]+data1[7:4];
                validout <= 1;   
            end
            2: begin
                out <= data1[3:0]+data1[11:8];
                validout <= 1;
            end
            3: begin
                out <= data1[3:0]+data1[15:12];
                validout <= 1;
            end
        endcase
    end
end
endmodule


总结

以上就是我在做这道题时的思路,以及代码的编写,如果还有更多更好的解法,欢迎读到这篇文章的朋友们在评论区告诉我,共同进步嘛。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Verilog学习之位拆分与运算设计 的相关文章

  • 山洪灾害监测预警系统解决方案

    一 方案背景 近几年我国频繁发生山洪灾害现象 造成大量的人员伤亡 使得洪涝灾害死亡总人数呈上升趋势 群死群伤事件时有发生 为了提高山洪灾害监测预警能力 加强灾害发生时的快速反应能力 我司研发出了山洪灾害监测预警系统设备 它具有技术先进 功能
  • 职工管理系统_201026(思路详解版-第四步修改职工)

    12 修改职工 功能描述 能够按照职工的编号对职工信息进行修改并保存 12 1 修改职工函数声明 在workerManager h中添加成员函数 void Mod Emp 修改职工 void Mod Emp 12 2 修改职工函数实现 在w
  • 使用PAM保障开发运营安全

    硬编码凭据和 DevOps 系统中缺乏凭据安全性是组织的巨大漏洞 以明文形式访问凭据的恶意内部人员可以在 IT 中建立和扩展其立足点 基础设施 构成巨大的数据被盗风险 什么是PAM 特权访问管理 PAM 是指一组 IT 安全管理原则 可帮助
  • Markdown 技能树(2):段落及强调

    Markdown 技能树 2 段落及强调 在 Markdown 中 段落是由一个以上相连接的行句组成 而一个以上的空行则会切分出不同的段落 一般的段落不需要用空白或换行缩排 空行的定义是显示上看起来像是空行 便会被视为空行 比如 若某一行只
  • 再谈Linux epoll惊群问题的原因和解决方案

    转自 https blog csdn net dog250 article details 80837278 缘起 近期排查了一个问题 epoll惊群的问题 起初我并不认为这是惊群导致 因为从现象上看 只是体现了CPU不均衡 一共fork了
  • linux批量修改文件编码格式(包含子目录)

    背景 项目工程文件编码格式有utf 8 也有gb2312 在通过Source Insight 4 0打开文件只能设置一种默认编码格式UTF 8 Windows ANSI GB2312 不能自动识别文件本身的编码格式 这就导致总有一部分文件打
  • 【转载】爬虫篇:获取数据——urllib库的基础知识(总结)

    注 本文章大部分代码的案例节选于 Python3网络爬虫开发实战 第2版 一 发出请求 1 urlopen方法 Python版本 3 6 coding utf 8 urlopen 方法的API urllib request urlopen
  • 深度解析shell脚本的命令的原理之cp

    cp 是 Unix 或 Linux 中的一个基本命令 用于复制文件或目录 以下是对这个命令的深度解析 基本操作 cp 命令的基本操作是将一个或多个源文件或目录复制到一个目标文件或目录 它通过读取源文件的内容 并将这些内容写入到目标文件来完成

随机推荐

  • 利用Caffe创建自己的lmdb数据集

    用Caffe进行模型训练时 除了用现有的公开数据集 如MNIST CIFAR等 有时候我们还需要创建自己的数据集进行训练 本篇博客讲的就是如何利用Caffe中的模块创建自己lmdb数据集 数据集准备 我们需要自己准备好带类别标签的图片数据
  • 架构设计(数据层)

    架构设计 数据层 关系数据库 关系数据库 需要事先定义表 读写数据时 表中字段不可动态变更 表中的每个行记录代表一个关系 1 海贼王 20 2 瓜田李下 20 表与表之间也可建立关联关系 一对一 一对多 多对一 多对多 关系型数据库进行读写
  • uboot 中内存测试,内存检测方法

    DDR内存子系统常见硬件错误及Uboot中检测流程 在 U Boot中 Denx U Boot的开发商 针对常见的DDR内存故障进行了严格的检测处理 下图描述了该检测处理过程的三个步骤 检测数据线 地址线和DDR物理存储部件 主要涉及这三个
  • 给大家介绍几个好的软件包下载网站

    RPM SEARCH http rpm pbone net PKG SEARCH http pkgs org 两个都非常的好
  • 51单片机:用ADC0832做模数转换,测量电压大小

    51单片机 用ADC0832做模数转换 测量外界电压大小 问题要求 利用51单片机 外加一个ADC0832模数转换器 设计一个可以实时测量电压的电路 测量电压的范围是0 5V 允许误差 要求测出的电压用数码管实时显示 精确到小数点后两位 代
  • 【计算机视觉】PixelRNN 讲解

    任何的书写错误 排版错误 概念错误等 希望大家包含指正 PixelRNN 论文信息 作者 Aaron van den Oord Google DeepMind 期刊 PMLR JMLR 发布时间与更新时间 2016 01 25 2016 0
  • SQL列属性

    列属性 真正的约束字段的是数据类型 但是数据类型的约束很单一 需要有一些额外的约束 来保证数据的合法性 列属性有很多 NULL NOT NULL default primary key unique key auto increment c
  • Leetcode-4. Median of Two Sorted Arrays

    Topic background Given two sorted arrays nums1 and nums2 of size m and n respectively return the median of the two sorte
  • vue使用element plus引入ElMessage样式失效的问题

    样式失效如图 我使用的是按需引用 所以在main js中直接导入下面样式就行 import element plus theme chalk index css
  • 装饰模式与代理区别

    学着学着真容易懵 相同点 装饰者类与目标类要求实现同一接口 静态代理类与目标类要求也实现同一接口 装饰者类与静态代理类都可以实现增强目标类的功能 装饰者类与静态代理类中都具有目标类的引用 目的都是为了在其中调用目标类的方 法 不同点 装饰者
  • JSP 点击量统计

    2019独角兽企业重金招聘Python工程师标准 gt gt gt JSP 点击量统计 有时候我们需要知道某个页面被访问的次数 这时我们就需要在页面上添加页面统计器 页面访问的统计一般在用户第一次载入时累加该页面的访问数上 要实现一个计数器
  • 第5章 使用图像(html)

    第5章 使用图像 html 目录标题 5 1 有序列表 5 1 1 ol标签 5 1 2 有序列表的序号类型type 5 1 3 有序列表的起始数值start 5 2 无序列表 5 3 定义列表dl 5 4 列表的嵌套 5 5 练习题 5
  • windows 8 pro vl_微软MSDN原版Windows10/8/7/XP系统镜像与office下载地址大全

    相信如今大多数的用户开始讨厌GHOST形式安装操作系统 而使用微软MSDN原版系统进行安装 原因是网上分享的GHOST系统已经形成了一个黑色产业链 由于系统被删减过 众多功能缺失 并捆绑了众多无用的软件程序 还强制修改浏览器主页等让人讨厌的
  • 深度学习边缘检测 HED 训练自己的数据

    深度学习边缘检测 HED 训练自己的数据 数据集制作 使用labelme标注 选择lineStrip 线条束 标注 生成json文件 之后使用批量处理脚本将json文件转为边缘数据集 具体过程如下 首先将所有的json文件放入一个文件夹内
  • 云计算与海量数据处理技术

    云计算提供了一种对资源 按需索取服务 的能力 确保了使用时间与需要时间的完全一致 从而建立了一种分布式 高效率 低成本的IT商业模式 正是这些特点 使云计算成为IT发展的潮流与趋势 为解决广大系统设计人员深入研究与开发云计算系统的需要 培训
  • 小美的数组操作2---牛客周赛 Round 11

    注意给a 0 赋一个最小值 include
  • 1004 成绩排名 (20 分)

    1004 成绩排名 20 分 读入 n gt 0 名学生的姓名 学号 成绩 分别输出成绩最高和成绩最低学生的姓名和学号 输入格式 每个测试输入包含 1 个测试用例 格式为 第 1 行 正整数 n 第 2 行 第 1 个学生的姓名 学号 成绩
  • WEB应用防火墙安全技术要求与测试评价方法

    信息安全技术 WEB应用防火墙安全技术要求与测试评价方法 范围 本标准规定了WEB应用防火墙的安全功能要求 自身安全保护要求 性能要求和安全保证要求 并提供了相应的测试评价方法 本标准适用于WEB应用防火墙的设计 生产 检测及采购 规范性引
  • Android自定义View-Path的详细介绍

    一 构造方法 1 Path path new Path 空的构造方法 2 Path path new Path Path src 创建一个新的路径 并从src路径获取内容赋值给新的路径 二 Path常用的一些方法 分类 Path方法 备注
  • Verilog学习之位拆分与运算设计

    文章目录 前言 一 题目描述 二 实现思路 1 题意分析 2 状态分析 三 代码展示 总结 前言 今天我们做的是第五道题 位拆分与运算 这道题比较简单 我们只需要用到状态机的思想和 运算以及数据锁存的问题 接下来就让我们看看如何写这道题 位