2021 buaa 计组上机P1 Verilog 3道课上考试题

每年题目都不一样,但看看往年题可以帮助查缺补漏
今年没考Mealy型状态机,都是Moore

P1

1. 奇偶校验–组合逻辑

奇偶校验的意思:https://zh.wikipedia.org/wiki/%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C%E4%BD%8D 参考维基百科

data[31:0]input
check0为偶校验;1为奇校验
result[31:0]output

data为 8‘b00110011,进行奇校验,则result为10110011

讨论区给的思路 – 计算1的位数为奇数还是偶数,可以考虑异或

assign out[31] = (^data[30:0]) ^ check;

或者

always @(*) begin
    case(check)
        1: if(^data) msb = data[31];
           else msb = ~data[31];
        0: if(^data) msb = ^data[31];
           else msb = data[31];
    endcase
end
assign result = {msb, data[30:0]};

为什么我错了:
count (using for count the number of “1”) 要初始化???????

2. 心情电路

clkinput
sign[1:0]心情input
reset异步复位input
status[2:0]状态output

4种sign

ALARM 闹钟2’b00
IDEA 有思路2’b01
FAIL 失败2’b10
SUCCESS 成功2’b11

5种状态

ASLEEP睡觉
BUSY忙碌
SAD悲伤
CLUELESS愚笨
HAPPY开心

状态转换的逻辑:小A的初始状态是ASLEEP,如果接收到ALRAM闹铃,则转变为BUSY的状态。如果在BUSY时,被SUCCESS信号打断,则转变为HAPPY状态;若在BUSY时被FAIL打断,则转变为SAD状态。如果连续两个周期都是SAD的状态,则变为CLUELESS状态。在CLUELESS状态,如果被IDEA(有思路了)打断,则回到BUSY状态。

如果连续3个周期都是BUSY或者CLUELESS的状态(也就是说连续3个周期没有被其他信号打断),则变为ASLEEP状态。

clk上升沿采样。

看完波形后,我设计的是Moore型的FSM。同时我用几个变量countBusy, countSad, countClue来记录BUSY/SAD/CLUELESS的状态已经持续多久。
在这里插入图片描述

3. equation 方程识别

clkinput 时钟
resetinput 异步复位
in[7:0]input 输入的字符
out1表示是方程;0表示不是方程
  • 方程中任意位置可以有空格
  • 合法的方程x + 1 = 4 + y*2/6
  • 合法方程 -> <表达式> = <表达式>
  • <表达式> -> 单个数字或者单个字母
  • 如果X和Y都为合法表达式,那么X+Y, X-Y, X*Y, X/Y都是合法表达式
  • +x = 5 不合法; = 6 也不合法

因此,15 不是表达式(因为不是单个数字);同理,X1var 都不是表达式

clk上升沿采样。

看完波形后,我的设计是Moore型FSM。

状态机见图(7个状态)
在这里插入图片描述

4. 问答环节

  • 缩减运算符是什么

&, !, ^a

  • 看了一个题目的testbench(只要写了都可以)

  • 电平敏感的always块怎么写

附录,一题跟equation很像的题(2021的P1课下题)

5. P1_L0_表达式状态机 (P1.Q5)

Verilog表达式状态机

5.1 简介

计算机经常用于处理关于表达式的问题。现在有这样一类表达式F的字符串需要你来验证它们的合法性:

1、表达式F中只含有数字0-9,加号+,乘号*。

2、表达式F可以按如下的规则产生:

a. 单个数字[0-9]是F; b. 如果X是F,Y是F,X+Y也是F; c. 如果X是F,Y是F,X*Y也是F。

排除显而易见的所用符号不合法,所有的非法情况总结如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MZWLBbM-1635434285566)(http://10.212.27.185:9199/cscore-image/refkxh/06674c70-2698-4f77-a1de-248d29722934/p1.0.6.1.png)]

现在,我们需要你用Verilog HDL语言设计一个有限状态机来识别这样的表达式。

5.2 模块规格

模块名:string

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m095UxGr-1635434285568)(http://10.212.27.185:9199/cscore-image/refkxh/e1a38b76-3fc0-4389-a1f7-08f36239f6d0/p1.0.5.1.png)]

5.3 功能要求

每个时钟上升沿,状态机从 in 中读入一个ASCII编码的字符。假设读入的第i个字符为ci,则第n个时钟上升沿时,可以拼出一个字符串:

s=c1c2…cn

我们需要你此时判断 s 是否符合表达式F的定义。假如s符合F的定义,那么 out 应输出1,否则输出0。

另外,每个 clr 上升沿时,请清零状态;如果 clk 的上升沿时 clr 为 1,也需要清零状态。清零后,上面定义的字符串s也应从空串开始计算。如果s当前是空串,out也应输出0。注意,我们不需要你分析表达式的语法和语义,只要判断形式上合法性就可以正确求解。

5.4 输入输出样例

时序规范:总是保证in信号稳定时clk才产生上升沿。

输入:s = 1+2+3+4 输出:out = 1

输入:s = 1+2+3+ 输出:out = 0

示范波形(输入:s=1+2*3, 清零一周期, s’=1+2*3。时钟周期10ns):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkXvMa8h-1635434285569)(http://10.212.27.185:9199/cscore-image/refkxh/f2720cc7-a8e8-453d-89c9-bc6ce2b691e2/p1.0.4.3__1_.png)]

5.5 提交要求

  • 必须严格按照模块的端口定义。
  • 文件内模块名: string

5.6 我的代码(已过)

module string(
    input clk,
    input clr,
    input [7:0] in,
    output out,
	 output [2:0] status
    );

    // asyn-clr
    parameter s0 = 3'b000; // empty string
    parameter s1 = 3'b001; // legal expression
    parameter s2 = 3'b010; // F+
    parameter s3 = 3'b011; // F*
    parameter s4 = 3'b100; // illegal

    reg[2:0] state = s0;

    assign out = (state == s1) ? 1 : 0;
	assign status = state;

    always @(posedge clk or posedge clr) begin
        if (clr) begin
            state <= s0;
        end
        else begin
            case (state)
                s0 : begin
                    if (in >= "0" && in <= "9") state <= s1;
                    else state <= s4;
                end

                s1 : begin
                    if (in == "+") state <= s2;
                    else if (in == "*") state <= s3;
                    else state <= s4;
                end

                s2 : begin
                    if (in  >= "0" && in <= "9") state <= s1;
                    else state <= s4;
                end

                s3 : begin
                    if (in >= "0" && in <= "9") state <= s1;
                    else state <= s4;
                end

                s4 : begin
                    state <= s4;
                end

                default :
                    state <= s0;
            endcase
        end
    end
endmodule
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值