在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3992|回复: 3

[求助] 请教一个vivado上做Verilog的入门级问题!

[复制链接]
发表于 2015-6-11 18:14:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

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
 楼主| 发表于 2015-6-11 20:06:13 | 显示全部楼层
求人看看!
发表于 2015-6-11 20:58:10 | 显示全部楼层
不用搞这么复杂,
伪代码:
counter = (sw[15:11]==5'b11011) +
              (sw[14:10]==5'b11011) +
              .......
              (sw[4:0]==5'b11011) ;
大概就是这样的意思了,具体的实现方法有很多种
发表于 2015-6-27 17:22:57 | 显示全部楼层
seqdeta 模块的功能是检测连续输入的数据,
而seqdeta seq(clk,btn[3],din,dout)语句应该是相当于将seqdeta 模块例化了16次吧,每个例化只是输入固定1bit,如何能检测序列呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 00:35 , Processed in 0.016133 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表