• 移位运算与乘法


    描述

    题目描述:           

            已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)

    信号示意图:

    波形示意图:

    输入描述:

            输入信号   d, clk, rst
            类型 wire
            在testbench中,clk为周期5ns的时钟,rst为低电平复位

    输出描述:

            输出信号 input_grant    out
            类型  reg 

    解题分析:

            在硬件中进行乘除法运算是比较消耗资源的一种方法,想要在不影响延迟并尽量减少资源消耗,必须从硬件的特点上进行设计。根据寄存器的原理,由于是二进制,所以进位和退位为x2或者/2,同样除7可以使用进位3然后减去本身的做法,这样就将乘除法运算转化为位运算,这是一种比较简单的整数运算处理。

             需要给出一个计数器的状态机,注意d输入不是随时有效的,只有在cnt计数为0的那个时钟沿,d输入有效,因此需要设计一个寄存器din,在cnt为0时候锁存d的值。

    代码如下:

    1. `timescale 1ns/1ns
    2. module vl4 (
    3. input [7:0]d ,
    4. input clk,
    5. input rst,
    6. output reg input_grant,
    7. output reg [10:0]out
    8. );
    9. //*************code***********//
    10. reg [1:0] cnt;
    11. reg [7:0] reg_d;
    12. //*******计数器初始化及赋值*******//
    13. always@(posedge clk or negedge rst)
    14. if(rst == 1'b0)
    15. cnt <= 2'd0;
    16. else if(cnt == 2'd3)
    17. cnt <= 2'd0;
    18. else
    19. cnt <= cnt + 1'b1;
    20. //***数据寄存器(reg_d)和输入有效标志(input_grant)初始化及赋值***//
    21. always@(posedge clk or negedge rst)
    22. if(rst == 1'b0)begin
    23. reg_d <= 8'd0;
    24. input_grant <= 1'b0;
    25. end
    26. else if(cnt == 2'd0)begin
    27. reg_d <= d;
    28. input_grant <= 1'b1;
    29. end
    30. else begin
    31. reg_d <= reg_d;
    32. input_grant <= 1'b0;
    33. end
    34. //****乘法运算****//
    35. always@(posedge clk or negedge rst)
    36. if(rst == 1'b0)
    37. out <= 11'd0;
    38. else case (cnt)
    39. 2'd0 : out <= d;
    40. 2'd1 : out <= (reg_d<<2)-reg_d;
    41. 2'd2 : out <= (reg_d<<3)-reg_d;
    42. 2'd3 : out <= (reg_d<<3);
    43. default : out <= 11'd0;
    44. endcase
    45. //*************code***********//
    46. endmodule

    测试代码:

    1. `timescale 1ns/1ns
    2. module tb_vl4();
    3. reg clk;
    4. reg rst;
    5. reg [7:0] d;
    6. wire input_grant;
    7. wire [10:0] out;
    8. //***时钟,复位,d信号赋值***//
    9. initial
    10. begin
    11. clk = 1'b0;
    12. rst = 1'b0;
    13. d = 8'd0;
    14. #30
    15. rst = 1'b1;
    16. d = 8'd8;
    17. #80
    18. d = 8'd9;
    19. #80
    20. d = 8'd10;
    21. end
    22. //***生成时钟信号***//
    23. always #10 clk =~clk;
    24. //***模块实例化***//
    25. vl4 vl4_inst
    26. (
    27. .d (d) ,
    28. .clk (clk) ,
    29. .rst (rst) ,
    30. .input_grant(input_grant) ,
    31. .out (out)
    32. );
    33. endmodule

    波形图:

    alt

  • 相关阅读:
    差分数组|AcWing 797. 差分| AcWing 798. 差分矩阵
    rsm包设计响应面试验并做数据分析
    硕士开题报告模板、博士专家推荐信、科研课题申报模板大全
    大数据之LibrA数据库系统告警处理(ALM-12033 慢盘故障)
    基于Java的磁盘调度模拟系统
    电脑重装系统后如何给系统磁盘扩容空间
    数据库升级问题总计(一)
    章节一: RASA开源引擎介绍
    Vue-进阶:路由及elementUI组合开发
    遮挡Windows电脑上烦人的微信/企业微信/钉钉消息闪烁提醒
  • 原文地址:https://blog.csdn.net/jk_101/article/details/132293895