每年题目都不一样,但看看往年题可以帮助查缺补漏
今年没考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 |
---|---|
check | 0为偶校验;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. 心情电路
clk | input |
---|---|
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 方程识别
clk | input 时钟 |
---|---|
reset | input 异步复位 |
in[7:0] | input 输入的字符 |
out | 1表示是方程;0表示不是方程 |
- 方程中任意位置可以有空格
- 合法的方程
x + 1 = 4 + y*2/6
- 合法方程 -> <表达式> = <表达式>
- <表达式> -> 单个数字或者单个字母
- 如果X和Y都为合法表达式,那么X+Y, X-Y, X*Y, X/Y都是合法表达式
- +x = 5 不合法; = 6 也不合法
因此,15
不是表达式(因为不是单个数字);同理,X1
, var
都不是表达式
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。
排除显而易见的所用符号不合法,所有的非法情况总结如下:
现在,我们需要你用Verilog HDL语言设计一个有限状态机来识别这样的表达式。
5.2 模块规格
模块名:string
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):
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