|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
这是我们作业中的一个实验,要求是通过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[i];
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 |
|