返回信息流module test(CLK,STB,DATA,DOUT);
input CLK,STB,DATA;
output[7:0] DOUT;
reg[7:0] DOUT;
reg[7:0] shifter;
reg[7:0] bufferreg;
reg datacoming;
reg[2:0] count;
//initialize
initial
begin
count = 0;
datacoming = 0;
bufferreg = 8'b11111111;
end
always @(posedge CLK)
begin
if(STB == 1)
datacoming = 1;
else
begin
if(count == 1)
begin
datacoming = 0;
end
else
datacoming = 1;
end
if(datacoming == 1)
begin
shifter <= shifter << 1;
shifter[0] <= DATA;
count = count + 1;
if(count == 0)
begin
bufferreg = shifter;
end
end
DOUT = bufferreg;
end
endmodule
这是程序,主要目的是将8位移位寄存器每次采集的数据放到一个缓冲寄存器,然后输出。
STB的主要作用是标志数据帧的开始,在bit0持续一个时钟周期(高电平),其它的信号大家都能看懂的,但我仿真出来却有问题,大家能看一下是哪出问题了吗?谢谢!
这是一条镜像帖。来源:北邮人论坛 / circuit / #18043同步于 2011/7/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
问一下Verilog寄存器的问题
liliang
2011/7/29镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
这是第一次写的吧。。
【 在 liliang (HelloWorld) 的大作中提到: 】
: module test(CLK,STB,DATA,DOUT);
: input CLK,STB,DATA;
: output[7:0] DOUT;
: ...................
count = count + 1;
if(count == 0)
begin
bufferreg = shifter;
count变成1了还能执行下面的语句吗?
暂且不论楼主有没有复位,将阻塞赋值和非阻塞赋值放在同一个always块中会出现很糟糕的综合结果,楼主设计的电路的逻辑至少是有问题的:
楼主下边的逻辑中:
if(datacoming == 1)
begin
count = count + 1;
end
只有当datacoming置位时count才能自增,而当count自增至1时,楼主的上边的逻辑:
if(count == 1)
begin
datacoming = 0;
end
else
datacoming = 1;
在count为1时会将datacoming复位,故会死锁在count为1的状态下。
楼主还是重新设计你的逻辑吧。。。。
不过对于新手,个人觉得还是得先养成良好的代码描述习惯,才有可能设计出高效的电路~~
good luck!