数字IC手撕代码--小米科技(除法器设计)
创始人
2024-05-27 06:57:42
0
前言:
本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。

目录如下:

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@(*)begina_reg = A;b_reg = B;endalways@(*)begintemp_a = {16'h0,a_reg};temp_b = {b_reg,16'h0};for(i=0;i<16;i=i+1)begintemp_a = temp_a <<1;if(temp_a >= temp_b)begintemp_a = temp_a-temp_b+1;endelse begintemp_a = temp_a;endendendassign 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#10A <=  16'd375;B <=  8'd23;#10A <=  16'd557;B <=  8'd57;
enddivisor u_divisor(.A      (A)       ,.B      (B)       ,.result (result)  ,.remain (remain)
);endmodule

波形图

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

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

结果与我们考虑的一致。

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...