ZYNQ-制作自定义AXI呼吸灯IP

简介: ZYNQ-制作自定义AXI呼吸灯IP

学习内容


本节使用正点原子提供的呼吸灯实验的Verilog代码用于实现AXI接口的呼吸灯的IP。在 Vivado 软件中,我们可以很方便的通过创建和封装 IP 向导的方式来自定义 IP 核。

开发环境


vivado 18.3&SDK

PYNQ-Z2开发板

自定义AXI 接口IP制作流程


首先打开Vivado软件,在Tasks这里选择New IP lacation

image.png

点击next,对IP的信息进行设置,这里我们使用默认配置即可。设置好我们IP要保存的位置。

image.png

点击Tools中的创建和封装新的IP选项,

image.png

点击NEXT ,选择我们的封装类型。

image.png

这里我们要选择AXI接口的设计,所以选择AXI4 接口,然后点击NEXT。出现下面的界面,我们可以对我们的IP的基本信息进行设计,设置我们的IP的名字、显示名、描述、位置、版本号等。

image.png

这里设置IP的接口为Slave,设置为从机,数据位宽设置为默认。寄存器数量设置为最少即可这里就是4个。

image.png

设置完成后,在IP 的目录下就会出现我们设置好的ip,这里的IP只实现了AXI的接口,没有对呼吸灯的功能进行定义。

在我们的IP目录下,我们选中我们设计的IP右键,编辑我们的IP。

image.png

们的IP的顶层的模块进行例化。

image.png

这里给出的是正点原子的呼吸灯模块代码。

module breath_led(
    input          sys_clk        , //时钟信号
    input          sys_rst_n      , //复位信号
    input          sw_ctrl        , //呼吸灯开关控制信号 1:亮 0:灭
    input          set_en         , //设置呼吸灯频率设置使能信号
    input   [9:0]  set_freq_step  , //设置呼吸灯频率变化步长
    output         led              //LED
);
//*****************************************************
//**                  main code
//*****************************************************
//parameter define
parameter  START_FREQ_STEP = 10'd100; //设置频率步长初始值
//reg define
reg  [15:0]  period_cnt  ;      //周期计数器
reg  [9:0]   freq_step   ;      //呼吸灯频率间隔步长
reg  [15:0]  duty_cycle  ;      //设置高电平占空比的计数点
reg          inc_dec_flag;      //用于表示高电平占空比的计数值,是递增还是递减
                                //为1时表示占空比递减,为0时表示占空比递增
