`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
reg [4:0] state;
reg [4:0] next_state;
parameter IDLE=5'd0,S1=5'd1,S2=5'd2,S3=5'd3,S4=5'd4,
S5=5'd5,S6=5'd6,S7=5'd7,S8=5'd8;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state<=IDLE;// reset
end
else begin
state<=next_state;
end
end
always @(*) begin
case(state)
IDLE:begin
if (a==1) begin
next_state<=IDLE;
end
else begin
next_state<=S1;
end
end
S1:begin
if (a==1) begin
next_state<=S2;
end
else begin
next_state<=S1;
end
end
S2:begin
if (a==1) begin
next_state<=S3;
end
else begin
next_state<=S1;
end
end
S3:begin
if (a==1) begin
next_state<=S4;
end
else begin
next_state<=S1;
end
end
S4:begin
if (a==0) begin
next_state<=S5;
end
else begin
next_state<= IDLE;
end
end
S5:begin
if (a==0) begin
next_state<=S6;
end
else begin
next_state<=S2;
end
end
S6:begin
if (a==0) begin
next_state<=S7;
end
else begin
next_state<=S2;
end
end
S7:begin
if (a==1) begin
next_state<=S8;
end
else begin
next_state<=S1;
end
end
S8:begin
if (a==0) begin
next_state<=S1;
end
else begin
next_state<=IDLE;
end
end
default:
next_state<=IDLE;
endcase
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
match<=0;// reset
end
else if (state==S8) begin
match<=1;
end
else begin
match<=0;
end
end
endmodule
VL26 含无关项的序列检测
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input a,
output reg match
);
reg [8:0] a_tem;
wire match_temp;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
a_tem <= 0;// reset
end
else begin
a_tem <= {a_tem[7:0],a};
end
end
assign match_temp = ((a_tem[8:6]==3'b011)&&(a_tem[2:0]==3'b110)) ;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
match <= 0;// reset
end
else begin
match<=match_temp;
end
end
endmodule
VL27不重叠序列检测
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
output reg match,
output reg not_match
);
parameter IDLE=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,FAIL=7;
reg [2:0] cnt;
reg [2:0] state,next_state;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt<=0;// reset
end
else if (cnt=='d6) begin
cnt<=1;
end
else begin
cnt<=cnt+1'b1;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state<=IDLE;// reset
end
else begin
state<=next_state;
end
end
always @(*) begin
case(state)
IDLE:begin
if (data==0&&cnt==0) begin
next_state=s1;
end
else begin
next_state=FAIL;
end
end
s1:begin
if (data==1) begin
next_state=s2;
end
else begin
next_state=FAIL;
end
end
s2:begin
if (data==1) begin
next_state=s3;
end
else begin
next_state=FAIL;
end
end
s3:begin
if (data==1) begin
next_state=s4;
end
else begin
next_state=FAIL;
end
end
s4:begin
if (data==0) begin
next_state=s5;
end
else begin
next_state=FAIL;
end
end
s5:begin
if (data==0) begin
next_state=s6;
end
else begin
next_state=FAIL;
end
end
s6:begin
if(data==0)begin
next_state=s1;
end
else
next_state=FAIL;
end
FAIL:begin
next_state=(data==0&&cnt==6)?s1:FAIL;
end
default:next_state<=IDLE;
endcase
end
always@(*)begin
if (!rst_n) begin
match=0;
not_match=0;
end
else begin
match = cnt==6&&state==s6;
not_match = cnt==6&&state==FAIL;
end
end
endmodule
VL28 输入序列不连续的序列检测
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
parameter IDLE=0,s1=1,s2=2,s3=3,s4=4;
reg [2:0] state,next_state;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state<=IDLE;// reset
end
else begin
state<=next_state;
end
end
always @(*) begin
case(state)
IDLE:next_state=(data==0&&data_valid==1)?s1:IDLE;
s1:next_state=(data==1&&data_valid==1)?s2:IDLE;
s2:next_state=(data==1&&data_valid==1)?s3:IDLE;
s3:next_state=(data==0&&data_valid==1)?s4:IDLE;
s4:next_state=(data==0&&data_valid==1)?s1:IDLE;
endcase
end
always@(*)begin
match=(state==s4);
end
endmodule
`timescale 1ns/1ns
module s_to_p(
input clk ,
input rst_n ,
input valid_a ,
input data_a ,
output reg ready_a ,
output reg valid_b ,
output reg [5:0] data_b
);
reg [2:0] cnt;
reg [5:0] temp;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt<=0;// reset
end
else if (valid_a&&ready_a)begin
cnt<=(cnt==5)?'d0:(cnt+1'b1);
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
temp<=0;// reset
end
else if (valid_a&&ready_a) begin
temp<={data_a,temp[5:1]};
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
data_b<=0;// reset
end
else if (cnt=='d5) begin
data_b<={data_a,temp[5:1]};
end
else begin
data_b<=data_b;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
valid_b<=0;// reset
end
else if (cnt=='d5) begin
valid_b<=1;
end
else begin
valid_b<=0;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
ready_a<=0;// reset
end
else begin
ready_a<=1;
end
end
endmodule
VL31 数据累加输出
`timescale 1ns/1ns
module valid_ready(
input clk ,
input rst_n ,
input [7:0] data_in ,
input valid_a ,
input ready_b ,
output ready_a ,
output reg valid_b ,
output reg [9:0] data_out
);
reg [1:0] cnt;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt<=0;// reset
end
else if (valid_a&&ready_a) begin
cnt<=cnt+1'b1;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
data_out<=0;// reset
end
else if (valid_a&&ready_a&&cnt!=0) begin
data_out<=data_out+data_in;
end
else if (valid_a&&ready_a&&cnt==0) begin
data_out<=data_in;
end
else begin
data_out<=data_out;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
valid_b<=0;// reset
end
else if (cnt==3&&valid_a&&ready_a) begin
valid_b<=1;
end
else if(cnt==0&&valid_a&&ready_a) begin
valid_b<=0;
end
else begin
valid_b<=valid_b;
end
end
assign ready_a = (!valid_b)|ready_b ;
endmodule
VL32 非整数倍数据位宽转换24to128
`timescale 1ns/1ns
module width_24to128(
input clk ,
input rst_n ,
input valid_in ,
input [23:0] data_in ,
output reg valid_out ,
output reg [127:0] data_out
);
reg [3:0] cnt;
reg [127:0] temp;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt<=0;// reset
end
else if (valid_in) begin
cnt<=cnt+1'b1;
end
else begin
cnt<=cnt;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
valid_out<=0;// reset
end
else if ((cnt==5||cnt==10||cnt==15)&&valid_in) begin
valid_out<=1;
end
else begin
valid_out<=0;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
temp<=0;// reset
end
else begin
temp<=valid_in?{temp[103:0],data_in}:temp;
end
end
always@(posedge clk or negedge rst_n) begin
if(~rst_n)
data_out <= 0;
else if(cnt==5)
data_out <= valid_in? {temp[119:0], data_in[23:16]}: data_out;
else if(cnt==10)
data_out <= valid_in? {temp[111:0], data_in[23: 8]}: data_out;
else if(cnt==15)
data_out <= valid_in? {temp[103:0], data_in[23: 0]}: data_out;
else
data_out <= data_out;
end
endmodule
VL33 非整数倍数据位宽转换8to12
`timescale 1ns/1ns
module width_8to12(
input clk ,
input rst_n ,
input valid_in ,
input [7:0] data_in ,
output reg valid_out,
output reg [11:0] data_out
);
reg [1:0] cnt;
reg [11:0] data_lock;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt<=0;// reset
end
else if (valid_in&&cnt<2) begin
cnt<=cnt+1;
end
else if (valid_in&&cnt==2) begin
cnt<=0;
end
else
cnt<=cnt;
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
valid_out<=0;// reset
end
else if (cnt==1&&valid_in) begin
valid_out<=1;
end
else if (cnt==2&&valid_in) begin
valid_out<=1;
end
else
valid_out<=0;
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
data_lock<=0;// reset
end
else if(valid_in) begin
data_lock<=valid_in?{data_lock[3:0],data_in}:data_lock;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
data_out<=0;// reset
end
else if (cnt==1&&valid_in) begin
data_out<={data_lock[7:0],data_in[7:4]};
end
else if (cnt==2&&valid_in) begin
data_out<={data_lock[3:0],data_in};
end
end
endmodule
VL34 整数倍数据位宽转换8to16
`timescale 1ns/1ns
module width_8to16(
input clk ,
input rst_n ,
input valid_in ,
input [7:0] data_in ,
output reg valid_out,
output reg [15:0] data_out
);
reg cnt;
reg [15:0] data_lock;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt<=0;// reset
end
else if (valid_in) begin
cnt<=cnt+1'b1;
end
else begin
cnt<=cnt;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
data_lock<=0; // reset
end
else if (valid_in) begin
data_lock<={data_lock[7:0],data_in};
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
data_out<=0;// reset
end
else if (valid_in&&cnt==1) begin
data_out<={data_lock[7:0],data_in};
end
else begin
data_out<=data_out;
end
end
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
valid_out<=0;// reset
end
else if (cnt==1&&valid_in) begin
valid_out<=1;
end
else begin
valid_out<=0;
end
end
endmodule
VL35 状态机-非重叠的序列检测
`timescale 1ns/1ns
module sequence_test1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5;
reg [2:0] state,next_state;
always @(posedge clk or negedge rst) begin
if (!rst) begin
state<=s0;// reset
end
else begin
state<=next_state;
end
end
always@(*)begin
case(state)
s0:begin
if (data) begin
next_state<=s1;
end
else begin
next_state<=s0;
end
end
s1:begin
if (!data) begin
next_state<=s2;
end
else begin
next_state<=s1;
end
end
s2:begin
if (data) begin
next_state<=s3;
end
else begin
next_state<=s2;
end
end
s3:begin
if (data) begin
next_state<=s4;
end
else begin
next_state<=s3;
end
end
s4:begin
if (data) begin
next_state<=s5;
end
else begin
next_state<=s4;
end
end
s5:begin
if (data) begin
next_state<=s1;
end
else begin
next_state<=s0;
end
end
endcase
end
always @(posedge clk or negedge rst) begin
if (!rst) begin
flag<=0;// reset
end
else if (next_state==s5) begin
flag<=1;
end
else begin
flag<=0;
end
end
endmodule
VL36 状态机-重叠序列检测
`timescale 1ns/1ns
module sequence_test2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter s0=0,s1=1,s2=2,s3=3,s4=4;
reg [2:0] state,next_state;
always @(posedge clk or negedge rst) begin
if (!rst) begin
state<=s0;// reset
end
else begin
state<=next_state;
end
end
always@(*)begin
case(state)
s0:begin
if (data) begin
next_state=s1;
end
else begin
next_state=s0;
end
end
s1:next_state=(data)?s1:s2;
s2:next_state=data?s3:s0;
s3:next_state=data?s4:s2;
s4:next_state=data?s1:s2;
default:next_state=s0;
endcase
end
always @(posedge clk or negedge rst) begin
if (!rst) begin
flag<=0;// reset
end
else if (state==s4) begin
flag<=1;
end
else begin
flag<=0;
end
end
//*************code***********//
endmodule
VL37 时钟分频(偶数)
`timescale 1ns/1ns
module even_div
(
input wire rst ,
input wire clk_in,
output wire clk_out2,
output wire clk_out4,
output wire clk_out8
);
//*************code***********//
reg cnt_2;
reg [1:0] cnt_4;
reg [2:0] cnt_8;
reg clk_out2_t;
reg clk_out4_t;
reg clk_out8_t;
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
cnt_2<=0;// reset
end
else begin
cnt_2<=cnt_2+1'b1;
end
end
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
clk_out2_t<=0;// reset
end
else if (cnt_2==1||cnt_2==0) begin
clk_out2_t<=!clk_out2_t;
end
end
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
cnt_4<=0;// reset
end
else begin
cnt_4<=cnt_4+1'b1;
end
end
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
clk_out4_t<=0;// reset
end
else if (cnt_4==0||cnt_4==2) begin
clk_out4_t<=!clk_out4_t;
end
end
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
cnt_8<=0;// reset
end
else begin
cnt_8<=cnt_8+1'b1;
end
end
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
clk_out8_t<=0;// reset
end
else if (cnt_8==4||cnt_8==0) begin
clk_out8_t<=!clk_out8_t;
end
end
assign clk_out2 = clk_out2_t;
assign clk_out4 = clk_out4_t;
assign clk_out8 = clk_out8_t;
//*************code***********//
endmodule
VL38 自动贩售机1
`timescale 1ns/1ns
module seller1(
input wire clk ,
input wire rst ,
input wire d1 ,
input wire d2 ,
input wire d3 ,
output reg out1,
output reg [1:0]out2
);
//*************code***********//
reg [3:0] cnt;
always @(posedge clk or negedge rst) begin
if (!rst) begin
cnt<=0;// reset
out1<=0;
out2<=0;
end
else begin
if (d1) begin
cnt<=cnt+1;
end
else if (d2) begin
cnt<=cnt+2;
end
else if (d3) begin
cnt<=cnt+4;
end
else if (cnt>=3) begin
out1<=1;
out2<=cnt-3;
cnt<=0;
end
else begin
out1<=0;
out2<=0;
end
end
end
//*************code***********//
endmodule
`timescale 1ns/1ns
module odo_div_or
(
input wire rst ,
input wire clk_in,
output wire clk_out7
);
//*************code***********//
reg clk_out7_d1;
reg clk_out7_d2;
reg [2:0] cnt;
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
cnt<=0;// reset
end
else if(cnt==4) begin
cnt<=1;
end
else begin
cnt<=cnt+1;
end
end
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
clk_out7_d1<=0;// reset
end
else if (cnt==4) begin
clk_out7_d1<=!clk_out7_d1;
end
end
always @(negedge clk_in or negedge rst) begin
if (!rst) begin
clk_out7_d2<=0;// reset
end
else if (cnt==4) begin
clk_out7_d2<=!clk_out7_d2;
end
end
assign clk_out7 =clk_out7_d1&&clk_out7_d2 ;
//*************code***********//
endmodule
VL42 无占空比要求的奇数分频
`timescale 1ns/1ns
module odd_div (
input wire rst ,
input wire clk_in,
output wire clk_out5
);
//*************code***********//
reg [2:0] cnt;
reg clk_out_temp;
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
cnt<=0;// reset
end
else if (cnt==4) begin
cnt<=0;
end
else begin
cnt<=cnt+1'b1;
end
end
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
clk_out_temp<=0;// reset
end
else if (cnt==0||cnt==2) begin
clk_out_temp<=!clk_out_temp;
end
end
assign clk_out5 = clk_out_temp;
//*************code***********//
endmodule
VL43 根据状态转移写状态机-三段式
`timescale 1ns/1ns
module fsm1(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter s0=0,s1=1,s2=2,s3=3;
reg [1:0] state,next_state;
always @(posedge clk or negedge rst) begin
if (!rst) begin
state<=s0;// reset
end
else begin
state<=next_state;
end
end
always@(*)begin
case(state)
s0:next_state=data?s1:s0;
s1:next_state=data?s2:s1;
s2:next_state=data?s3:s2;
s3:next_state=data?s0:s3;
default:next_state=s0;
endcase
end
always @(posedge clk or negedge rst) begin
if (!rst) begin
flag<=0;// reset
end
else if (state==s3&&data==1) begin
flag<=1;
end
else begin
flag<=0;
end
end
//*************code***********//
endmodule
VL44 根据状态转移写状态机-二段式
`timescale 1ns/1ns
module fsm2(
input wire clk ,
input wire rst ,
input wire data ,
output reg flag
);
//*************code***********//
parameter s0=0,s1=1,s2=2,s3=3,s4=4;
reg [2:0] state,next_state;
always @(posedge clk or negedge rst) begin
if (!rst) begin
state<=s0;// reset
end
else begin
state<=next_state;
end
end
always@(*)begin
case(state)
s0:begin
next_state=data?s1:s0;
flag=0;
end
s1:begin
next_state=data?s2:s1;
flag=0;
end
s2:begin
next_state=data?s3:s2;
flag=0;
end
s3:begin
next_state=data?s4:s3;
flag=0;
end
s4:begin
next_state=data?s1:s0;
flag=1;
end
endcase
end
//*************code***********//
endmodule
`timescale 1ns/1ns
module mux(
input clk_a ,
input clk_b ,
input arstn ,
input brstn ,
input [3:0] data_in ,
input data_en ,
output reg [3:0] dataout
);
reg [3:0] data_reg;
reg data_en_a,data_en_b0,data_en_b1;
always @(posedge clk_a or negedge arstn) begin
if (!arstn) begin
data_reg<=0;// reset
end
else begin
data_reg<=data_in;
end
end
always @(posedge clk_a or negedge arstn) begin
if (!arstn) begin
data_en_a<=0;// reset
end
else begin
data_en_a<=data_en;
end
end
always @(posedge clk_b or negedge brstn) begin
if (!brstn) begin
data_en_b0<=0;// reset
data_en_b1<=0;
end
else begin
data_en_b0<=data_en_a;
data_en_b1<=data_en_b0;
end
end
always@(posedge clk_b or negedge brstn) begin
if(~brstn)
dataout <= 0;
else
dataout <= data_en_b1? data_reg: dataout;
end
endmodule
VL49 脉冲同步电路
`timescale 1ns/1ns
module pulse_detect(
input clk_fast ,
input clk_slow ,
input rst_n ,
input data_in ,
output dataout
);
reg data_level, data_level1, data_level2, data_level3;
// 脉冲信号转电平信号
always@(posedge clk_fast or negedge rst_n) begin
if(~rst_n)
data_level <= 0;
else
data_level <= data_in? ~data_level: data_level;
end
// 电平信号打两拍再转为脉冲信号
always@(posedge clk_slow or negedge rst_n) begin
if(~rst_n) begin
data_level1 <= 0;
data_level2 <= 0;
data_level3 <= 0;
end
else begin
data_level1 <= data_level;
data_level2 <= data_level1;
data_level3 <= data_level2;
end
end
assign dataout = data_level3^data_level2;
endmodule