查看: 199|回复: 1

[原创] 从零开始学FPGA我的第6个实验理解状态机记录一下

[复制链接]

19

主题

2

好友

370

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    开心
    2016-9-21 20:33
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    发表于 2016-7-24 00:07:43 |显示全部楼层
    从零开始学FPGA我的第6个实验理解状态机记录一下
    状态机:有一段式。二段式。三段式(效率高,时序收敛信好)现在还不知道怎么让他们之间进行转换。
    下面是一个检查一个数据流(eeboard )的状态机
    代码:
    1. module hello(Clk,Rst_n,data,led);

    2.         input Clk;//50M
    3.         input Rst_n;//低电平复位
    4.        
    5.         input [7:0]data;
    6.        
    7.         output reg led;
    8.        
    9.         localparam
    10.                 CHECK_e1        = 7'b000_0001,
    11.                 CHECK_e2 = 7'b000_0010,
    12.                 CHECK_b        = 7'b000_0100,
    13.                 CHECK_o        = 7'b000_1000,
    14.                 CHECK_a        = 7'b001_0000,
    15.                 CHECK_r        = 7'b010_0000,
    16.                 CHECK_d        = 7'b100_0000;
    17.                
    18.         reg[6:0]state;
    19.        
    20.         always@(posedge Clk or negedge Rst_n)
    21.         if(!Rst_n)begin
    22.                 led <= 1'b1;
    23.                 state <= CHECK_e1;
    24.         end
    25.         else begin
    26.                 case(state)
    27.                         CHECK_e1:
    28.                                 if(data == "e")
    29.                                         state <= CHECK_e2;
    30.                                 else
    31.                                         state <= CHECK_e1;
    32.                        
    33.                         CHECK_e2:
    34.                                 if(data == "e")
    35.                                         state <= CHECK_b;
    36.                                 else
    37.                                         state <= CHECK_e1;
    38.                                        
    39.                         CHECK_b:
    40.                                 if(data == "b")
    41.                                         state <= CHECK_o;
    42.                                 else
    43.                                         state <= CHECK_e1;
    44.                                        
    45.                         CHECK_o:
    46.                                 if(data == "o")
    47.                                         state <= CHECK_a;
    48.                                 else       
    49.                                         state <= CHECK_e1;
    50.                                        
    51.                         CHECK_a:
    52.                                 if(data == "a")
    53.                                         state <= CHECK_r;
    54.                                 else       
    55.                                         state <= CHECK_e1;
    56.                                
    57.                         CHECK_r:
    58.                                 if(data == "r")
    59.                                         state <= CHECK_d;
    60.                                 else       
    61.                                         state <= CHECK_e1;
    62.                                        
    63.                         CHECK_d:
    64.                                 begin
    65.                                         state <= CHECK_e1;
    66.                                         if(data == "d")
    67.                                                 led <= ~led;
    68.                                         else
    69.                                                 led <= led;
    70.                                 end
    71.                                
    72.                         default:state <= CHECK_e1;
    73.                 endcase               
    74.         end

    75. endmodule
    复制代码
    测试代码testbeavh
    1. `timescale 1ns/1ns
    2. `define clock_period 20

    3. module hello_tb;
    4.        
    5.         reg Clk;
    6.         reg Rst_n;
    7.         reg [7:0]ASCII;
    8.        
    9.         wire led;       
    10.        
    11.         hello hello0(
    12.                 .Clk(Clk),
    13.                 .Rst_n(Rst_n),
    14.                 .data(ASCII),
    15.                 .led(led)
    16.         );
    17.        
    18.         initial Clk = 1;
    19.         always#(`clock_period/2)Clk = ~Clk;
    20.        
    21.         initial begin
    22.                 Rst_n = 0;
    23.                 ASCII = 0;
    24.                 #(`clock_period*200);
    25.                 Rst_n = 1;
    26.                 #(`clock_period*200 + 1);
    27.                 forever begin
    28.                         #(`clock_period);
    29.                         ASCII = "e";
    30.                         #(`clock_period);
    31.                         ASCII = "e";
    32.                         #(`clock_period);
    33.                         ASCII = "b";
    34.                        
    35.                         #(`clock_period);
    36.                         ASCII = "o";
    37.                         #(`clock_period);
    38.                         ASCII = "a";
    39.                         #(`clock_period);
    40.                         ASCII = "r";
    41.                         #(`clock_period);
    42.                         ASCII = "d";
    43.                         #(`clock_period);
    44.                                        
    45.                 end
    46.         end

    47. endmodule
    复制代码
    RTL测试:

    QQ截图20160724000549.png

    待续。。。。。。



    回复

    使用道具 举报

    553

    主题

    3

    好友

    1万

    积分

    翰林

    Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    擦汗
    2014-2-12 10:49
  • 签到天数: 150 天

    [LV.7]常住居民III

    发表于 2016-7-25 08:58:03 |显示全部楼层
    好帖子,支持
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-5 10:24 , Processed in 0.128895 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部