新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > 【从零开始走进FPGA】美好开始——我流啊流啊流

【从零开始走进FPGA】美好开始——我流啊流啊流

作者:时间:2015-01-26来源:网络收藏

  (2)clk_design.v模块设计

本文引用地址:http://www.amcfsurvey.com/article/268641.htm

  由于系统输入时钟是50Mhz,若以50MHz的速度变换LED等,人眼压根分辨不出来。因此利用分频原理,来对50MHz进行分频,而适应人眼。本模块将50MHz分频至10Hz,人眼分辨的极限是25Hz,因此10Hz能感觉得到(可以随机修改)。Led_en的频率计算公式:clk_led_en = 50_000000/(49_000000+1) = 10Hz,具体代码如下:

  module clk_design

  (

  input clk,

  input rst_n,

  output led_en

  );

  reg [22:0] cnt; //49_99999,100ms

  parameter LED_CNT = 49_999999;

  always@(posedge clk or negedge rst_n)

  begin

  if(!rst_n)

  cnt <= 23'd0;

  else if(cnt < LED_CNT)

  cnt <= cnt + 1'b1;

  else

  cnt <= 23'd0;

  end

  assign led_en = (cnt == 23'd49_99999) ? 1'b1 : 1'b0;

  endmodule

  模块没有分频产生10Hz的频率,而是生成了10Hz的使能时钟,目的是防止时钟满天飞,使得 内部布局布线紊乱,影响全局功能。虽然如此简单的工程可以不用考虑,但是“习惯了严谨便成为了一种风范”,因此使用使能时钟,来对具体的时序进行操作。具体使能时钟、门控时钟的异同、优劣将会在后续章节中解说。

  (3)led_display.v模块设计

  根据输入的led_en使能信号,来操作led灯的效果,此处采用最简单的算法——递增进位。代码如下所示:

  module led_display

  (

  input clk,

  input rst_n,

  input led_en,

  output reg [5:0] led_data

  );

  always@(posedge clk or negedge rst_n)

  begin

  if(!rst_n)

  led_data <= 6'b0;

  else if(led_en)

  led_data <= led_data + 1'b1;

  else

  led_data <= led_data;

  end

  endmodule

  (4)从新修改water_led_design顶层文件,添加相关例化模块。最后结果如下:

  module water_led_design

  (

  input clk, //global clock 50MHz

  input rst_n, //global clock reset

  output [5:0] led_data //user led interface

  );

  //-------------------------

  //generater clock 10Hz

  wire led_en;

  clk_design clk_design_inst

  (

  .clk (clk),

  .rst_n (rst_n),

  .led_en (led_en)

  );

  //-------------------------

  //set the display of led

  led_display led_display_inst

  (

  .clk (clk),

  .rst_n (rst_n),

  .led_en (led_en),

  .led_data (led_data)

  );

  endmodule

fpga相关文章:fpga是什么


c++相关文章:c++教程




关键词: FPGA Quartus II

评论


相关推荐

技术专区

关闭