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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1888|回复: 4

[求助] 请问这个程序有什么问题呢

[复制链接]
发表于 2016-11-15 03:52:41 | 显示全部楼层 |阅读模式
20资产
本帖最后由 GreatGBL 于 2016-11-15 03:59 编辑

大家好,我想利用verilog软件做出如下功能
在四位晶体管上仅有一根晶体管亮,设置板子上的四个按钮分别为上下左右,用来控制那一根亮的晶体管的移动。
如图所式,按左按钮,晶体管左移。
特别注意的,当晶体管移到尽头时,不会越界(比如晶体管在最左边,再按左不会再移动)

根据这个简单的游戏,我写了如下代码,但是运行有问题,晶体管会到处跑,并且有时候按了"上",晶体管移动了,但是送开"上",晶体管又回到之前的位置了,非常奇怪。自己检查了几天也没发现问题,感觉FPGA的基础不牢固,因此请大家帮忙看看逻辑哪里出问题了

123.png
这里我的位置(pos)关系定义如下
亮灯顺序为 12312312.png
an 00 最右边亮
an 01 右边第二盏亮
an 10 左边第二盏亮
an 11 最左边亮
-----------------------------------------------------------------------------------------------
module MiniGame_New(
input logic clk,reset,
input logic up,down,left,right,

output logic [6:0]BCD_show,
output logic [3:0]an_show
    );

logic [2:0]pos;  //晶体管的位置
logic [1:0]an;   //晶体管在哪个7位显示屏上面

//译码器
BCD U1(.Data(pos),.BCD(BCD_show));
an U2 (.Data(an),.an(an_show));

always_comb
          begin
              if(up)
              begin
               an <= an;
               case(pos)
               3'b000 : pos = 3'b101;
               3'b001 : pos = 3'b000;
               3'b010 : pos = 3'b110;
               3'b011 : pos = 3'b100;
               3'b100 : pos = 3'b101;
               3'b101 : pos = 3'b101;
               3'b110 : pos = 3'b101;
               endcase
               end   

            else if(down)
              begin   
               an <= an;
               case(pos)
               3'b000 : pos = 3'b001;
               3'b001 : pos = 3'b010;
               3'b010 : pos = 3'b010;
               3'b011 : pos = 3'b010;
               3'b100 : pos = 3'b011;
               3'b101 : pos = 3'b110;
               3'b110 : pos = 3'b010;
               endcase
               end   

            else  if(left)
             begin   
             case(pos)
             3'b000 : pos=3'b100;
             3'b001 : pos=3'b011;
            default :
             begin   
             if(an==2'b11 )
               an <= an;
             else
                an <= an + 1'b1;

             if(pos==3'b101 && an==2'b11)
                pos = 3'b100;
             else if(pos==3'b010 && an==2'b11)
                pos = 3'b011;
             end
             endcase  
             end

            else if(right)
              begin   
              case(pos)
              3'b100 : pos=3'b000;
              3'b011 : pos=3'b001;
             default :
              begin   
              if(an==2'b00)
               an <= an;
              else   
                 an <= an - 1'b1;
             if(pos==3'b101 && an==2'b00)
                    pos = 3'b000;
                 else if(pos==3'b010 && an==2'b00)
                    pos = 3'b001;
              end
              endcase
              end
    end

endmodule


-----------------------------------------------------------------------------------------------
module BCD(
    input  logic [2:0] Data,        //input data
    output logic [6:0] BCD         //output data for display
    );

always_comb
    begin
      case(Data)
      3'b000 : BCD = 7'b1011111;
      3'b001 : BCD = 7'b1101111;
      3'b010 : BCD = 7'b1110111;
      3'b011 : BCD = 7'b1111011;
      3'b100 : BCD = 7'b1111101;
      3'b101 : BCD = 7'b0111111;
      3'b110 : BCD = 7'b1111110;
      default : BCD = '1;
       endcase
    end;
endmodule

-----------------------------------------------------------------------------------------------

module an(
    input  logic [1:0] Data,        //input data
    output logic [3:0] an         //output data for display
    );

always_comb
    begin
      case(Data)
      2'b00  :an = 4'b1110;
      2'b01  :an = 4'b1101;
      2'b10  :an = 4'b1011;
      2'b11  :an = 4'b0111;
      default : an = '1;
       endcase
    end;
endmodule

-----------------------------------------------------------------------------------------------
非常感谢大家的解答!!!

发表于 2016-11-15 10:16:41 | 显示全部楼层
你的语法看不懂,always_comb是什么??

时钟呢?
发表于 2016-11-15 12:03:08 | 显示全部楼层
always_comb是systemverilog的语法,声明生成组合逻辑。
关键是没时钟,全靠电路自身delay延时,没法控制。
发表于 2016-11-15 16:51:03 | 显示全部楼层
时钟呢?请问时钟呢。
 楼主| 发表于 2016-11-16 00:42:38 | 显示全部楼层
是要加时钟的吗?请问我用状态机的方法可以吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-3 03:13 , Processed in 0.023674 second(s), 8 queries , Gzip On, Redis On.

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