《CPU设计实战》——实验学习

实验一——跑马灯(课本P35)

设计源文件

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2017/12/11 00:10:26
// Design Name: 
// Module Name: led
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module led #(
    parameter CNT_1S = 27'd38_196_600
)(
    input         clk,
    input         resetn,
    output reg [15:0] led
);

reg [26:0] cnt;
wire cnt_eq_1s;
assign cnt_eq_1s = cnt==CNT_1S;
always @(posedge clk)
begin
    if (!resetn)
    begin
        cnt <= 27'd0;
    end
    else if (cnt_eq_1s)
    begin
        cnt <= 27'd0;
    end
    else
    begin
        cnt <= cnt + 1'b1;
    end
end

always @(posedge clk)
begin
    if (!resetn)
    begin
        led <= 16'hfffe;
    end
    else if (cnt_eq_1s)
    begin
        led <= {led[14:0],led[15]};
    end
end
endmodule

  • 功能
    这段代码是一个Verilog模块,名为"led"。该模块根据输入时钟(clk)和复位信号(resetn)生成每秒一次的脉冲。脉冲用于在输出信号led中切换最高位(led[15])。

让我们逐步解析代码及其功能:

  1. 模块led有一个名为CNT_1S的参数,其值设置为38_196_600(27位十进制)。

  2. 模块有三个端口:

    • clk:输入时钟信号。
    • resetn:低电平有效的复位信号。
    • led:一个16位输出寄存器,表示LED模式。
  3. 在模块内部,有两个敏感于时钟信号clk上升沿的always块。

    • 第一个always块负责使用cnt寄存器计数秒数。在复位或计数器达到预定义值CNT_1S时,它将计数器(cnt)复位为零。否则,它将计数器增加一。

    • 第二个always块更新led信号。如果复位被激活,它将LED模式设置为16'hfffe。当计数器达到预定义值(CNT_1S)时,它将现有的LED模式向左移动一位,并将前一个最高位附加到最低位位置。

总之,这个Verilog模块在led输出上生成一个模式,其中最高位根据clk信号每秒切换一次。CNT_1S参数确定一个秒钟的持续时间,以时钟周期为单位。

设计约束文件

仿真源文件

你可能感兴趣的:(学习,fpga开发)