搜索
bottom↓
回复: 16

发一个对调试很有用的开源IP核,来自OPENCORE.ORG,名为UART2BUS

[复制链接]

出0入0汤圆

发表于 2011-9-27 13:57:58 | 显示全部楼层 |阅读模式
http://opencores.org/project,uart2bus  
这是OPENCORES上为数不多经过认证的IP核之一。
在FPGA里面用上了这个核可以实现通过 UART 通讯方式 读写FPGA内部的用户自己定义的寄存器空间。
原作者对此核心的介绍如下:

Description
Have you ever needed a fast and easy way to test your new FPGA board?
You know you have all the interfaces but it will take time to finish the software or the verification just to start debugging.
This core might be what you are looking for.
The UART to Bus IP Core is a simple command parser that can be used to access an internal bus via a UART interface. The parser supports two modes of operation: text mode commands and binary mode commands. Text mode commands are designed to be used with a hyper terminal software and enable easy access to the internal bus. Binary mode commands are more efficient and also support buffered read & write operations with or without automatic address increment.

有一点补充 :此核心所能管理的地址空间是16位的,读写数据是8为的。

此核实际是由一个UART收发器和一个解析状态机两部分组成,占用资源很少,作者在不同的器件上综合结果列表如下:
UART2BUS核心资源占用情况 (原文件名:uart2bus_res.JPG)


这个核心是提供一种最简洁方式通过UART实现对内部FPGA内部资源的读写,所以实际使用的时候要看看UART部分 和BUS MASTER部分的协议。
UART2BUS这个核提供了两种控制模式,二进值和文本,由于在文本模式下可以直接使用串口终端进行通讯,我觉得使用文本模式比较好。
在数据手册的第7页有下面这个图:

文本控制模式读写协议 (原文件名:u2b_asc.GIF)


这部分通讯协议是简单的:比方说要对XXXX地址写内容为YY 只需要发送 "W XXXX YY " 就可以,无返回。
要读ZZZZ 地址的 只需要发送 "R ZZZZ " 之后就会接收到返回的ASC字符的16进数值。



作为BUS MASTER这部分,说明书里面只是简单描述了一下:

BUS MASTER端的简单描述 (原文件名:bus_maser_if.JPG)

这个描述虽然很短,但是也很明白了,如果还是有不明白,或是不确定的地方可以看我下面所给出的例子。


另外,关于这个IP的UART部分波特率计算,作者提供了一个脚本,好像要再MATHWORK下运行,我分析了一下,核心是一个求最大公约数,用C++ BUILDER 写了一个小工具,可以直接生成波特率设置代码,生成之后COPY 到UART2BUS_TOP.V 这个文件里面替代原来的D_BAUD_FREQ  和 D_BAUD_LIMIT  这两个预定义(大约在第20行),就可以根据你板子上以及所需要的波特率进行设置。实际测试完全正确。放心使用。
生成波特率配置参数的工具ourdev_680133WNOCQK.zip(文件大小:251K) (原文件名:U2B_BAUNDRATE.zip)

比如使用主频率时钟为100M 所需要的波特率为115200 需要输入100000000  以及115200。


uart2bus 波特率计算器 (原文件名:usb_baunrate.JPG)




一下是一个例子的顶层的TOP层,是在FPGA STARTER板子上编译运行通过的。包含有读写时序。

module str_u2b_top(
input rxd,clk_i,rst,
output txd,
output [7:0] led,
output  [7:0]  seg7_sel,
output  [7:0]  seg7_data ,
input [3:0]key,
input [7:0]sw,
output reg beep
);

wire clk;
assign clk = clk_i;
         PLL  PLL (
        .inclk0(clk_i),
        .c0(clk)
        );

wire [7:0] write_data;
reg  [7:0] read_data;
wire write,read;
wire [15:0] addr;

reg [7:0] keyr;
reg [7:0] swr ;

