fpga秋招笔试刷题--序列检测器10010

 某XX科笔试题目:

 首先需要画状态机:


module top(
     input     sys_clk,   //50M 20ns
    input    rst_n ,
    input    din
);
reg  [5:0] state_c,state_n;
reg  out1;

parameter IDLE = 6'b000001;
parameter S1   = 6'b000010;
parameter S2   = 6'b000100;
parameter S3   = 6'b001000;
parameter S4   = 6'b010000;
parameter S5   = 6'b100000;


//四段式状态机

//第一段:同步时序always模块,格式化描述次态寄存器迁移到现态寄存器(不需更改)
always@(posedge sys_clk or negedge rst_n)begin
    if(!rst_n)begin
        state_c <= IDLE;
    end
    else begin
        state_c <= state_n;
    end
end

//第二段:组合逻辑always模块,描述状态转移条件判断
always@(*)begin
    case(state_c)
        IDLE:begin
            if(din==1'b1)begin
                state_n = S1;
            end
            else begin
                state_n = state_c;
            end
        end
        S1:begin
            if(din==1'b0)begin
                state_n = S2;
            end
            else begin
                state_n = state_c;
            end
        end
        S2:begin
            if(din==1'b0)begin
                state_n = S3;
            end
            else  begin
                state_n = S1;
            end
        end
        S3:begin
            if(din==1'b1)begin
                state_n = S4;
            end
            else  begin
                state_n = IDLE;
            end
        end
        S4:begin
            if(din==1'b0)begin
                state_n = S5;
            end
            else  begin
                state_n = S1;
            end
        end
        S5:begin
            if(din==1'b0)begin
                state_n = S3;
            end
            else  begin
                state_n = S1;
            end
        end
        default:begin
            state_n = IDLE;
        end
    endcase
end

//第四段:同步时序always模块,格式化描述寄存器输出(可有多个输出)
always  @(posedge sys_clk or negedge rst_n)begin
    if(!rst_n)begin
        out1 <=1'b0;      //初始化
    end
    else if(state_c==S4&&din==1'b0)begin
        out1 <= 1'b1;
    end
    else begin
        out1 <= 1'b0;
    end
end

endmodule

测试代码:


`timescale  1ps/1ps


module  top_tb;

reg   clk;
reg   rst_n;
reg [23:0] data;
initial  clk=1;
wire seq_binary;

always #3333 clk=~clk; //150
//always #2500 clk=~clk; //150M 

//用循环移位的方式待测数据码流
always@(negedge clk) #5 data = {data[22 : 0], data[23]};
assign seq_binary = data[23]; //将最高位输入到序列检测器中

initial begin 

   rst_n=0;
   #201
   rst_n=1;
   data = 24'b0011_1100_1001_0000_1001_0100;
  repeat(3000)
     @(posedge clk);
  // #2000
   //$stop;
 end
        
wire rst_write = clk & rst_n;         //复位期间不应写入数据

top top_inst(
   .sys_clk    (clk),
   .rst_n  (rst_n),
   .din    (seq_binary)
);

   
endmodule
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值