题目
描述
题目描述:
设计一个模块进行并串转换,要求每四位d输为转到一位dout输出,输出valid_in表示此时的输入有效
信号示意图:
clk为时钟
rst为低电平复位
valid_in 表示输入有效
d 信号输入
dout 信号输出
波形示意图:
输入描述:
clk为时钟
rst为低电平复位
d 信号输入
输出描述:
dout 信号输出
valid_in 表示输入有效
状态机解法
`timescale 1ns/1ns
module huawei5(
input wire clk ,
input wire rst ,
input wire [3:0]d ,
output wire valid_in ,
output wire dout
);
//*************code***********//
reg [4:0] state_r = 4'd0, state_s;
reg [3:0] d_r = 4'd0;
always @(posedge clk, negedge rst) begin
if (~rst) begin
state_r <= 5'd0;
end else begin
state_r <= state_s;
end
end
always @(*) begin
case (state_r)
5'd0: state_s = 5'd1;
5'd1: state_s = 5'd2;
5'd2: state_s = 5'd3;
5'd3: state_s = 5'd4;
5'd4: state_s = 5'd1;
default: state_s = 5'd0;
endcase
end
always @(posedge clk) begin
case (state_r)
5'd0: d_r <= 4'd0;
5'd3: d_r <= d; // 由于state_r == 4时d数据变化,因此需要提前一个周期采样
endcase
end
assign valid_in = (state_r == 5'd4);
assign dout = (state_r == 5'd4) ? d_r[3] : d_r[3 - state_r]; // 由于d是下降沿变化的,因此需要使用d_r[3]而不是d[3]
// assign dout = (state_r == 5'd4) ? d[3] : d_r[3 - state_r];
//*************code***********//
endmodule