//wire define
wire         led_t       ;
//将周期信号计数值与占空比计数值进行比较,以输出驱动led的PWM信号
assign led_t = ( period_cnt <= duty_cycle ) ? 1'b1 : 1'b0 ;
assign led = led_t & sw_ctrl;
//周期信号计数器在0-50_000之间计数
always @ (posedge sys_clk) begin
    if (!sys_rst_n)
        period_cnt <= 16'd0;
    else if(!sw_ctrl)
        period_cnt <= 16'd0;
    else if( period_cnt == 16'd50_000 )
        period_cnt <= 16'd0;
    else
        period_cnt <= period_cnt + 16'd1;
end
//设置频率间隔
always @(posedge sys_clk) begin
    if(!sys_rst_n)
        freq_step <= START_FREQ_STEP;
    else if(set_en) begin
        if(set_freq_step == 0)
            freq_step <= 10'd1;
        else if(set_freq_step >= 10'd1_000)
            freq_step <= 10'd1_000;
        else    
            freq_step <= set_freq_step;
    end        
end
//设定高电平占空比的计数值
always @(posedge sys_clk) begin
    if (sys_rst_n == 1'b0) begin
        duty_cycle <= 16'd0;
        inc_dec_flag <= 1'b0;
    end     
    else if(!sw_ctrl) begin          //呼吸灯开关关闭时,信号清零
        duty_cycle <= 16'd0;
        inc_dec_flag <= 1'b0;
    end    
    //每次计数完了一个周期,就调节占空比计数值
    else if( period_cnt == 16'd50_000 ) begin
        if( inc_dec_flag ) begin  //占空比递减
            if( duty_cycle == 16'd0 )     
                inc_dec_flag <= 1'b0;
            else if(duty_cycle < freq_step)
                duty_cycle <= 16'd0;
            else    
                duty_cycle <= duty_cycle - freq_step;
        end
        else begin  //占空比递增
            if( duty_cycle >= 16'd50_000 )  
                inc_dec_flag <= 1'b1;
            else
                duty_cycle <= duty_cycle + freq_step;
        end 
    end 
    else  //未计数完一个周期时,占空比保持不变
        duty_cycle <= duty_cycle ;
end
endmodule

可以保存到和IP的路径相同的HDL文件夹下。

image.png

在Vivado下保存导入工程后,我们打开下面的文件,然后对我们的呼吸灯的IP的信息进行添加,这里xilinx给出的原始AXI接口模板留的有给用户添加代码的地方,为了便于维护和寻找,我们就在对应的位置添加信息即可。

添加parameters信息:

image.png

添加接口信息:

image.png

将添加的呼吸灯IP进行实例化调用(在V文件文末添加):

image.png

完成添加后,我们还需要在顶层文件对参数进行声明定义,同时要定义下呼吸灯接口。

image.png

同时也要在实例化的模块下添加相关信息。

image.png

image.png

image.png

打开我们的参数配置界面,对刚刚添加的参数进行配置

image.png

选择参数在GUI界面可见,之前显示的隐藏参数将会更新到customization parameters里。显示名字可以自己定义,参数的类型这里设置成long。因为在正点提供的代码中,频率的步进范围是1-1000所以这里IP也就设置成1-1000。默认值这里给出了100。(可以任意设置)

image.png

上面的IP设置全部通过后,根据以下操作完成IP的重新封装配置。

image.png

完成后添加IP,即可和其他IP一样配置信息进行使用啦。

image.png

Vuko公众号同步更新~


欢迎大家关注我的公众号。如果需要工程微信后台留言即可~

目录
相关文章
|
编解码
STM32:PWM驱动舵机(内含:1.接线原理图/实物图+2.代码部分+3.补充知识部分)
STM32:PWM驱动舵机(内含:1.接线原理图/实物图+2.代码部分+3.补充知识部分)
792 1
STM32:PWM驱动舵机(内含:1.接线原理图/实物图+2.代码部分+3.补充知识部分)
|
11月前
|
芯片
LED 是如何发光的?工作原理及种类介绍
发光二极管( LED) 是一种半导体器件,当电流通过时会发出可见光。LED 用于各种应用,包括电子设备上的指示灯、交通信号和照明标志。在本文中,我们将讨论 LED 的工作原理、特性和应用。
320 0
LabVIEW控制Arduino实现PWM呼吸灯(基础篇—5)
利用LIAT中的模拟I/O函数库,通过LabVIEW和Arduino Uno控制板实现LED灯亮度的调节,产生灯会呼吸的效果。
LabVIEW控制Arduino实现RGB调色灯(基础篇—6)
利用LIAT中的RGB函数库,通过LabVIEW控制Arduino Uno控制板实现RGB调色。
LabVIEW控制Arduino LED灯闪烁(基础篇—2)
利用LIAT中的数字I/O函数库,通过LabVIEW控制Arduino Uno控制板上D13管脚上LED灯,实现等间隔闪烁。
LabVIEW控制Arduino流水灯(基础篇—3)
利用LIAT中的数字I/O函数库,通过LabVIEW控制Arduino Uno控制板上多个管脚上LED灯,实现依次点亮,依次熄灭,形成流水灯效果。
|
11月前
|
存储 IDE 物联网
Blinker 语音控制 51单片机 点灯
Blinker 语音控制 51单片机 点灯
219 0
|
异构计算
FPGA项目二:4位闪烁灯设计(下)
FPGA项目二:4位闪烁灯设计
128 1
FPGA项目二:4位闪烁灯设计(下)
|
异构计算
FPGA项目二:4位闪烁灯设计(上)
FPGA项目二:4位闪烁灯设计
209 0
FPGA项目二:4位闪烁灯设计(上)

热门文章

最新文章