FPGA入门笔记二 top_module与硬件映射关系

开始小试牛刀,开发板的LED,如有错误请不吝指正。

顶层设计文件,子文件都有module模块,但是只有顶层的 top_module端口列表需要与ucf文件中芯片引脚映射起来。


按照上篇设计RTL步骤来设计本功能:

功能定义与模块划分:上电后4个LED都灭,1秒后,从LED1到LED4轮流亮,每次亮1秒,然后全部亮1秒。循环如此。功能简单,只需一个模块。

定义所有模块的接口:时钟输入给一个计数器timer,高电平输出led。

设计时钟域:只需一个时钟。

考虑设计的关键路径:无

顶层设计:时钟控制时序(循环亮灭),逻辑控制功能

FSM 设计:无。Finite State Machine有限状态机,状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作,完成特定操作的控制中心。状态机分为摩尔(Moore)型状态机和米莉(Mealy)型状态机。目前理解还不够。

时序逻辑设计:任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态。画个时序的草图,6s一个循环。

组合逻辑设计:任意时刻的输出仅仅取决于该时刻的输入。根据计数器使用if...else...,判断是哪个灯即可


虽然分析了一遍,还是自己写不出来,根据源代码修改了一遍,有疑问的地方,再学习一段时间后再理解吧。

ucf文件:

##
NET clk LOC = T8 | TNM_NET = sys_clk_pin | IOSTANDARD = "LVCMOS33";
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;
##

########LED Pin define#####################
NET led<0>                  LOC = P4 | IOSTANDARD = "LVCMOS33";       ## LED1
NET led<1> 		    LOC = N5 | IOSTANDARD = "LVCMOS33";       ## LED2
NET led<2>                  LOC = P5 | IOSTANDARD = "LVCMOS33";       ## LED3
NET led<3>                  LOC = M6 | IOSTANDARD = "LVCMOS33";       ## LED4

.v文件

`timescale 1ns / 1ps

module led_test (
                  clk,           // 开发板上输入时钟: 50Mhz
                  led            // 输出LED灯,用于控制开发板上四个LED(LED1~LED4)
             );
             
input clk;
output [3:0] led;

//寄存器定义
reg [31:0] timer;  //为什么选择这种变量?
                
reg [3:0] led;     //?为什么选择这种变量,wire?

//===========================================================================
  always @(posedge clk)    //检测时钟的上升沿
    begin
      if (timer == 32'd299_999_999)    //开发板使用的晶振为50MHz,6秒计数(50M*6-1=249_999_999)
          timer <= 0;                       //计数器计到6秒,计数器清零
      else
	  timer <= timer + 1'b1;            //计数器加1
    end

//=========================== LED灯控制=====================================
  always @(posedge clk)   //检测时钟的上升沿
    begin
      if (timer == 32'd0)                        
          led <= 4'b0000;                  //LED灯输出全为灭          
      else if (timer == 32'd49_999_999)    //计数器计到1秒,
          led <= 4'b0001;                  //LED1亮,其他灭
      else if (timer == 32'd99_999_999)    //计数器计到2秒,
          led <= 4'b0010;                  //LED2
      else if (timer == 32'd149_999_999)   //计数器计到3秒,
          led <= 4'b0100;                  //LED3                           
      else if (timer == 32'd199_999_999)   //计数器计到4秒,
          led <= 4'b1000;                  //LED4
     else if (timer == 32'd249_999_999)   //
	  led <= 4'b1111;   
    end
 
endmodule

 
 
 

猜你喜欢

转载自blog.csdn.net/yangshoub/article/details/73928550
今日推荐