在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3804|回复: 12

[求助] 关于总线传输数据的一些问题,求教

[复制链接]
发表于 2013-6-21 21:46:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
这是老师出的一个问题,输入端输入数据,等输够8位数据后,输出数据。width是每次输入数据的位数,输出数据时valid置1,功能简单,他问我,都需要什么模块来实现这个功能,
传输机制是怎么样的?
我认为是里面有寄存器存储数据,存够8位再输出,他说不够详细。求高手说说完整的传输过程,谢谢了。
360软件小助手截图20130621213946.jpg
发表于 2013-6-22 06:26:46 | 显示全部楼层
用个fifo就可以
 楼主| 发表于 2013-6-22 11:34:37 | 显示全部楼层
几乘几的FIFO啊,宽度是8位深度随便吗?
发表于 2013-6-22 15:40:58 | 显示全部楼层
存够8位再输出的话该模块肯定是要有存储元件了。

输出数据由valid显示那为handshaking提供了可能。

话说这个模块连clk都没有大丈夫??
 楼主| 发表于 2013-6-22 17:45:50 | 显示全部楼层
回复 4# 39123811

他只是大概说了下,可以加上CLK什么的,主要是怎么实现他说的功能。e
发表于 2013-6-22 21:00:15 | 显示全部楼层
本帖最后由 starsoi 于 2013-6-22 21:19 编辑

蛮力。。
功能:当输入数据满8位时,dataout(7:0)输出最近输入的8位数据并置valid为1,valid=1持续一个时钟周期。dataout高位是最新的数据,dataout低位是最老的数据。
输入的数据会先保存在寄存器中,FSM的每一个状态表示已经保存的数据的位数。当最新输入的数据位数加已经保存的数据位数等于8时,输出这8位数据并置valid为1。这里也要考虑到当输入的位数可能不与8位对齐,比如输入端的数据位数可能第一个时钟周期3位,第二个时钟周期3位,第三个时钟周期1位,第四个时钟周期3位,这时第四个时钟周期输入的其中2位数据就要被归在下一组8位输出


伪代码:




  1. initilization:
  2. data(7:0)="00000000"
  3. overflow_width(1:0)="00"
  4. overflow_data(1:0)="00"
  5. state = 0

  6. @rising edge of clk
  7. FSM:
  8. state 0
  9.   valid = "0"
  10.   if width="01"
  11.     data(0) = datain(0)
  12.     state = 1
  13.   else if width="10"
  14.     data(1:0) = datain(1:0)
  15.     state = 2
  16.   else if width="11"
  17.     data(2:0) = datain(2:0)
  18.     state = 3
  19.   else
  20.     state = 0
  21.   endif
  22. state 1
  23.   valid = "0"
  24.   if width="01"
  25.     data(1) = datain(0)
  26.     state = 2
  27.   else if width="10"
  28.     data(2:1) = datain(1:0)
  29.     state = 3
  30.   else if width="11"
  31.     data(3:1) = datain(2:0)
  32.     state = 4
  33.   else
  34.     state = 1
  35.   endif
  36.          .
  37.          .
  38.          .
  39. state N
  40.   #if N=2# valid = "0" #endif#
  41.   if width="01"
  42.     data(N) = datain(0)
  43.     state = N+1
  44.   else if width="10"
  45.     data(N+1:N) = datain(1:0)
  46.     state = N+2
  47.   else if width="11"
  48.     data(N+2:N) = datain(2:0)
  49.     state = N+3
  50.   else
  51.     state = N
  52.   endif
  53.          .
  54.          .
  55.          .
  56. state 6:
  57.   if width="01"
  58.     data(6) = datain(0)
  59.     state = 7
  60.   else if width="10"
  61.     dataout(7:6) = datain(1:0)
  62.     dataout(5:0) = data(5:0)
  63.     valid = "1"
  64.     state = 0
  65.   else if width="11"
  66.     dataout(7:6) = datain(1:0)
  67.     dataout(5:0) = data(5:0)
  68.     valid = "1"
  69.     data(0) = datain(2)
  70.     state = 1
  71.   else
  72.     state = 6
  73.   endif
  74.         
  75. state 7:
  76.   if width="01"
  77.     dataout(7) = datain(0)
  78.     dataout(6:0) = data(6:0)
  79.     valid = "1"
  80.     state = 0
  81.   else if width="10"
  82.     dataout(7) = datain(0)
  83.     dataout(6:0) = data(6:0)
  84.     data(0) = datain(1)
  85.     valid = "1"
  86.     state = 1
  87.   else if width="11"
  88.     dataout(7) = datain(0)
  89.     dataout(6:0) = data(6:0)
  90.     data(1:0) = datain(2:1)
  91.     valid = "1"
  92.     state = 2
  93.   else
  94.     state = 7
  95.   endif



复制代码
 楼主| 发表于 2013-6-22 21:10:28 | 显示全部楼层
回复 6# starsoi


   这是拿什么写的啊,有点看不明白,我今天跟同学讨论了下,用16位宽的FIFO应该可以的。
发表于 2013-6-22 21:27:26 | 显示全部楼层
回复 7# yiyunzisu
呃。。不知道你是用verilog还是vhdl,所以就用的伪代码来表达一下实现思想

我很好奇怎样用FIFO来实现。16位是如位定的呢。valid又怎么给呢
发表于 2013-6-23 10:41:19 | 显示全部楼层
感觉FIFO就可以实现,或者弄个计数器就行啦。
 楼主| 发表于 2013-6-23 15:38:08 | 显示全部楼层
用FIFO写数据,当指针大于8了就输出前8位数据,并置valid为1,因为输入数据位数不确定,所以设定位宽大点,保证能满足功能
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 19:58 , Processed in 0.026211 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表