roife / roife.github.io

My blog
10 stars 2 forks source link

2020/10/31/buaa-co-lab-p1/ #10

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

「BUAA-CO-Lab」 P1 Verilog 模块及状态机 - roife 的博客 | Roife Blog

roife 的魔法科见闻

https://roife.github.io/2020/10/31/buaa-co-lab-p1/

zbh17 commented 1 year ago

学长你好,bfr = (bfr << 8) | in | 8'h20 ; 该句我没有看懂,为什么要或上8’h20(空格)呢?另外,这是一个时序逻辑过程,而此处却使用了阻塞赋值,请问改为非阻塞赋值,并且后面的if-else判断用bfr 与in组合来判断是否更合理呢?

roife commented 1 year ago

@zbh17 | 8'20 应该是和题目有关,可以把所有的大写字母转换成小写字母(a - A = 32);如果可以的话,能改成全部是非阻塞赋值确实更好

zbh17 commented 1 year ago

另外如果因为对于begin的判断是默认有前导空格的,但是如果第一次输入为begin而没有空格的话就会出现问题,鉴于此,初始化bfr以及复位bfr的时候,是否考虑将bfr置为“ ”(空格)

zbh17 commented 1 year ago

应该是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");
roife commented 1 year ago

@zbh17 感觉你改的很有道理。其实这个好像本来是教程里的一个题目,当时测试完 A 了就放上来了,所以有一些疏漏。

另外提一嘴开始说的阻塞赋值和非阻塞赋值混用的问题,我去看了一下蓝色那本《Verilog数字系统设计教程》,里面讲“Verilog 层次化事件队列”提到阻塞赋值会在非阻塞赋值之前计算(我的另一篇博客也提到了),因此应该是之前的代码能够通过的原因。这篇博客是我刚接触 Verilog 不久写的,当时学得确实不够成熟,我现在也觉得混用是一种不好的习惯。

zbh17 commented 1 year ago

我上面改的code有点问题,顾头不顾尾,in作为if-else判断时也需要 | 8‘h20,转化为小写