注意:1、计数为0是从什么时候开始的 2、rst下降沿有效
3、对输入寄存的同时,还要给输出使用,所以cnt=0时候,将d输出而不是d_reg
`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
//*************code***********//
reg [1:0]cnt;
reg [7:0]d_reg;
always@(posedge clk or negedge rst)begin
if(!rst)begin
cnt<=0;
end
else if(cnt==2'd3)begin
cnt<=0;
end
else begin
cnt<=cnt+1'b1;
end
end
always@(posedge clk or negedge rst)begin
if(!rst)begin
d_reg<=0;
input_grant<=1'b0;
end
else if((cnt==2'd0))begin
d_reg<=d;
input_grant<=1'b1;
end
else begin
d_reg<=d_reg;
input_grant<=1'b0;
end
end
always@(posedge clk or negedge rst)begin
if(!rst)begin
out=0;
end
else
case(cnt)
2'b00:begin
out<=d;//cnt=0时,d赋值给d_reg,同时out下一拍输出所以用d
end
2'b01:begin
out<=(d_reg<<2)-d_reg;
end
2'b10:begin
out<=(d_reg<<3)-d_reg;
end
2'b11:begin
out<=(d_reg<<3);
end
default:begin
out<=0;
end
endcase
end
//*************code***********//
endmodule
实现串并转换电路,输入端输入单bit数据,每当本模块接收到6个输入数据后,输出端输出拼接后的6bit数据。本模块输入端与上游的采用valid-ready双向握手机制,输出端与下游采用valid-only握手机制。数据拼接时先接收到的数据放到data_b的低位。
电路的接口如下图所示。valid_a用来指示数据输入data_a的有效性,valid_b用来指示数据输出data_b的有效性;ready_a用来指示本模块是否准备好接收上游数据,本模块中一直拉高;clk是时钟信号;rst_n是异步复位信号
`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]r_data;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
ready_a<=0;
else
ready_a<=1;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt <=0;
valid_b<=1'b0;
r_data <=0;
end
else if(valid_a==1'b1)
if(cnt==3'd5)begin
cnt<=0;
r_data[5]<=data_a;
valid_b<=1'b1;
end
else begin
cnt<=cnt+1'b1;
r_data[cnt]<=data_a;
valid_b<=1'b0;
end
else begin
cnt<=cnt;
valid_b<=1'b0;
r_data<=r_data;
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
data_b<=0;
else if((cnt==3'd5)&&(valid_a==1'b1))
data_b<={data_a,r_data[4:0]};
else
data_b<=data_b;
end
endmodule