数字IC面试手撕代码(七)

该博客介绍了一个用Verilog实现的序列检测模块,该模块接收串行输入的比特流,并判断当前接收的无符号整数是否能被3整除。通过状态机设计,实现了IDLE、S0、S1、S2四个状态,分别对应空闲、模3为0、模3为1和模3为2的情况。在仿真测试中,模块功能正确,无错误发生。
摘要由CSDN通过智能技术生成

题目

输入一个序列(每周期输入一个比特,高位先输入),判断当前接收到的bit所组成的无符号整数是否为3的倍数。例如
1:输出为0
10:输出为0
100:输出为0
1001:输出为1(模3为0)

方法

设当前接收到的比特所组成的数为x,下个输入的bit为b,则b被接收后,x更新为
x<----x*2+b
根据上式,我们可以设计状态机如下:
设置状态IDLE,S0,S1,S2,IDLE为空闲状态,接收第一个比特后进入S_状态,S0表示当前数模三为0,S1表示当前数模三为1,S2表示当前数模三为2,则有如下状态转换
S0:当b=0时,状态保持不变,当b=1时,进入S1状态;
S1:当b=0时,进入S2状态(1*2+0),当b=1时,进入S0状态(1*2+1=3);
S2:当b=0时,进入S1状态(2*2+0=4),当b=1时,进入S2状态(2*2+1=5(%3=2));
IDLE:当b=0时,进入状态S0,否则进入S1状态。

代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/03/19 17:51:25
// Design Name: 
// Module Name: mod3
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
//功能:序列串行输入,判断当前序列能否被3整除

module mod3(
input logic clk,
input logic rst,
input logic bit_in,
output logic detected
    );
logic [511:0] buff;          //仅为了仿真
logic ref_out;              //参考输出
logic error;
assign ref_out=(buff%3==0)?1'b1:1'b0;
assign error=(rst==0&&ref_out!=detected)?1'b1:1'b0;
//
typedef enum bit [2:0] { 
    IDLE,S0,S1,S2                         //S0:mod 3 =0,S1:mod 3=1,S2:mod 3=2
} State;
State cur_state,next_state;
//buff
always_ff@(posedge clk,posedge rst)
if(rst)
    buff<=0;
else
    buff<={buff[510:0],bit_in};
//三段式状态机第一段
always_ff@(posedge clk,posedge rst)
if(rst)
    cur_state<=IDLE;
else
    cur_state<=next_state;
//三段式状态机第二段
always_comb
begin
    case(cur_state)
        IDLE:if(rst)
                 next_state=IDLE;
             else if(bit_in)    
                 next_state=S1;
             else
                 next_state=S0;
        S0:if(bit_in)      
               next_state=S1;               //0*2+1=1
           else
               next_state=S0;              //0*2+0=0
        S1:if(bit_in)                      //1*2+1 mod 3 =0
               next_state=S0;
           else                            //1*2+0=2
               next_state=S2;
        S2:if(bit_in)                     //2*2+1 mod 3 =2
               next_state=S2;
           else                           //2*2+O mod 3 =1
               next_state=S1;
        default:next_state=IDLE;
    endcase
end
//输出
always_ff@(posedge clk,posedge rst)
if(rst)
    detected<=0;
else
begin
    case(next_state)
        IDLE:detected<=0;
        S0:detected<=1;
        S1:detected<=0;
        S2:detected<=0;
        default:detected<=0;
    endcase
end
endmodule

测试平台

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/03/19 18:47:28
// Design Name: 
// Module Name: mod3_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module mod3_test(

    );
logic clk;
logic rst;
logic bit_in;
logic detected;
//clk
initial begin
    clk=0;
end
always
    #5 clk=~clk; 
initial
begin
    rst=1;
    #50
    rst=0;
end
//
always@(posedge clk,posedge rst)
if(rst)
    bit_in<=0;
else
    bit_in<=$random%2;
//inst
mod3 U(.*);
endmodule

仿真波形:
可以看到,rst为0后,error信号一直为低,功能无误。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA硅农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值