并串转换
描述
题目描述:
设计一个模块进行并串转换,要求每四位d输为转到一位dout输出,输出valid_in表示此时的输入有效。
信号示意图:
clk为时钟
rst为低电平复位
valid_in 表示输入有效
d 信号输入
dout 信号输出
波形示意图:
输入描述:
clk为时钟
rst为低电平复位
d 信号输入
输出描述:
dout 信号输出
valid_in 表示输入有效
解题思路
并串转换的思路一般是使用移位寄存器的思想------根据并行数据的位数n对应设置n个寄存器,将并行数据依次存入移存器中,并在每个时钟周期下进行移动;
根据题干中波形图的描述(如红色方框所示):
可以发现,valid_in信号通常在第4个周期为1(有效),在其他三个周期为0;
问题:我感觉这个d[3:0]的数据和dout对不上,看着很奇怪;
设计思路:
①计数器模块
设置一个计数器,循环计数0~3;
cpp
reg [1:0] cnt;
//计数器cnt部分
/*注意: 此处必须为非阻塞赋值语句*/
always @(posedge clk or negedge rst) begin
if (!rst) cnt <= 2'b00;
else cnt <= cnt + 2'b01;
end
②移存器部分
cpp
//移位寄存器部分
always @(posedge clk or negedge rst) begin
if (!rst) begin
dout_r <= 4'd0;
valid_in_r <= 1'b0;
end
else begin
if (cnt == 2'b11) begin
dout_r <= d;
valid_in_r <= 1'b1;
end
else begin
dout_r[3:0] <= {dout_r[2],dout_r[1],dout_r[0],dout_r[3]};
valid_in_r <= 1'b0;
end
end
end
assign dout = dout_r[3];
assign valid_in = valid_in_r;
完整代码
cpp
`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 valid_in_r;
reg [3:0] dout_r;
reg [1:0] cnt;
//计数器cnt部分
/*注意: 此处必须为非阻塞赋值语句*/
always @(posedge clk or negedge rst) begin
if (!rst) cnt <= 2'b00;
else cnt <= cnt + 2'b01;
end
//移位寄存器部分
always @(posedge clk or negedge rst) begin
if (!rst) begin
dout_r <= 4'd0;
valid_in_r <= 1'b0;
end
else begin
if (cnt == 2'b11) begin
dout_r <= d;
valid_in_r <= 1'b1;
end
else begin
dout_r[3:0] <= {dout_r[2],dout_r[1],dout_r[0],dout_r[3]};
valid_in_r <= 1'b0;
end
end
end
assign dout = dout_r[3];
assign valid_in = valid_in_r;
//*************code***********//
endmodule