Open utterances-bot opened 1 year ago
学长你好,bfr = (bfr << 8) | in | 8'h20 ; 该句我没有看懂,为什么要或上8’h20(空格)呢?另外,这是一个时序逻辑过程,而此处却使用了阻塞赋值,请问改为非阻塞赋值,并且后面的if-else判断用bfr 与in组合来判断是否更合理呢?
@zbh17 | 8'20
应该是和题目有关,可以把所有的大写字母转换成小写字母(a - A = 32
);如果可以的话,能改成全部是非阻塞赋值确实更好
另外如果因为对于begin的判断是默认有前导空格的,但是如果第一次输入为begin而没有空格的话就会出现问题,鉴于此,初始化bfr以及复位bfr的时候,是否考虑将bfr置为“ ”(空格)
应该是Moore机吧,还请学长指点
reg [255:0] bfr= " ";
always @ (posedge clk,posedge reset) begin
if(reset) begin
valid <= 1;
bfr <= " ";
cnt <= 0;
end else begin
bfr <= (bfr << 8) | in | 8'h20;//toupper
if(valid) begin
if(bfr[39:0] == " begi" && in == "n") begin
cnt <= cnt + 1;
end else if(bfr[47:0] == " begin" && in != " ") begin
cnt <= cnt - 1;
end else if(bfr[23:0] == " en" && in == "d") begin
cnt <= cnt - 1;
end else if(bfr[31:0] == " end" && in != " ") begin
cnt <= cnt + 1;
end else if(bfr[31:0] == " end" && in == " " && cnt[31]) begin //初上来就一个end那么cnt会被减为负数,所以进行判断,这样的话一旦初始为end,后面就不用再判断了,猜测是题目要求
valid <= 0;
end
end
end
end
assign out = (cnt == 0 && valid) ;
如果是Mealy : assgin out = (cnt == 1 && bfr[23:0] == " en" && in == "d");
@zbh17 感觉你改的很有道理。其实这个好像本来是教程里的一个题目,当时测试完 A 了就放上来了,所以有一些疏漏。
另外提一嘴开始说的阻塞赋值和非阻塞赋值混用的问题,我去看了一下蓝色那本《Verilog数字系统设计教程》,里面讲“Verilog 层次化事件队列”提到阻塞赋值会在非阻塞赋值之前计算(我的另一篇博客也提到了),因此应该是之前的代码能够通过的原因。这篇博客是我刚接触 Verilog 不久写的,当时学得确实不够成熟,我现在也觉得混用是一种不好的习惯。
我上面改的code有点问题,顾头不顾尾,in作为if-else判断时也需要 | 8‘h20,转化为小写
「BUAA-CO-Lab」 P1 Verilog 模块及状态机 - roife 的博客 | Roife Blog
roife 的魔法科见闻
https://roife.github.io/2020/10/31/buaa-co-lab-p1/