这是我们作业中的一个实验,要求是通过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模块。。
- //top文件
- `timescale 1ns / 1ps
- module seqdeta_top(
- input wire clk,
- input wire[3:3] btn,
- input wire[15:0] sw,
- output wire[6:0] a_to_g,
- output wire [3:0] an,
- output wire dp
- );
- reg [3:0] dout;
- reg din;
- reg [15:0] data;
- integer i;
- always @(posedge sw)
- begin
- dout=4'h0;//清零操作
- data<=sw[15:0];
- for(i=15;i>=0;i=i-1)
- begin
- din<=data;
- seqdeta seq(clk,btn[3],din,dout);//计算模块
- end
- end
- wire [15:0] x;
- assign x[3:0]=dout;
- x7seg x7(clk,x,btn[3],a_to_g,an,dp);//显示模块
- endmodule
- //deqdeta文件
- module seqdeta(
- input wire clk,
- input wire clr,
- input wire din,
- output wire[3:0] dout
- );
- reg [2:0] present_state, next_state;
- parameter S0 = 3'b000, S1 = 3'b001, S2 = 3'b010,
- S3 = 3'b011, S4 = 3'b100,S5=3'b101; // states
- //State registers
- always @(posedge clk or posedge clr)
- begin
- if( clr == 0)
- present_state <= S0;
- else
- present_state <= next_state;
- end
- //C1 module
- always @(*)
- begin
- case(present_state)
- S0: if(din == 1)
- next_state <= S1;
- else
- next_state <= S0;
- S1: if(din == 1)
- next_state <= S2;
- else
- next_state <= S0;
- S2: if(din == 0)
- next_state <= S3;
- else
- next_state <= S2;
- S3: if(din == 1)
- next_state <= S4;
- else
- next_state <= S0;
- S4: if(din == 1)
- next_state <= S5;
- else
- next_state <= S0;
- S5:if(din==1)
- next_state <= S2;
- else
- next_state <= S3;
- default: next_state <= S0;
- endcase
- end
- //C2 module
- always @(*)
- begin
- if(next_state == S5)
- dout = dout+1;
- end
- endmodule
复制代码
一周热门 更多>