mcupro 发表于 2011-9-27 13:57:58

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

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收发器和一个解析状态机两部分组成,占用资源很少,作者在不同的器件上综合结果列表如下:http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_680113U1I13G.JPG
UART2BUS核心资源占用情况 (原文件名:uart2bus_res.JPG)


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


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



作为BUS MASTER这部分,说明书里面只是简单描述了一下:
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_680127LQ5YZN.JPG
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。

http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_680231F0ULKB.JPG
uart2bus 波特率计算器 (原文件名:usb_baunrate.JPG)




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

module str_u2b_top(
input rxd,clk_i,rst,
output txd,
output led,
outputseg7_sel,
outputseg7_data ,
input key,
input sw,
output reg beep
);

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

wire write_data;
reg read_data;
wire write,read;
wire addr;

reg keyr;
reg swr ;

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

uart2bus_topuart2bus_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 dev_regs ;

m_dynamic_seg7 m_dynamic_seg7(
.clk(clk),
.data0(dev_regs),
.data1(dev_regs),
.data2(dev_regs),
.data3(dev_regs),
.data4(dev_regs),
.data5(dev_regs),
.data6(dev_regs),
.data7(dev_regs),
.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<=swr;
dev_regs<=keyr;
if (write) dev_regs]<= write_data ;
end

always @ (posedge clk)
if (read) read_data <= dev_regs];

wire cntr_lmt= {dev_regs,dev_regs,dev_regs}   ;
reg cntr ;


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

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

assign led = dev_regs ;

endmodule

zzw223226 发表于 2011-9-27 15:27:56

不会,帮顶

korgo 发表于 2011-9-27 16:45:19

是wishbone总线的吗?

mcupro 发表于 2011-9-27 17:35:15

回复【2楼】korgo
是wishbone总线的吗?
-----------------------------------------------------------------------

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

lanliang714 发表于 2011-9-27 21:46:21

回复【3楼】mcupro李伟
-----------------------------------------------------------------------

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

jm2011 发表于 2011-9-28 13:55:14

学习了,不错

wzh6328 发表于 2011-9-28 16:20:08

这个有完整的工程吗?FPGA STARTER板子是哪个板子?

zeta1989 发表于 2011-9-28 16:31:38

好东西,mark

kneken 发表于 2011-10-4 15:31:52

mark

gaoyukun 发表于 2011-10-8 22:52:46

不错,这样可以在线调试了~

gc56198 发表于 2011-11-20 15:43:53

下了一个,以后试试

chencsw 发表于 2011-12-2 17:29:46

16550的uart?

mcupro 发表于 2013-8-18 16:08:47

chencsw 发表于 2011-12-2 17:29 static/image/common/back.gif
16550的uart?

不是的自带的专门的UART

zkf0100007 发表于 2013-8-19 00:30:46

顶一下,以前自己写过类似的模块

书生 发表于 2013-11-29 14:37:47

楼主,能麻烦在上几张图片么??里面的(比方说要对XXXX地址写内容为YY 只需要发送 "W XXXX YY " 就可以)程序里面都没有看到额。。

书生 发表于 2013-11-29 17:13:39

楼主。。能麻烦把具体点的协议张贴出来么??

liucoldstarplus 发表于 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
页: [1]
查看完整版本: 发一个对调试很有用的开源IP核,来自OPENCORE.ORG,名为UART2BUS