always @ (posedge clk) //input
begin
swr<=sw;
keyr<={4'b0,key[3:0]};
end

uart2bus_top  uart2bus_top
(
        .clock(clk),
        .reset(rst),
        .ser_in(rxd),
        .ser_out(txd),
        .int_address(addr),
        .int_wr_data(write_data),
        .int_write(write),
        .int_rd_data(read_data),
        .int_read(read)  
);

reg [7:0] dev_regs[15:0] ;

m_dynamic_seg7 m_dynamic_seg7(
.clk(clk),  
.data0(dev_regs[0]),
.data1(dev_regs[1]),
.data2(dev_regs[2]),
.data3(dev_regs[3]),
.data4(dev_regs[4]),
.data5(dev_regs[5]),
.data6(dev_regs[6]),
.data7(dev_regs[7]),  
.seg7_sel(seg7_sel),
.seg7_data(seg7_data)
);
integer i;
always @ (posedge clk)
if (rst)for(i=0;i<=15;i=i+1)dev_regs<=0;else
begin
dev_regs[8]<=swr;
dev_regs[9]<=keyr;
if (write) dev_regs[addr[3:0]]<= write_data ;  
end

always @ (posedge clk)
if (read) read_data <= dev_regs[addr[3:0]];

wire [23:0] cntr_lmt  = {dev_regs[13],dev_regs[12],dev_regs[11]}   ;
reg [23:0] cntr ;


always@(posedge clk)
if ((cntr == cntr_lmt)||(rst==1))cntr <=0;else
cntr<=cntr+1;

always @ (posedge clk)
if (dev_regs[14]==0)beep <= 0;else
if(cntr==0)beep<=~beep;

assign led = dev_regs[10] ;

endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-9-27 15:27:56 | 显示全部楼层
不会,帮顶

出0入0汤圆

发表于 2011-9-27 16:45:19 | 显示全部楼层
是wishbone总线的吗?

出0入0汤圆

 楼主| 发表于 2011-9-27 17:35:15 | 显示全部楼层
回复【2楼】korgo
是wishbone总线的吗?
-----------------------------------------------------------------------

不是的 但是时序和WB类似。

出0入0汤圆

发表于 2011-9-27 21:46:21 | 显示全部楼层
回复【3楼】mcupro  李伟
-----------------------------------------------------------------------

呵呵,不错
我认为用JTAG方式读写寄存器更好,比如使用altera的virtual JTAG模块

出0入0汤圆

发表于 2011-9-28 13:55:14 | 显示全部楼层
学习了,不错

出0入0汤圆

发表于 2011-9-28 16:20:08 | 显示全部楼层
这个有完整的工程吗?FPGA STARTER板子是哪个板子?

出0入0汤圆

发表于 2011-9-28 16:31:38 | 显示全部楼层
好东西,mark

出0入0汤圆

发表于 2011-10-4 15:31:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-8 22:52:46 | 显示全部楼层
不错,这样可以在线调试了~

出0入0汤圆

发表于 2011-11-20 15:43:53 | 显示全部楼层
下了一个,以后试试

出0入0汤圆

发表于 2011-12-2 17:29:46 | 显示全部楼层
16550的uart?

出0入0汤圆

 楼主| 发表于 2013-8-18 16:08:47 | 显示全部楼层
chencsw 发表于 2011-12-2 17:29
16550的uart?

不是的  自带的专门的UART

出0入0汤圆

发表于 2013-8-19 00:30:46 | 显示全部楼层
顶一下,以前自己写过类似的模块

出0入0汤圆

发表于 2013-11-29 14:37:47 | 显示全部楼层
楼主,能麻烦在上几张图片么??里面的(比方说要对XXXX地址写内容为YY 只需要发送 "W XXXX YY " 就可以)程序里面都没有看到额。。

出0入0汤圆

发表于 2013-11-29 17:13:39 | 显示全部楼层
楼主。。能麻烦把具体点的协议张贴出来么??

出0入0汤圆

发表于 2016-4-18 12:09:21 | 显示全部楼层
原文中有个小错误,正确的写数据格式应该
w XX YYYY CR  : XX表示十六进制的8-bit数据,YYYY表示十六进制的32-bit地址,CR表示回车(Carriage Return)
来个例子w 55 0007 CR,表示向0x0007地址写入数据0x55  
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 01:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表