uart总线功能模型试验

实验目的

本实验的目的是为了一个开源的UART(以下简称op_uart)模块编写总线功能模型,在测试平台对UART模块进行功能验证,在下一个tinycore验证试验,在tinycore中会包含另一个实现方式不同的UART模块,op_uart模块及其BFM可以在tinycore验证试验中反复使用,与tinycore进行通信。总线功能模型的框图如下:在这里插入图片描述

UART模块介绍

下面将开源UART简称为 op_uart, incore中的UART称为tuat,关于tuar的说明见《UART说明》这篇文档。op_uart简述如下:
1、支持发送和接收数据能力。
2、支持8-N-1和8-N-2的数据传输格式:即8位数据位、没有奇偶校验位、1位起始位、1位或者2位停止位。
3、每接收到个新的数据,便会断言iq中断信号;每发送个新的数据,便会断言iq中断信号;持续时间一个周期。

opua寄存器列表如下:
在这里插入图片描述
op_uart参数列表:
在这里插入图片描述
op_uart 信号列表:
在这里插入图片描述
写时序:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从以上介绍可以看出,虽然op_uart和ti_uart是两个不同的UART模块,使用它们的方法是差不多的,都是通过 对UART模块内部寄存器进行读写,从而达到控制UART行为的目的

实验代码导读

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

test case解析

通过一系列的任务调用来构造合适的 test case ———— 调用Set_thru任务来设置op_uart工作方式;调用 Send任务来控制op_uart发送数据;调用Rx_stimulus任务来模拟op_uart的接收数据。可以看出,通过模 块化的封装使得测试平台变得可重用、易使用、结构清晰易维护。
在这里插入图片描述

实验要求

将harness.sv文件中的代码补全,使得test case 可以正常运行,并通过观察波形来验证设计的正确性。

试验代码


`include "define.vh"
module harness;
	reg				sys_clk;
	reg				sys_rst;

	reg		[13:0]	csr_a;
	reg				csr_we;
	reg		[31:0]	csr_di;
	wire	[31:0]	csr_do;
	
	wire			rx_irq;
	wire			tx_irq;

	reg				uart_rx;
	wire			uart_tx;

// 
	op_uart #(
		.csr_addr (`CSR_ADDR),
		.clk_freq ( `CLK_FREQ),
		.baud	  ( `BAUD	)
	) u_uart (
		.sys_clk	(sys_clk),
		.sys_rst	(sys_rst),
		.csr_a		(csr_a),
		.csr_we		(csr_we),
		.csr_di		(csr_di),
		.csr_do		(csr_do),
		.rx_irq		(rx_irq),
		.tx_irq		(tx_irq),
		.uart_rx	(uart_rx),
		.uart_tx	(uart_tx)
	);	

initial begin
	sys_clk = 0;
	sys_rst = 0;
	csr_a = 0;
	csr_we = 0;
	csr_di = 0;
	uart_rx = 1;
end

//clock generator
	always 
	begin
		#(`CYCLE/2) sys_clk <= 1'b0;
		#(`CYCLE/2) sys_clk <= 1'b1;
	end

// sync reset
	task Sync_rst;
	begin
		sys_rst = 1'b0;
		wait (sys_clk !== 1'bx);
		@(negedge sys_clk);
		sys_rst <= 1'b1;
		@(negedge sys_clk);
		@(negedge sys_clk);
		sys_rst <= 1'b0;	
	end       
	endtask 

//settings 
	task Set_thru;
		input	sel;
	begin
		@(negedge sys_clk);
		csr_we = 1;
		csr_a = {12'h0,2'b10};
		csr_di = {31'b0, sel};
		@(negedge sys_clk);
		csr_we = 0;	
	end
	endtask 

//send data
	task Send;
		input	[7:0]	data;
	begin 
        @(negedge sys_clk);
		csr_we = 1;
		csr_a = {4'h0,8'b0,2'b00};
		csr_di = {24'b0,data};
		@(negedge sys_clk);
		csr_we = 0;
	
//补充代码,对op_uart施加符合op_uart接口时序协议的激励,使得op_uart的输出端口uart_tx发送出正确数据。
		   
	end	
	endtask

//rx stimulus//接受的激励
	task Rx_stimulus;
		input [7:0] data;
		begin
//补充代码,模拟op_uart的输入端口uart_rx的时序行为,使得op_uart从uart_rx中解析出正确的数据。     
		end 	
	endtask 

endmodule 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
在使用HAL库进行UART总线空闲中断时,需要进行以下步骤: 1. 在原有的串口1中断服务函数中添加代码,判断是否是空闲中断,并进行相应的处理。例如,可以使用`__HAL_UART_GET_FLAG`函数判断是否是空闲中断,使用`__HAL_UART_CLEAR_IDLEFLAG`函数清除空闲中断标志,使用`HAL_UART_DMAStop`函数停止DMA传输,使用`HAL_UART_Receive_DMA`函数重新打开DMA接收。\[1\] 2. 重定义串口发送完成回调函数,在这里清空标志位。可以使用`HAL_UART_TxCpltCallback`函数,在函数中判断是否是USART1实例,然后释放总线。\[2\] 3. 使用空闲中断进行串口接收。一般情况下,我们使用RXNE中断,在接收到一个字节数据时进入中断并将其放入缓存。但是当数据量很大时,频繁进入中断会影响单片机的时效性。此时可以使用IDLE空闲中断,在接收到一段数据后,在一定的时间内检测到没有数据到来,就认为串口总线空闲,并产生一个空闲中断。\[3\] 以上是使用HAL库进行UART总线空闲中断的步骤。 #### 引用[.reference_title] - *1* *2* [STM32-UART 空闲中断+DMA发送接收](https://blog.csdn.net/my_id_kt/article/details/122412078)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32 hal库串口空闲中断最新用法](https://blog.csdn.net/qq_47159466/article/details/124542339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

能饮一杯吴?

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

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

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

打赏作者

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

抵扣说明:

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

余额充值