题目如下:
设计一个模块进行并串转换,要求四位宽d输入转到一位宽dout输出,输出valid_in表示此时的输入有效
通过题目设计模块总共有五个接口:
clk为时钟
rst为低电平复位
valid_in 表示输入有效
[3:0] d 信号输入
dout 信号输出
代码如下:
module bing2chuan(
input clk,
input rst,
input [3:0] d,
output reg valid_in,
output dout
);
reg [3:0] cnt;
reg [3:0] data;
assign dout = data[3];
always@(posedge clk or negedge rst)
begin
if(rst == 'd0)
cnt <= 'd0;
else if(cnt == 'd3)
cnt <= 'd0;
else
cnt <= cnt + 'd1;
end
//assign valid_in =(cnt =='d3)?1'b1:1'b0; (这里如果这样写valid_in信号会提前一个时钟)
always@(posedge clk or negedge rst)
begin
if(rst == 'd0)
valid_in <= 'd0;
else if(cnt =='d3)
valid_in <= 'd1;
else
valid_in <= 'd0;
end
always@(posedge clk or negedge rst)
begin
if(rst == 'd0)
data <= 'd0;
else if(cnt == 'd3)
data <= d;
else
data <={data[2:0],data[3]};
end
endmodule
编写testbench 进行测试:
module bing2chuan_tb;
reg clk;
reg rst;
reg [3:0] d;
wire valid_in;
wire dout;
bing2chuan bing2chuan_m0(
.clk(clk),
.rst(rst),
.d(d),
.valid_in(valid_in),
.dout(dout)
);
initial begin
clk =0;
forever #5 clk =~clk;
end
initial begin
#10
rst =0;
#50
rst =1;
#20
d = 4'b1010;
#30
d = 4'b1111;
#50
d=4'b0010;
$finish;
end
endmodule
仿真结果如下图所示: