[verilog] 统计数据中1的个数的问题

[复制链接]
5932|6
 楼主| 比神乐 发表于 2023-7-29 08:33 | 显示全部楼层 |阅读模式
verilog程序
  1. module ones(clk,rst,count_1);
  2. input clk;
  3. input rst;
  4. inout reg [3:0]  count_1;
  5. reg [3:0] j;
  6. reg [3:0] i;
  7. reg [3:0] k;




  8. endmodule
test bench程序
  1. `timescale 1 ns/ 1 ps
  2. module ones_vlg_tst();
  3. // constants                                          
  4. // general purpose registers
  5. //reg eachvec;
  6. // test vector input registers
  7. reg clk;
  8. reg [3:0] treg_count_1;
  9. reg rst;
  10. // wires                                               
  11. wire [3:0]  count_1;
  12. reg [3:0] j;
  13. reg [3:0] i;
  14. reg [3:0] k;
  15. reg [3:0] count;
  16. // assign statements (if any)                          
  17. assign count_1 = treg_count_1;
  18. ones i1 (
  19. // port map - connection between master ports and signals/registers   
  20.         .clk(clk),
  21.         .count_1(count_1),
  22.         .rst(rst)
  23. );
  24. initial                                                
  25. begin                                                  
  26. // code that executes only once                        
  27. // insert code here --> begin                          
  28.                                                       
  29. // --> end                                             
  30. $display("Running testbench");                       
  31. end                                                   
  32. initial                                               
  33. // optional sensitivity list                           
  34. // @(event1 or event2 or .... eventn)                  
  35. begin                                                  
  36. // code executes for every event on sensitivity list   
  37. // insert code here --> begin                          
  38. clk=0;
  39. forever
  40. #10 clk=~clk;                                                      
  41.                                           
  42. // --> end                                             
  43. end   
  44. initial                                               
  45. // optional sensitivity list                           
  46. // @(event1 or event2 or .... eventn)                  
  47. begin                                                  
  48. // code executes for every event on sensitivity list   
  49. // insert code here --> begin                          
  50. rst=1;
  51. #15 rst=0;
  52. #15 rst=1;
  53. #1000 $stop;                             
  54. // --> end                                             
  55. end  
  56. always @(posedge clk or negedge rst)   
  57. begin
  58. if(!rst)
  59.         begin
  60.                 i<=4'd0;
  61.                 count<=4'd0;
  62.                 treg_count_1<=4'd0;
  63.        
  64.         end
  65. else
  66.         begin
  67.                 treg_count_1<=4'd0;
  68.                 for(j=0;j<=3;j=j+1)
  69.                         begin
  70.                                 k<=i;
  71.                                 if((k&4'b0001)==4'b0001)
  72.                                         begin
  73.                                                 treg_count_1<=treg_count_1+1;
  74.                                                
  75.                                        
  76.                                         end
  77.                                 if((k&4'b0010)==4'b0010)
  78.                                         begin
  79.                                                 treg_count_1<=treg_count_1+1;
  80.                                                
  81.                                        
  82.                                         end
  83.                                 if((k&4'b0100)==4'b0100)
  84.                                         begin
  85.                                                 treg_count_1<=treg_count_1+1;
  86.                                                
  87.                                        
  88.                                         end
  89.                                 if((k&4'b1000)==4'b1000)
  90.                                         begin
  91.                                                 treg_count_1<=treg_count_1+1;
  92.                                                
  93.                                        
  94.                                         end
  95.                                 end
  96.                 count<=treg_count_1;
  97.                 i<=(i+1);
  98.                 $display("%d,%d\n",treg_count_1,count);
  99.                 //treg_count_1<=4'd0;
  100.                 //count<=4'd0;
  101.         end
  102. end                                               
  103. endmodule

运行结果:

明显不对。请问高手,哪里出错了?谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
LcwSwust 发表于 2023-7-29 11:23 | 显示全部楼层
你把FPGA当单片机了?
按我的理解,整个always, treg_count_1<=其实只会执行一次,或者最后的一次才有效.
for循环应该是将内部的语句(或电路)进行复制,不是C语言程序的循环.
每个语句,你得想一下它会生成怎样的电路.
地瓜patch 发表于 2023-7-29 18:13 | 显示全部楼层
单片机思维
 楼主| 比神乐 发表于 2023-7-29 18:58 | 显示全部楼层
LcwSwust 发表于 2023-7-29 11:23
你把FPGA当单片机了?
按我的理解,整个always, treg_count_1

谢谢!其实我看苏阳的《那些年,我们拿下了FPGA》。第十一章有一个例子,
对输入的数据中1的个数进行统计。
代码块如下:
  1. always @(posedge clk)
  2. begin
  3.         if(!rst)
  4.                 begin
  5.                         count_1=4'd0;
  6.                 end
  7.         else
  8.                 begin
  9.                         count_14'd0;
  10.                         for(j=0;j<=3;j=j+1)
  11.                                 begin
  12.                                         if(data[j])
  13.                                                 count_1=count_1+1;
  14.                                         else;
  15.                                 end

  16.                 end
  17. end
  18. iuziji
我觉得不对,就自己改了一下,谁知没改对。
水管工S 发表于 2023-8-14 15:19 | 显示全部楼层
这是什么软件,怎么一直clk=0也能运行
ta1ent 发表于 2023-8-28 17:14 | 显示全部楼层
你可以看下综合后生成的电路是什么。现在eda工具都比较智能,其实是会生成for循环展开后的电路的。
 楼主| 比神乐 发表于 2023-10-28 09:49 | 显示全部楼层
水管工S 发表于 2023-8-14 15:19
这是什么软件,怎么一直clk=0也能运行

有clk上升沿啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部