[IP实例]vivado VIO (virtual input output)虚拟IO使用

一般情况下ILA和VIO都是用在chipscope上使用,VIO可以作为在chipscope时模拟IO。

譬如:
在使用chipscope时需要使用按键出发,但是没有设计按键或者板子不再身边,所以需要模拟按键输入还有其他信号的输出。
参数配置,配置输入探针数量和输出探针数量。分别可以设置0-256个。

probe in ports参数配置,配置数据探针位宽

probe out port:参数配置输出探针的数据位宽,及初始化数据(in hex)

在hw_vio界面加入配置的输入及输出探针,并且对应的参数可以设置.
1、模拟的按键IO,可以设置成active_high buttom.
2、对于输出参数,可以设置成text
对于里面设置的值,就是触发后信号保持的状态数据

在hw_ILA界面,将ila的信号探针数据加入Trigger setup和waveform中。只要在

number of windows:指采样窗口个数。
window data depth:采样深度,要考虑能完整采样一帧数据以上,图上采样深度是128K = 131072 / 1024
trigger position in window:窗口出发位置就是指红色那根T线。设置一个参数为的是能正常等待出发。如果设置这个值为0,那么就不需要任何触发按键或者触发源来触发。所以需要设定一个值

按启动运行按钮,让ila处于waiting for trigger模式,等待出发,然后再hw_vios上触发模拟复位按钮,

就会出发对应的信号。

代码实例化如图所示。
ILA_wrapper ILA(
	.clk 	( ),
	.probe0 ( ),
	.probe1 ( ),
	.probe_out0 ( ),
	.probe_out1 ( ),
	.probe_in0 ( )
);


<think>好的,用户需要的是一个包含三种不同模式的流水灯Verilog代码,并且要通过ILA进行监控,同时使用VIO控制。首先,我得确定流水灯的三种模式具体是什么。常见的有顺序点亮、逆序、以及交替闪烁。不过用户没有明确说明,可能需要假设或询问,但根据问题描述,用户可能希望直接给出示例模式,所以先假定为顺序、逆序和双向扫描。 接下来,Verilog代码的结构需要模块化,包含时钟分频、模式切换、灯的控制逻辑。需要定义输入输出端口,包括时钟、复位、VIO的控制信号,以及LED的输出。模式切换可以通过VIO输入的模式选择信号来控制,比如两位的模式选择信号可以支持四种模式,但用户需要三种,所以两位足够,其中三种有效。 然后,时钟分频模块是必要的,因为流水灯通常需要较慢的时钟,比如1Hz,而系统时钟可能较高,如100MHz。分频器通过计数器实现,生成使能信号驱动状态变化。 模式控制部分,根据VIO输入的模式选择信号,切换不同的LED状态。每个模式对应一个always块,通过case语句处理不同模式下的LED行为。例如,模式0是顺序右移,模式1是左移,模式2是交替闪烁等。需要确保每个模式下LED的状态变化符合预期,并且在切换模式时能正确初始化。 ILA监控需要捕获LED的状态、模式选择信号以及计数器值,以便调试。VIO控制则用于动态调整模式,无需重新编译代码。需要实例化ILA和VIOIP核,连接相关信号。 代码完成后,需要检查语法是否正确,信号是否连接正确,尤其是ILA和VIO的例化部分。同时,测试各个模式的功能,确保在VIO控制下能正确切换,并且ILA能捕获到预期的信号变化。 可能的问题点包括分频器的正确性,模式切换时的状态初始化,以及ILA和VIO的端口连接是否正确。需要确保在FPGA工程中添加了相应的IP核,并正确设置时钟和复位信号。 最后,用户可能需要知道如何生成ILA和VIOIP核,以及如何在Vivado中设置调试探头,这部分可能需要额外的指导,但根据用户的问题,主要提供代码实现,因此代码中需要包含ILA和VIO的例化部分,并注释说明需要生成的IP核参数。</think>### 三模式流水灯Verilog实现与ILA监控 #### 1. 系统设计框架 本设计包含三种流水灯模式(顺序右移/左移/双向扫描),通过VIO控制模式切换,ILA实时监控信号。系统结构如下: $$ f_{clk} = 100MHz \rightarrow \text{分频器} \rightarrow \text{模式控制器} \rightarrow LED[2:0] $$ ILA监控信号包括:LED状态、模式选择、计数器值[^1] #### 2. Verilog核心代码 ```verilog module led_controller( input clk, // 100MHz时钟 input rst_n, // 复位 output [2:0] led // 三路LED ); // VIO控制信号 wire [1:0] mode_sel; vio_0 vio_inst ( .clk(clk), .probe_in0(led), .probe_out0(mode_sel) ); // 分频器:1Hz使能信号 reg [26:0] cnt; wire en = (cnt == 27'd99_999_999); always @(posedge clk) begin cnt <= en ? 27'd0 : cnt + 1; end // 流水灯控制 reg [2:0] led_state; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin led_state <= 3'b001; end else if(en) begin case(mode_sel) 2'b00: // 模式0:右移 led_state <= {led_state[0], led_state[2:1]}; 2'b01: // 模式1:左移 led_state <= {led_state[1:0], led_state[2]}; 2'b10: // 模式2:双向扫描 led_state <= (led_state == 3'b100) ? 3'b001 : (led_state << 1) | (led_state >> 1); default: led_state <= 3'b001; endcase end end assign led = led_state; // ILA实例化 ila_0 ila_inst ( .clk(clk), .probe0(led), .probe1(mode_sel), .probe2(cnt[7:0]) ); endmodule ``` #### 3. 关键实现细节 1. **VIO配置**:需在Vivado中创建Virtual IO核,设置: - 输入端口:2位模式选择信号 - 输出端口:3位LED状态反馈 2. **ILA配置**: ```tcl create_debug_core u_ila_0 ila set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0] set_property C_PROBE0_WIDTH 3 [get_debug_cores u_ila_0] // LED状态 set_property C_PROBE1_WIDTH 2 [get_debug_cores u_ila_0] // 模式选择 set_property C_PROBE2_WIDTH 8 [get_debug_cores u_ila_0] // 计数器采样 ``` 3. **模式说明**: - **模式0**:$LED_n = \{LED_{n-1}\}$(右移循环) - **模式1**:$LED_n = \{LED_{n+1}\}$(左移循环) - **模式2**:$LED_n = LED_{n-1} \oplus LED_{n+1}$(双向扫描) #### 4. 调试建议 1. 通过VIO控制界面实时切换模式 2. 在ILA波形中观察: - 模式切换时的状态跳变 - 计数器达到$2^{27}-1$时的归零时序 - LED状态变化的同步性
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hyunnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值