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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2900|回复: 13

请高手指点

[复制链接]
发表于 2007-6-5 12:48:14 | 显示全部楼层 |阅读模式

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

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

x
是一个存在存储器中的查找表,查找表高八位是时间,低八位是数值,首先读出第一个数值,延迟高该数值高八位的时间后输出这个数值,然后按顺序读出下一个数值,接着延迟下一个数值高八位时间后输出该数值,依次类推,直到全部输出.小弟刚学verilog,只能写成这样  死活弄不出来,还请各位高手指点一二,万分感谢
module lshiyan(clk,rst,data,tr,addr);
input clk,rst,tr;
input[2:0] addr;
output[4:0] data;
reg[2:0] addr;
reg[4:0] databuf;
reg[4:0] register[7:0];
reg[15:0] stctab[7:0];
reg[7:0] ti;
parameter state_size=3;
parameter IDLE=3'001,stc1=3'010,stc2=3'011,stc3=3'100;
reg[state_size:0] state;
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
state<=IDLE;
stctab[0]<=16'd0000000100000001;
stctab[1]<=16'd0000001000000010;
stctab[2]<=16'd0000010000000100;
stctab[3]<=16'd0000100000001000;
stctab[4]<=16'd0001000000010000;
stctab[5]<=16'd0010000000100000;
stctab[6]<=16'd0100000001000000;
stctab[7]<=16'd1000000010000000;
end
else
begin
case(state)
IDLE:
begin
if(tr)
rbuf<=r;
databuf<=register;
ti<=8'b00000000;
addr<=3'b000;
state<=stc1;
end
else
begin
databuf<=databuf;
register<=5'b00000;
ti<=8'b00000000;
addr<=3'b000;
state<=IDLE;
end
stc1:
begin
ti<=stctab[15:8];
stc1<=stc2;
end
stc2:
begin
repeat(ti) @(posedge clk);
register<=stctab[7:0];
stc2<=stc3;
end
stc3:
begin
databuf<=register;
stctab[addr]<=stctab[addr+1];
stc3<=IDLE;
default:  state<=IDLE;
endcase
end
assign data=databuf;
endmodule
 楼主| 发表于 2007-6-5 13:21:44 | 显示全部楼层
?????????就没有高手愿意指点一下吗
发表于 2007-6-5 14:31:15 | 显示全部楼层
采用RAM缓存查找表输出,将查找表的输出低8位存入RAM,高8位寻址RAM
发表于 2007-6-5 16:57:50 | 显示全部楼层
是不是可以用这样的状态机:在第一个状态里面将计数器的初始值置为时间值,第二个状态对计数器进行减1计数,到0后进入到最后一个状态输出数据再回到第一个状态
 楼主| 发表于 2007-6-5 20:39:55 | 显示全部楼层
楼上的两位大哥能不能再说的详细一点    谢谢
 楼主| 发表于 2007-6-6 12:46:00 | 显示全部楼层
继续等高手指点
发表于 2007-6-6 13:04:29 | 显示全部楼层
不要什么都用状态机,这个用状态机显然不合适。
 楼主| 发表于 2007-6-8 12:46:07 | 显示全部楼层
那应该用啥比较好一点呢
发表于 2007-6-8 14:53:08 | 显示全部楼层
tr是指示addr有效的信号吧?要不然就没法实现了,因为根本不知道addr从什么时候开始有效的,也就不知道什么时候开始计时。
可以采用一个计数器,tr作为计数器的reset端,同时作为时钟时能端控制计数,你再在内部产生一个信号作为计数器的load信号,将addr对应的ram项的高位load到计数器然后开始减法计数,到0时输出数据。可以象4楼说的那样用状态机,,用四个状态,idel、load、count、out。

[ 本帖最后由 answerdou 于 2007-6-8 14:56 编辑 ]
 楼主| 发表于 2007-6-9 00:08:44 | 显示全部楼层
tr是指示addr有效的信号吧?要不然就没法实现了,因为根本不知道addr从什么时候开始有效的,也就不知道什么时候开始计时。
可以采用一个计数器,tr作为计数器的reset端,同时作为时钟时能端控制计数,你再在内部产生一个信号作为计数器的load信号,将addr对应的ram项的高位load到计数器然后开始减法计数,到0时输出数据。可以象4楼说的那样用状态机,,用四个状态,idel、load、count、out。
--------------------------------------------------------------
谢谢这位兄弟  tr确实是有效信号   因为我对查找表不是很熟悉   所以不清楚怎么样按时间顺序读取数据来着
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-7 03:42 , Processed in 0.030024 second(s), 8 queries , Gzip On, Redis On.

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