数字IC笔试题 ——Nvidia前端设计2018

转:https://blog.csdn.net/bleauchat/article/details/91397848

 

4、 Asyncfifo design using Verilog


 
 
  1. module asyn_fifo(
  2. input wclk ,
  3. input rst_n ,
  4. input wr_en ,
  5. input [ 7 : 0] data_in ,
  6. output full ,
  7. input rclk ,
  8. input rd_en ,
  9. output reg [ 7: 0] data_out ,
  10. output empty
  11. );
  12. reg [ 7 : 0 ] mem[ 7 : 0] ;
  13. wire [ 2: 0] r_addr , w_addr ;
  14. reg [ 3: 0] binary_r_addr , binary_w_addr ;
  15. wire [ 3: 0] gray_r_addr , gray_w_addr ;
  16. reg [ 3: 0] gray_r_addr_reg , gray_w_addr_reg ;
  17. assign gray_r_addr = ( binary_r_addr >> 1 ) ^ binary_r_addr;
  18. assign gray_w_addr = ( binary_w_addr >> 1 ) ^ binary_w_addr;
  19. assign r_addr = gray_r_addr[ 2: 0] ;
  20. assign w_addr = gray_w_addr[ 2: 0] ;
  21. always@(posedge rclk or negedge rst_n ) begin
  22. if(~rst_n) begin
  23. binary_r_addr <= 4 'b0 ;
  24. gray_w_addr_reg <= 4 'b0 ;
  25. data_out <= 8 'b0 ;
  26. end
  27. else begin
  28. gray_w_addr_reg <= gray_w_addr ;
  29. if(rd_en == 1 'b1 && empty == 1'b0) begin
  30. data_out <= mem[r_addr] ;
  31. binary_r_addr <= binary_r_addr + 1 'b1 ;
  32. end
  33. end
  34. end
  35. always@(posedge wclk or negedge rst_n) begin
  36. if(~rst_n) begin
  37. binary_w_addr <= 4 'b0 ;
  38. gray_r_addr_reg <= 4 'b0 ;
  39. end
  40. else begin
  41. gray_r_addr_reg <= gray_r_addr ;
  42. if(wr_en == 1 'b1 && full == 1'b0 )begin
  43. mem[w_addr] <= data_in ;
  44. binary_w_addr <= binary_w_addr + 1 'b1 ;
  45. end
  46. end
  47. end
  48. assign empty = (gray_r_addr == gray_w_addr_reg) ? 1: 0 ;
  49. assign full = ( (gray_w_addr[ 3] !== gray_r_addr_reg[ 3]) && (gray_w_addr[ 2] !== gray_r_addr_reg[ 2]) &&(gray_w_addr[ 1: 0] == gray_r_addr_reg[ 1: 0]) ) ? 1: 0 ;
  50. endmodule

 

 

 


 
 
  1. module sequence_detect(
  2. input clk,
  3. input rst_n,
  4. input [ 7: 0] stringB_in,
  5. input stringB_en ,
  6. input stringB_over ,
  7. output reg [ 4: 0] location,
  8. output reg out_valid
  9. );
  10. reg [ 4: 0] location_reg_count;
  11. always @ (posedge clk or negedge rst_n) begin
  12. if(!rst_n)
  13. location_reg_count <= 5 'd0;
  14. else if(stringB_en == 1 'b1 && stringB_over == 1'b0) begin
  15. location_reg_count <= location_reg_count+ 1;
  16. end
  17. end
  18. reg [ 4: 0] location_reg;
  19. always @ (posedge clk or negedge rst_n) begin
  20. if(!rst_n)
  21. location_reg <= 0;
  22. else if (stringB_en == 1 'b1 && stringB_over == 1'b0 ) begin
  23. if(stringB_in == "n" || stringB_in == "v" || stringB_in == "i" ||stringB_in == "d" || stringB_in == "a") begin
  24. location_reg <= location_reg_count ;
  25. end
  26. else begin
  27. location_reg <= location_reg ;
  28. end
  29. end
  30. end
  31. always @ (posedge clk or negedge rst_n) begin
  32. if(!rst_n)
  33. out_valid <= 0;
  34. else if (stringB_over == 1 'b1 ) begin
  35. location <= location_reg ;
  36. out_valid <= 1 'b1;
  37. end
  38. else begin
  39. location <= 0 ;
  40. out_valid <= 1 'b0;
  41. end
  42. end
  43. endmodule

 


 
 
  1. #include <stdio.h>
  2. #include "malloc.h"
  3. void NumSort(int *number, int numbersize);
  4. int *intersection_numbers(int *number1, int numbersize1, int *number2, int numbersize2,int *intersection_size);
  5. int *union_numbers(int *number1, int numbersize1, int *number2, int numbersize2, int *union_size);
  6. void NumSort(int *number, int numbersize) {
  7. int min, temp;
  8. int i;
  9. int j;
  10. for (i = 0; i<numbersize - 1; i++) {
  11. min = i;
  12. for (j = i + 1; j<numbersize; j++) {
  13. if (number[min]>number[j]) {
  14. min = j;
  15. }
  16. }
  17. if (min != i) {
  18. temp = number[min];
  19. number[min] = number[i];
  20. number[i] = temp;
  21. }
  22. }
  23. }
  24. int *intersection_numbers(int *number1, int numbersize1, int *number2, int numbersize2,int *intersection_size) {
  25. int temp, i, j;
  26. int *result = ( int *) malloc(numbersize1 * sizeof( int));
  27. *intersection_size = 0;
  28. NumSort(number1, numbersize1);
  29. NumSort(number2, numbersize2);
  30. temp = number1[numbersize1 - 1] + number2[numbersize2 - 1];
  31. for (i = 0, j = 0; i<numbersize1&&j<numbersize2;) {
  32. if (number1[i]>number2[j]) {
  33. j++;
  34. }
  35. else if (number1[i]<number2[j]) {
  36. i++;
  37. }
  38. else {
  39. if (temp != number1[i]) {
  40. result[(*intersection_size)++] = number1[i];
  41. temp = number1[i];
  42. }
  43. i++;
  44. j++;
  45. }
  46. }
  47. return result;
  48. }
  49. int* union_numbers(int* number1, int numbersize1, int* number2, int numbersize2,int *union_size) {
  50. int temp, i, j;
  51. int *result = ( int *) malloc((numbersize2 + numbersize1) * sizeof( int));
  52. NumSort(number1, numbersize1);
  53. NumSort(number2, numbersize2);
  54. i = 0;
  55. j = 0;
  56. *union_size = 0;
  57. temp = number1[numbersize1 - 1] + number2[numbersize2 - 1];
  58. for (i = 0, j = 0; i<numbersize1 || j<numbersize2;) {
  59. if (j != numbersize2 && number1[i]>number2[j]) {
  60. result[(*union_size)++] = number2[j];
  61. j++;
  62. }
  63. else if (i != numbersize1 && number1[i]<number2[j]) {
  64. result[(*union_size)++] = number1[i];
  65. i++;
  66. }
  67. else if (j == numbersize2 && number1[i]>number2[j]) {
  68. result[(*union_size)++] = number1[i];
  69. i++;
  70. }
  71. else if (i == numbersize1 && number1[i]<number2[j]) {
  72. result[(*union_size)++] = number2[j];
  73. j++;
  74. }
  75. else {
  76. if (temp != number1[i]) {
  77. result[(*union_size)++] = number1[i];
  78. temp = number1[i];
  79. }
  80. i++;
  81. j++;
  82. }
  83. }
  84. return result;
  85. }
  86. int main(int argc, char *argv[])
  87. {
  88. int a[ 10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  89. int i;
  90. int b[ 10] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
  91. int intersection_size = 0 ;
  92. int union_size = 0 ;
  93. int *p = intersection_numbers(&a[ 0], 10, &b[ 0], 10,&intersection_size);
  94. printf( "\n +++++ array a :\n");
  95. for (i = 0; i< 10; i++) {
  96. printf( " %d\n", a[i]);
  97. }
  98. printf( "\n +++++ array b :\n");
  99. for (i = 0; i< 10; i++) {
  100. printf( " %d\n", b[i]);
  101. }
  102. printf( "++++++ intersection of the array a && b\n");
  103. for (i = 0; i<intersection_size;) {
  104. printf( " %d\n", p[i]);
  105. i++;
  106. }
  107. int *p1 = union_numbers(&a[ 0], 10, &b[ 0], 10, &union_size);
  108. printf( "++++++ union of the array a || b\n");
  109. for (i = 0; i<union_size;) {
  110. printf( " %d\n", p1[i]);
  111. i++;
  112. }
  113. getchar();
  114. }

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值