完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
亲爱的,我从这里下载了正确的i2c从代码。但我发现模拟的结果是不正确的,sda_sr和
scl_sr计数器不起作用。 如果我将clr_in改为syc信号,或者使用两个always语句(不能systhisis),可以得到正确的模拟结果。 为什么? //去抖,然后延迟去抖信号进行边缘检测 总是@(posedge clk_in或posedge clr_in) if(clr_in) 开始 sda_sr SDA was_sda scl_sr SCL was_scl 结束 其他 开始 sda_sr if(sda_sr == 4'b0000)sda 否则如果(sda_sr == 4'b1111)sda was_sda scl_sr if(scl_sr == 4'b0000)scl 否则如果(scl_sr == 4'b1111)scl was_scl 结束 以上来自于谷歌翻译 以下为原文 dear all,i download a correct i2c slave code from here.but i found the result of simulation is uncorrect,sda_sr and scl_sr counters didn't work. if i changed the clr_in to syc signal,or used two always statement(can't systhisis),can get correct simulation result. why ? // Debounce, then delay debounced signals for edge detection always @ (posedge clk_in or posedge clr_in) if (clr_in) begin sda_sr <= 4'b1111; sda <= 1; was_sda <= 0; scl_sr <= 4'b1111; scl <= 1; was_scl <= 0; end else begin sda_sr <= {sda_sr[2:0], sda_io}; if (sda_sr == 4'b0000) sda <= 0; else if (sda_sr == 4'b1111) sda <= 1; was_sda <= sda; scl_sr <= {scl_sr[2:0], scl_in}; if (scl_sr == 4'b0000) scl <= 0; else if (scl_sr == 4'b1111) scl <= 1; was_scl <= scl; end |
|
相关推荐
8个回答
|
|
你能详细说明它是如何起作用的吗?
代码是 一个漂亮的straigtht-forward移位寄存器与异步 clr_in处于活动状态时设置。 有些事要检查你的 试验台: 1)确保clr_in被置位至少100 ns以避免出现问题 全局设置和复位信号(参见glbl.v)。 2)这种设计要求时钟频率明显高于 I2C比特率。 10 MHz或更高频率应与标准100 KHz I2C配合使用。 问候, 的Gabor - Gabor 以上来自于谷歌翻译 以下为原文 Can you elaborate a bit on how it doesn't work? The code is a pretty straigtht-forward shift register with asynchronous set when clr_in is active. Some things to check in your testbench: 1) Make sure clr_in is asserted for at least 100 ns to avoid issues with the global set and reset signal (see glbl.v). 2) This design expects the clock frequency to be significantly higher than the I2C bit rate. 10 MHz or more should work with standard 100 KHz I2C. Regards, Gabor -- Gabor |
|
|
|
|
|
|
|
gszakacs,谢谢你的回复。
我知道代码是你的,我很高兴有机会收到你的信息。 我只是研究了几天的verilog,所以仍然需要长时间走路才能走路。 我确定测试代码满足条件,并上传源代码和模拟结果 在网上,你可以看到我说的结果。 谢谢你 期待你的回复! 耐寒 attachment.rar 100 KB 以上来自于谷歌翻译 以下为原文 gszakacs,thank you for your reply. i know the code is yours,i'm glad have chance to recieve your information. i just study the verilog for several days,so still have long disdance to walk. I sure the test code satisfy the condition,and i upload the source code and simulation result to the web,you can see the result as i said . thank you indeed expect your reply! hardy attachment.rar 100 KB |
|
|
|
我看到发生了什么。
clr_in应该是活跃的高, 因此,您的移位寄存器将在整个模拟过程中保持复位状态。 改变测试台,最初将clr_in驱动为高,然后降低 至少100 ns后。 HTH, 的Gabor - Gabor 以上来自于谷歌翻译 以下为原文 I see what's happening. clr_in is supposed to be active high, so your shift registers are being held reset through the entire simulation. Change you test bench to initially drive clr_in high and then low after at least 100 ns. HTH, Gabor -- Gabor |
|
|
|
天啊,我犯了一个愚蠢的错误,
因为我曾经是一个信号测试仪,在上升沿完成所有复位条件,然后系统可以正常工作。 所以我认为它是一样的 非常感谢你! 以上来自于谷歌翻译 以下为原文 oh my god,i make a stupid mistake, because i ever was a signal tester,complete all the reset conditions at the rising edge,then system can work normal. so i think it's the same thank you very much! |
|
|
|
亲爱的Gabor Szakacs:
我读了你的I2C从代码,我发现它不能支持块访问,对吧? 因为在数据阶段,第一个字节是字节数,然后是数据。 你的设计需要额外的rom,问题是支持哪种rom? rom满足你的协议吗? 并且,因为读写访问是在不同的总线, 但在正常情况下,读取数据与访问同一地址时的写入数据相同, 当通过两种命令(读/写)访问时,如何将相同的数据保存在同一地址中 是否可以使用IO数据总线,让读写共享呢? 谢谢你! 以上来自于谷歌翻译 以下为原文 dear Gabor Szakacs: I read your I2C slave code, I found it can't support the block access,right? because at the data phase,the first byte is byte number then are datas. your design needs a extra rom,the question is which kind of rom is supported ? is the rom satisfy the protocol of yours? and,because the read and write access are in different bus, but at normal the read datas are the same with the write datas when access the same address, how to keep the same data in the same address when accessed by two kind commands(read/write) whether can use the IO data bus,let read and write share it ? thank you indeed ! |
|
|
|
我不确定“块访问”是什么意思。
核心支持多字节访问 如果这就是你的意思。 在地址周期之后,第一个数据字是“子地址” 并且下一个数据字是要写入“子地址”的数据。 如果发送更多字节 没有STOP,那么子地址将在每次写入后递增。 行为是 类似于像24LC02这样的简单EEPROM。 我附加了一个简单的项目(只是源文件,你可以通过它来创建一个项目 包括两个verilog文件并将.hex文件放在项目目录中)。 这显示了如何使用子地址来选择寄存器并包含一个 通过.hex文件初始化推断出的RAM。 我用ISE 10.1测试了它,但是 它也适用于较新的版本。 问候, 的Gabor - Gabor i2c_slave.zip 6 KB 以上来自于谷歌翻译 以下为原文 I'm not sure what you mean by "block access". The core supports multi-byte access if that's what you mean. After the address cycle, the first data word is the "subaddress" and the next data word is data to write to that "subaddress". If more bytes are sent without a STOP, then the subaddress will increment after each write. The behavior is similar to a simple EEPROM like a 24LC02. I'm attaching a simple project (just the source files, you can make a project by including the two verilog files and placing the .hex file in your project directory). This shows how to use the subaddress to select registers and includes an inferred RAM with initialization from the .hex file. I tested it with ISE 10.1, but it should work with newer versions as well. Regards, Gabor -- Gabor i2c_slave.zip 6 KB |
|
|
|
亲爱的gszakacs:
我知道了。 非常非常非常感谢你! 耐寒 以上来自于谷歌翻译 以下为原文 dear gszakacs: i got it. thank you very very very veryvery much! hardy |
|
|
|
只有小组成员才能发言,加入小组>>
2416 浏览 7 评论
2821 浏览 4 评论
Spartan 3-AN时钟和VHDL让ISE合成时出现错误该怎么办?
2292 浏览 9 评论
3372 浏览 0 评论
如何在RTL或xilinx spartan fpga的约束文件中插入1.56ns延迟缓冲区?
2459 浏览 15 评论
有输入,但是LVDS_25的FPGA内部接收不到数据,为什么?
1147浏览 1评论
请问vc707的电源线是如何连接的,我这边可能出现了缺失元件的情况导致无法供电
582浏览 1评论
求一块XILINX开发板KC705,VC707,KC105和KCU1500
448浏览 1评论
2003浏览 0评论
727浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:42 , Processed in 1.287300 second(s), Total 61, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号