• FPGA刷题——信号发生器+冒泡法求6个数中的最小值


     最近做了一些公司的笔试题,和牛客网上的题还是很重合的!坚定了我继续刷题的目标!更新2道比较难的题:

    目录

    信号发生器

    方波

    锯齿波

    三角波

     冒泡法排序


    信号发生器

    这道题比较难,想了很久才写出满意的程序。首先,方波的周期是20,锯齿波的周期是21,三角波的周期是40,且wave的最大值是20。题目没有明确告知,我是从其他人的题解中知道的。下面分别分析一下三种波形如何产生。

    方波

    方波模式需注意wave在什么时候翻转。设置一个计数器cnt,计数范围是0-19。该计数器仅在方波模式也就是wave_choise==0时工作。

    1

    2

    3

    wave <= cnt ==9 20:

            cnt ==190 :

            wave;

    cnt值在0~9时,wave==20;当cnt值在10~19时,wave==0。也就是wave应在cnt==10时从0变为20。但由于非阻塞赋值,cnt==10时,wave应对cnt==9是否成立进行判断。cnt==19也是同样原因。

     

    锯齿波

    锯齿波比较简单。wave产生锯齿波时,需要从0增加到20,所以周期是21。 当wave增加到20时,清零。

    1

    wave <= wave==200: wave+1;

    三角波

    三角波模式需要设置一个标志位flagflag仅在三角波模式也就是wave_chosie==2时工作。当flag==0时,wave减少;当flag==1时,wave增加。

    1

    wave <= flag==0 ? wave-1: wave+1;

    由波形图得知,刚进入三角波模式时,wave是下降的,所以flag的默认值是0。wave在最小值0和最大值20时,flag应进行翻转。同样由于是非阻塞赋值,所以wave上升到19时,flag从1到0,也就是flag <= wave==19&&flag==1? 0: flagwave下降到1时,flag从0到1,也就是flag <= wave==1&&flag==0? 1: flag

    完整代码如下:

    1. `timescale 1ns/1ns
    2. module signal_generator(
    3. input clk,
    4. input rst_n,
    5. input [1:0] wave_choise,
    6. output reg [4:0]wave
    7. );
    8. reg [4:0] cnt;
    9. reg flag;
    10. // 方波模式下,计数器控制
    11. always@(posedge clk or negedge rst_n) begin
    12. if(~rst_n)
    13. cnt <= 0;
    14. else
    15. cnt <= wave_choise!=0 ? 0:
    16. cnt ==19? 0:
    17. cnt + 1;
    18. end
    19. // 三角波模式下,标志位控制
    20. always@(posedge clk or negedge rst_n) begin
    21. if(~rst_n)
    22. flag <= 0;
    23. else
    24. flag <= wave_choise!=2 ? 0:
    25. wave ==1 ? 1:
    26. wave ==19? 0:
    27. flag;
    28. end
    29. // 更新wave信号
    30. always@(posedge clk or negedge rst_n) begin
    31. if(~rst_n)
    32. wave <= 0;
    33. else
    34. case(wave_choise)
    35. 0 : wave <= cnt == 9? 20 :
    36. cnt ==19? 0 :
    37. wave;
    38. 1 : wave <= wave==20? 0 : wave+1;
    39. 2 : wave <= flag==0 ? wave-1: wave+1;
    40. default: wave <= 0;
    41. endcase
    42. end
    43. endmodule

     冒泡法排序

    求6个数中的最小值,且保证索引值不变,输入输出已经给出,如下:

    1. module MinValue
    2. (
    3. input InClk,
    4. input [7:0]InData0,
    5. input [7:0]InData1,
    6. input [7:0]InData2,
    7. input [7:0]InData3,
    8. input [7:0]InData4,
    9. input [7:0]InData5,
    10. input [7:0]InData6,
    11. output [7:0]OutMinValue,
    12. output [2:0]OutMinIndex
    13. );

    首先,我们定义6个寄存器,寄存输入的6个数据,由于题目要求索引值不改变,再设置6个寄存器寄存每一个数据的索引值:

    1. reg [7:0] MinValue1;
    2. reg [7:0] MinValue2;
    3. reg [7:0] MinValue3;
    4. reg[7:0]MinValue4;
    5. reg [7:0]MinValue5;
    6. reg[7:0]MinValue6;
    7. reg[2:0]MinIndex1;
    8. reg[2:0]MinIndex2;
    9. reg[2:0]MinIndex3;
    10. reg[2:0]MinIndex4;
    11. reg[2:0]MinIndex5;
    12. reg[2:0]MinIndex6;

    根据冒泡排序的原理,如果数据a>数据b,b是目前的最小值,则交换a和b的数值(同时交换a和b的索引值),a就成为了目前的最小值。数据a<数据b,a本身就是目前的最小值,则无需交换。再用a与其他数据进行比较:

    1. always @(posedge InClk ) begin
    2. if (Indata0<=Indata1) begin//数据0小于1
    3. MinValue1<=InData0;//数据1成原先的数据0
    4. MinIndex1<=3'd0;//数据1索引变成数据0的
    5. end
    6. else begin
    7. MinValue1<=Indata1;//数据1本来就是最小值,索引不变
    8. MinIndex1<=3'd1;
    9. end
    10. end
    11. always @(posedge InClk ) begin
    12. if (Indata2<=Indata3) begin
    13. MinValue2<=InData2;
    14. MinIndex2<=3'd2;
    15. end
    16. else begin
    17. MinValue2<=Indata3;
    18. MinIndex2<=3'd3;
    19. end
    20. end
    21. always @(posedge InClk ) begin
    22. if (Indata4<=Indata5) begin
    23. MinValue3<=InData4;
    24. MinIndex3<=3'd4;
    25. end
    26. else begin
    27. MinValue3<=Indata5;
    28. MinIndex3<=3'd5;
    29. end
    30. end

    经过上面的操作,(数据0和数据1比较)最小值是数据1,(数据2和数据3比较)最小值是数据1,(数据4和数据5比较)最小值是数据3。

    接下来对数据1,2,3进行比较:首先比较数据1和数据2,较小的给数据4,数据3赋给数据5;再比较数据4和数据5,较小的给数据6,至此,数据6就是最小的数据了

    1. always @(posedge InClk ) begin
    2. if (MinValue1<=MinValue2) begin
    3. MinValue4<=MinValue1;
    4. MinIndex4<=MinIndex1;
    5. end
    6. else begin
    7. MinValue4<=MinValue2;
    8. MinIndex4<=MinIndex2;
    9. end
    10. end
    11. always @(posedge InClk ) begin
    12. MinValue5<=MinValue3;
    13. MinIndex5<=MinIndex3;
    14. end
    15. always @(posedge InClk ) begin
    16. if (MinValue4<=MinValue5) begin
    17. MinValue6<=MinValue4;
    18. MinIndex6<=MinIndex4;
    19. end
    20. else begin
    21. MinValue6<=MinValue5;
    22. MinIndex6<=MinIndex5;
    23. end
    24. end
    25. assign OutMinValue = MinValue6;
    26. assign OutMinIndex =MinIndex6;

    冒泡排序的顺序都是可以自己定义的,不一定非要1~n,只要每次冒泡完成之后将数据值交换+索引交换即可!

  • 相关阅读:
    云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准
    1042 Shuffling Machine
    解决问题:已通过系统pip安装了相应模块,但是PyCharm中却提示 No module named xxxx
    Java并发编程学习二:线程安全
    练习-Java输入输出之随机IO流之向文件中指定位置添加内容
    Android学习笔记 73. 隐式intent
    webstorm 创建express项目
    [python] 利用 Pydoc 快速生成整个 Python 项目的文档
    【力扣】剑指offer第二天
    [人工智能-综述-12]:第九届全球软件大会(南京)有感 -1-程序员通过大模型增强自身软件研发效率的同时,也在砸自己的饭碗
  • 原文地址:https://blog.csdn.net/weixin_46188211/article/details/126076888