verilog 实现4位并转串

题目如下:
设计一个模块进行并串转换,要求四位宽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

仿真结果如下图所示:
在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值