vivado上做Verilog,for循环语句出现问题

2019-07-15 23:49发布

这是我们作业中的一个实验,要求是通过basys3实验板上的16个开关,手动输入一个0101字串(sw),然后检测11011字串出现的次数,并将结果显示在7段显示器上(a_to_g控制)。
其中seqdeta 是一个计算模块,输入的din表示当前数字,通过状态转移,如果匹配到11011字串,那么dout+1;
我是想每次sw也就是按钮拨动事,让dout清零,然后做一次16位的for循环,最后把dout结果输出到屏幕上。

但是实际结果是:起始dout设置为几,那么最后输出的就是几,seqdeta 这个模块并没有对dout产生作用,急急急!
是不是for循环不能这么用?因为source中显示我的top文件只有x7seg显示模块,没有seqdeta模块。。
  1. //top文件
  2. `timescale 1ns / 1ps

  3. module seqdeta_top(
  4. input wire clk,
  5. input wire[3:3] btn,
  6. input wire[15:0] sw,
  7. output wire[6:0] a_to_g,
  8. output wire [3:0] an,
  9. output wire dp
  10. );
  11. reg [3:0] dout;
  12. reg din;
  13. reg [15:0] data;

  14. integer i;
  15. always @(posedge sw)
  16. begin
  17.     dout=4'h0;//清零操作
  18.     data<=sw[15:0];
  19.     for(i=15;i>=0;i=i-1)
  20.     begin
  21.         din<=data;
  22.         seqdeta seq(clk,btn[3],din,dout);//计算模块
  23.     end
  24. end


  25. wire [15:0] x;
  26. assign x[3:0]=dout;
  27. x7seg x7(clk,x,btn[3],a_to_g,an,dp);//显示模块
  28. endmodule


  29. //deqdeta文件
  30. module seqdeta(
  31. input wire clk,
  32. input wire clr,
  33. input wire din,
  34. output wire[3:0] dout
  35. );
  36. reg [2:0] present_state, next_state;
  37. parameter S0 = 3'b000, S1 = 3'b001, S2 = 3'b010,
  38. S3 = 3'b011, S4 = 3'b100,S5=3'b101; // states
  39. //State registers
  40. always @(posedge clk or posedge clr)
  41. begin
  42.     if( clr == 0)
  43.         present_state <= S0;
  44.     else
  45.         present_state <= next_state;
  46. end
  47. //C1 module
  48. always @(*)
  49. begin
  50. case(present_state)
  51.     S0: if(din == 1)
  52.             next_state <= S1;
  53.         else
  54.             next_state <= S0;
  55.     S1: if(din == 1)
  56.             next_state <= S2;
  57.         else
  58.             next_state <= S0;
  59.     S2: if(din == 0)
  60.             next_state <= S3;
  61.         else
  62.             next_state <= S2;
  63.     S3: if(din == 1)
  64.             next_state <= S4;
  65.         else
  66.             next_state <= S0;
  67.     S4: if(din == 1)
  68.             next_state <= S5;
  69.         else
  70.             next_state <= S0;
  71.     S5:if(din==1)
  72.             next_state <= S2;
  73.          else
  74.             next_state <= S3;
  75.     default: next_state <= S0;
  76.     endcase
  77. end

  78. //C2 module
  79. always @(*)
  80. begin
  81.     if(next_state == S5)
  82.         dout = dout+1;
  83. end
  84. endmodule
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。