集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

FPGA初级课程第三讲 流水灯

[复制链接]
 楼主| lcytms 发表于 2016-11-1 15:31:30 | 显示全部楼层
下面我们来进行建模和仿真下板。
新建一个工程文件夹。

设计代码如下:
/*
模块名称:ledrun
模块功能:四个灯做流水,每一个灯亮一秒钟
编写时间:2016-08-12
作者:至芯科技----奋斗的小孩
邮箱:zxopenhxs@126.com
*/
module ledrun (clk, rst_n, led);
        input clk;
        input rst_n; //低电平有效
        output reg [3:0] led;

        parameter T1s = 50_000_000;//参数设置
        reg [25:0] count;//计数器(需要计数50M个周期)
        reg [1:0] state;//四个状态
        localparam         s0 = 2'b00,//定义四个状态机参数
                                s1 = 2'b01,
                                s2 = 2'b10,
                                s3 = 2'b11;
        always @ (posedge clk or negedge rst_n)
                begin
                        if (!rst_n)
                                begin
                                        state <= s0;
                                        count <= 26'd0;
                                        led <= 4'b0000;
                                end
                        else
                                begin//状态机的关键字case()&#8226;&#8226;&#8226;endcase
                                        case(state) //按照设计的状态转移图进行描述
                                        s0        :         begin
                                                                if (count < T1s - 1)
                                                                        begin
                                                                                led <= 4'b0111;
                                                                                state <= s0;
                                                                                count <= count + 1;
                                                                        end
                                                                else
                                                                        begin
                                                                                count <= 0;
                                                                                state <= s1;
                                                                        end
                                                        end
                                        s1         :         begin
                                                                if (count < T1s - 1)
                                                                        begin
                                                                                led <= 4'b1011;
                                                                                state <= s1;
                                                                                count <= count + 1;
                                                                        end
                                                                else
                                                                        begin
                                                                                count <= 0;
                                                                                state <= s2;
                                                                        end
                                                        end
                                        s2        :         begin
                                                                if (count < T1s - 1)
                                                                        begin
                                                                                led <= 4'b1101;
                                                                                state <= s2;
                                                                                count <= count + 1;
                                                                        end
                                                                else
                                                                        begin
                                                                                count <= 0;
                                                                                state <= s3;
                                                                        end
                                                        end
                                        s3         :         begin
                                                                if (count < T1s - 1)
                                                                        begin
                                                                                led <= 4'b1110;
                                                                                state <= s3;
                                                                                count <= count + 1;
                                                                        end
                                                                else
                                                                        begin
                                                                                count <= 0;
                                                                                state <= s0;
                                                                        end
                                                        end
                                        default        :         state <= s0;
                                        endcase
                                end
                end
endmodule
 楼主| lcytms 发表于 2016-11-1 15:32:31 | 显示全部楼层
解析:
parameter T1s = 50_000_000;参数设置。我们可以在例化时改变它。
下板时,我们让参数为50_000_000,仿真时,我们让参数为5。
如果仿真50_000_000时间将会很长,我们只做一下简单的验证就可以。
计数器计数为什么到50_000_000 – 1?
我们的本地晶振是50MHz,周期为20ns。
如果计数到1秒钟的话,应该需要计50_000_000个数。
假设我们要计5个数,从0开始计,那么到4(5-1)就可以了。
 楼主| lcytms 发表于 2016-11-1 15:35:01 | 显示全部楼层
下面在激励中,笔者给大家讲解怎么样在例化时改变参数。
激励代码如下:
/*
模块名称:ledrun_tb
模块功能:为ledrun模块提供激励信号
编写时间:2016-08-12
作者:至芯科技----奋斗的小孩
邮箱:zxopenhxs@126.com
*/
`timescale 1ns/1ps
module ledrun_tb;
        reg clk;
        reg rst_n; //低电平有效
        wire [3:0] led;
        parameter T1s = 5;//参数设置(仿真时)
        initial begin
                clk = 1'b1;
                rst_n = 1'b0;
                # 200.1//复位200.1ns
                rst_n = 1'b1;
                # 2000
                $stop;
        end
        always #10 clk = ~clk;//50M
        ledrun #(T1s)//参数传递
                ledrun_dut(
                                .clk(clk),
                                .rst_n(rst_n),
                                .led(led)
                        );
endmodule
 楼主| lcytms 发表于 2016-11-1 15:38:18 | 显示全部楼层
设置仿真。
仿真波形如下图所示。
从仿真出来的波形来看,第一:led灯在流水(低电平在流水)。第二:每一个led灯亮5个周期(我们设置的仿真时是5个周期)。

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-1 15:42:26 | 显示全部楼层
设计正确,下板即可验证。如果小伙伴的电路原理和笔者的不一样,请自行更改设计。
参照.tcl文件设置好FPGA管脚


参照EP4CE10F17C8Nzx_1.tcl文件内容,对FPGA芯片管脚进行设置。

EP4CE10F17C8Nzx_1.tcl文件相关内容如下所示。FPGA芯片配置结果如图所示。

        #set_global_assignment -name FAMILY "Cyclone IV"
        #set_global_assignment -name DEVICE ep4ce10f17c8n

set_location_assignment PIN_E1    -to    clk         
# LED
set_location_assignment PIN_T12   -to   LED[0]         
set_location_assignment PIN_P8    -to   LED[1]         
set_location_assignment PIN_M8    -to   LED[2]         
set_location_assignment PIN_M10   -to   LED[3]         
       
# KEY 轻触按键
set_location_assignment PIN_L3    -to   key[0]     

     

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-1 15:45:56 | 显示全部楼层
.sof文件下载到FPGA
全编译FPGA工程,生成.sof文件,连接至芯ZX-1开发板并上电。
打开Programmer通过Jtag口,将.sof文件下载到FPGA进行在线仿真。
.sof文件下载界面如下图所示。

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-1 15:49:16 | 显示全部楼层
开发板运行效果

开发板运行效果如下图所示。
经检查,开发板运行效果与设计相符。

本帖子中包含更多资源

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

x
 楼主| lcytms 发表于 2016-11-1 15:50:04 | 显示全部楼层
好了,今天的课程就讲到这里。
通过今天的课程,我们学习了状态机的基本知识,并通过对流水灯电路进行建模、仿真和下板检查。
希望大家建立对状态机的理解,并结合具体电路要求进行实现。更复杂的知识和技巧我们将逐步通过后面的课程展现给大家。

课程到此结束,谢谢大家的关注!
zxopen08 发表于 2016-12-14 13:58:49 | 显示全部楼层
FPGA初级课程第三讲 流水灯
辉煌 发表于 2016-12-24 09:32:38 | 显示全部楼层
感谢 FPGA初级课程第三讲 流水灯 分享
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-19 12:05 , Processed in 0.141476 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表