数字IC手撕代码--小米科技(除法器设计)

news2024/10/5 13:49:40
前言:
本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。

目录如下:

1.数字IC手撕代码-分频器(任意偶数分频)

2.数字IC手撕代码-分频器(任意奇数分频)

3.数字IC手撕代码-分频器(任意小数分频)

4.数字IC手撕代码-异步复位同步释放

5.数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

6.数字IC手撕代码-序列检测(状态机写法)

7.数字IC手撕代码-序列检测(移位寄存器写法)

8.数字IC手撕代码-半加器、全加器

9.数字IC手撕代码-串转并、并转串

10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)

11.数字IC手撕代码-有限状态机FSM-饮料机

12.数字IC手撕代码-握手信号(READY-VALID)

13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

14.数字IC手撕代码-泰凌微笔试真题

15.数字IC手撕代码-平头哥技术终面手撕真题

16.数字IC手撕代码-兆易创新笔试真题

17.数字IC手撕代码-乐鑫科技笔试真题(4倍频)

18.数字IC手撕代码-双端口RAM(dual-port-RAM)

...持续更新

更多手撕代码题可以前往 数字IC手撕代码--题库。


题目描述

除法器的Verilog RTL实现。16bitA,8bitB。C=A/B


解决思路

在硬件中都是二进制数,二进制除法和十进制除法类似,都是一个移位并比较大小的过程。

计算步骤:

① 将被除数高位数据与除数作比较,如果前者>=后者,则可得到对应位的商为1,两者做差得到第一步的余数;否则得到对应的商为0,将前者直接作为余数。

② 将上一步中的余数与被除数剩余最高位1bit数据拼接成新的数据,然后再和除数做比较,可以得到新的商和余数。

③ 重复过程②,直到被除数最低位数据也参与计算。

举个例子375/23 = 16'b0000_0001_0111_0111 / 8'b0001_0111

  1. 取被除数的第1位,与除数相比,8'b0000_0000<8'b0001_0111,商为0,前者作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0000< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0000< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0000< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0000< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0000< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0000< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0001< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0010< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0101< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_1011< 8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0001_0111<=8'b0001_0111,商为1,两者之差作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0000<8'b0001_0111,商为0,前者作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0001<8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0011<8'b0001_0111,商为0,前者继续作为余数。

  1. 再取右移一位的数继续比较,8'b0000_0111<8'b0001_0111,商为0,前者继续作为余数,已经比到最后一位,输出结果:商为1<<4=16,余数为:8'b0000_0111=7。

  1. 故计算得到375/23=16......7。


代码

