题目
题目很简单,就是写一个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
仿真波形如下图所示