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

题目

题目很简单,就是写一个10110序列发生器。
有两种方法,第一种就是通过循环移位的方式,来产生相应的序列,另一种方法则是通过状态机来实现。

方法一:循环移位

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/03/03 12:50:00
// Design Name: 
// Module Name: sequence_generator
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module sequence_generator(
input clk,
input rst,
output seq
    );
parameter SEQUENCE = 5'b10110;
logic [4:0] shift_reg;
always_ff@(posedge clk,posedge rst)
if(rst)
    shift_reg<=SEQUENCE;
else
    shift_reg<={shift_reg[3:0],shift_reg[4]};               //循环左移
//
assign seq=shift_reg[4];
endmodule

由于需要循环产生该序列,因此低4位右移一个单位后,最高位又进入移位寄存器的最低位,而输出则恒和最高位连接:

shift_reg<={shift_reg[3:0],shift_reg[4]}

方法二:通过状态机实现

代码如下,一共设置了5个状态,事实上,状态数可以减少。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/03/03 12:56:51
// Design Name: 
// Module Name: sequence_generator_fsm
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module sequence_generator_fsm(
input logic clk,
input logic rst,
output logic seq 
    );
parameter SEQUENCE = 5'b10110;
typedef enum bit[3:0] {
IDLE,
S1, //1
S2, //0
S3, //1
S4, //1
S5  //0
} STATE;                                                       //事实上,状态数可以减少,例如S1,S2,S3,S4,其中S3为发送两个1

STATE cur_state,next_state;
//
always_ff@(posedge clk,posedge rst)
if(rst)
     cur_state<=IDLE;
else
     cur_state<=next_state;
//
always_comb 
begin
case(cur_state)
    IDLE:begin
         if(~rst)
              next_state=S1;
         else
              next_state=IDLE;
    end
    S1:next_state=S2;
    S2:next_state=S3;
    S3:next_state=S4;
    S4:next_state=S5;
    S5:next_state=S1;
    default:next_state=IDLE;    
endcase
end
//输出
always_comb
case(cur_state)
    IDLE:seq=0;
    S1:seq=1;
    S2:seq=0;
    S3:seq=1;
    S4:seq=1;
    S5:seq=0;
    default:seq=0;
endcase
endmodule

测试平台

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/03/03 12:53:50
// Design Name: 
// Module Name: test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module test_tb(

    );
logic clk;
logic rst;
logic seq;

initial begin
    clk=0;
    forever begin
        #5 clk=~clk;
    end
end
initial
begin
    rst=1;
    #100
    rst=0;
end

sequence_generator_fsm U(.*);
//input clk,
//input rst,
//output seq
//    );

endmodule

仿真波形如下图所示
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FPGA硅农

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

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

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

打赏作者

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

抵扣说明:

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

余额充值