module divisor(
    input     [15:0]    A       ,
    input     [7:0]     B       ,
    output    [15:0]    result  ,
    output    [7:0]     remain
    );
    reg [15:0]  a_reg   ;
    reg [7:0]   b_reg   ; 
    reg [31:0]  temp_a  ;  # 其实这里取16+8+1bit就够了,取32位是为了好看。
    reg [31:0]  temp_b  ;

    integer     i;
    always@(*)begin
        a_reg = A;
        b_reg = B;
    end

    always@(*)begin
        temp_a = {16'h0,a_reg};
        temp_b = {b_reg,16'h0};
        
        for(i=0;i<16;i=i+1)begin
            temp_a = temp_a <<1;
            if(temp_a >= temp_b)begin
                temp_a = temp_a-temp_b+1;
            end
            else begin
                temp_a = temp_a;
            end
        end
    end

    assign remain = temp_a[31:16];
    assign result = temp_a[15:0];

endmodule

testbench

module divisor_tb();

reg   [15:0]    A       ;
reg   [7:0]     B       ;
wire  [15:0]    result  ;
wire  [7:0]     remain  ;

initial begin
  #10
  A <=  16'd375;
  B <=  8'd23;
  #10
  A <=  16'd557;
  B <=  8'd57;
end

divisor u_divisor(
  .A      (A)       ,
  .B      (B)       ,
  .result (result)  ,
  .remain (remain)
);

endmodule

波形图

算式1:375/23=16......7

算式2:557/57=9 ......44

结果与我们考虑的一致。

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

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

相关文章

wondows10系统python2.7兼容安装python3.10

假设已安装好python2.7和pyhon3.10。 python命令只需要应用程序改名即可&#xff0c;需要修改的有python.exe和pythonw.exe pip命令麻烦点&#xff0c;需要用改名后的程序名 重新安装&#xff0c;命令如下&#xff1a; python3 -m pip install --upgrade pip --force-reinst…

说说 Pluma 插件管理框架

1. 概述 Pluma 是一个用 C 开发的可用于管理插件的开源架构&#xff0c;其官网地址为&#xff1a;http://pluma-framework.sourceforge.net/。该架构是个轻量级架构&#xff0c;非常易于理解。 Pluma 架构有以下基本概念&#xff1a; 1&#xff09;插件的外在行为体现为一个…

【C++的OpenCV】第七课-OpenCV图像常用操作(四):图像形态学-图像侵蚀和扩散的原理

让我们来深化前边学习的内容前言一、图像形态学是什么&#xff1f;二、侵蚀和扩张的原理2.1 图像的侵蚀2.1.1 概念2.1.2 原理解释2.2 图像的扩张2.2.1 概念2.2.2 原理解释相关链接&#xff1a;【C的OpenCV】第六课-OpenCV图像常用操作&#xff08;三&#xff09;&#xff1a;Op…

RK3568镜像的拆包和打包

文章目录 前言一、window上分包和打包分包打包二、Linux上分包和打包分包打包总结前言 本文记录在win10上利用瑞芯微提供的工具进行分包和打包,同样也有Linux教程 提示:以下是本篇文章正文内容,下面案例可供参考 一、window上分包和打包 分包 window下一般直接利用工具即…

【正点原子FPGA连载】 第十八章基于BRAM的PS和PL的数据交互 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十八章基于BRA…

在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理

大家好&#xff0c;我是 17。 Flutter WebView 一共写了四篇文章 在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理在 Flutter 中使用 webview_flutter 4.0 | js 交互Flutter WebView 性能优化&#xff0c;让 h5 像原生页面一样优秀&#xff0c;已入选 掘金一周 …

AI绘画进军三次元,有人用它打造赛博女友?(diffusion)

目录0 写在前面1 AI绘画技术飞跃2 效果展示3 环境配置3.1 下载基础模型3.2 更新.NET和模型3.3 下载绘画模型3.4 启动项目3.5 标签配置4 结语0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&a…

内存数据库-4-[redis]在ubuntu中离线安装

Ubuntu20.04(linux)离线安装redis 官网redis下载地址 下载安装包redis-6.0.9.tar.gz。 1 下载安装 (1)解压 sudo tar -xzvf redis-6.0.9.tar.gz -C /usr/local/ cd /usr/local/redis-6.0.9/(2)编译 sudo make(3)测试 sudo dpkg -i libtcl8.6_8.6.10dfsg-1_amd64.deb sudo d…

纯x86汇编实现的多线程操作系统实践 - 第七章 AP2的用户进程

AP2用户进程的代码为task2.asm。该用户进程将在界面上显示一个移动的弹球。一旦在界面上点击鼠标左键&#xff0c;弹球就会直接从鼠标点击处重新出现并继续移动。如何在界面上显示出一个持续移动的小球&#xff1f;计算小球将移动到的区域1->保留该区域中将被小球覆盖的点-&…

智慧物联网源码带手机端源码 物联网系统源码

在智慧工厂领域&#xff0c;智慧城市领域&#xff0c;都需要对设备进行监控。比如工厂需要对周围环境温度、湿度、气压、电压&#xff0c;灯的开关进行监控。这时候就需要物联网平台来进行管理。 推荐一个基于java开发的物联网平台&#xff0c;前端HTML带云组态、可接入视频监…

【华为OD机试模拟题】用 C++ 实现 - 网上商城优惠活动(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明网上商城优惠活动题目输入输出备注示例一输入输出说明输入说明输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才…

Android zygote进程启动流程

zygote启动过程中涉及到以下模块&#xff1a; app_processzygote USAPsocketFileDescriptor (FD) AndroidRuntimeAppRuntime &#xff08;定义于app_process模块&#xff0c;继承自AndroidRuntime。&#xff09; init进程启动zygote进程&#xff1a; #init.zygote32_64.rc s…

【华为OD机试模拟题】用 C++ 实现 - 统计匹配的二元组个数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明统计匹配的二元组个数题目输入输出描述示例一输入输出说明示例二输入输出说明备注Code使用说明 参加华为od机试,一定要注意不要完全背诵代码&

python读写hdfs文件的实用解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

Python学习笔记之环境搭建

Python学习笔记之环境搭建1. 下载Python2. Windows 安装最新Python3. Linux 安装最新PythonPython是一种编程语言&#xff0c;可以让您更快地工作并更有效地集成系统。 您可以学习使用Python&#xff0c;并立即看到生产力的提高和维护成本的降低。 Python是荷兰程序员吉多范罗苏…

使用 OpenCV 进行面部和眼睛检测

OpenCV是构建计算机视觉应用程序的强大工具。计算机视觉中最常见的任务之一是人脸检测&#xff0c;它涉及识别图像或视频中人脸的存在、位置和面部特征。在本文中&#xff0c;我们将学习如何使用 Haar 级联分类器检测图像中的人脸。先决条件在开始之前&#xff0c;你需要在计算…

Android打造万能的BannerView无限轮播图

效果图&#xff1a;工程目录图&#xff1a;BannerAdapter&#xff1a;banner轮播图的适配器&#xff0c;因为服务器返回的列表图片的url&#xff0c;显示的时候需要转成IamgeViw&#xff1b; BannerScroller&#xff1a;设置切换页面的持续时间&#xff1b; BannerView&…

怎样划分MES系统实施阶段,三分钟告诉你整体实施思路

MES系统的实施阶段划分的思路是&#xff1a;在集成的前提下实现可视化&#xff0c;在可视化的基础上实现精细化&#xff0c;在精细化的前提下实现均衡化。生产过程透明的目的就是要实现生产过程的可视化&#xff0c;实现精细化生产。首先要做的就是收集生产信息&#xff0c;这是…

Linux->进程地址空间

目录 前言&#xff1a; 1. 程序地址空间回顾 2. 进程空间是什么 3. 进程地址空间与内存 4. 进程地址空间和内存的关联 5. 为什么要有进程地址空间 前言&#xff1a; 我们在平时学习的过程当中总是听到栈、堆、代码段等等储存空间&#xff0c;但是这些东西到底是什么&…

CSS3新特性

CSS3新特性 1.1、字体图标 何为字体图标&#xff1f; 字体图标展示的是图标&#xff0c;本质是字体。用于处理简单的、颜色单一的图片 字体图标的优点&#xff1a; 灵活性&#xff1a;灵活地修改样式&#xff0c;例如&#xff1a;尺寸、颜色等轻量级&#xff1a;体积小、渲…