一、题目描述
现在输入了一个压缩的16位数据,其实际上包含了四个数据[3:0][7:4][11:8][15:12],
现在请按照sel选择输出四个数据的相加结果,并输出valid_out信号(在不输出时候拉低)
0: 不输出且只有此时的输入有效
1:输出[3:0]+[7:4]
2:输出[3:0]+[11:8]
3:输出[3:0]+[15:12]
信号示意图:

波形示意图:

输入描述:
输入信号 d, clk, rst
类型 wire
在testbench中,clk为周期5ns的时钟,rst为低电平复位
输出描述:
输出信号 validout ; out
类型 reg
二、实现思路
看到sel信号的四种选择,马上想到case语句。
1.sel = 0时的声明(不输出且只有此时的输入有效 ),此时应定义一个寄存器d_lock用于寄存数据d,剩下三个状态的计算输入皆是从定义的d_lock寄存器中得到的。
2.有输出时validout=1;否则validout=0。
三、代码展示
方法1
`timescale 1ns/1ns
module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,
output [4:0]out,
output validout
);
//*************code***********//
reg [4:0] out;
reg validout;
reg [15:0] d_lock;
always@(posedge clk or negedge rst)
if(rst == 1'b0) begin
out <= 5'b0;
validout <= 1'b0;
d_lock <= 16'd0;
end
else case(sel)
2'd0 : begin
out <= 5'd0;
validout <= 1'b0;
d_lock <= d;
end
2'd1 : begin
out <= d_lock[3:0] + d_lock[7:4];
validout <= 1'b1;
end
2'd2 : begin
out <= d_lock[3:0] + d_lock[11:8];
validout <= 1'b1;
end
3'd3 : begin
out <= d_lock[3:0] + d_lock[15:12];
validout <= 1'b1;
end
default : begin
out <= 5'd0;
validout <= 1'b0;
end
endcase
//*************code***********//
endmodule
方法2
利用组合逻辑
`timescale 1ns/1ns
module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,
output [4:0]out,
output validout
);
//*************code***********//
reg [15:0] d_reg;
wire [3:0] d0;
wire [3:0] d1;
wire [3:0] d2;
wire [3:0] d3;
assign d0 = d_reg[3:0];
assign d1 = d_reg[7:4];
assign d2 = d_reg[11:8];
assign d3 = d_reg[15:12];
reg [4:0] out_reg;
reg validout_reg;
always@(posedge clk or negedge rst)
begin
if(!rst)begin
out_reg<=5'd0;
validout_reg<=1'b0;
d_reg<=16'd0;
end
else begin
case(sel)
2'b00 : begin
d_reg <= d;
out_reg <= 5'b0;
validout_reg<=1'b0;
end
2'b01 : begin
out_reg <= d_reg[3:0] + d_reg[7:4];// d0 + d1;
validout_reg<=1'b1;
end
2'b10 : begin
out_reg <= d0 + d2;
validout_reg<=1'b1;
end
2'b11 : begin
out_reg <= d0 + d3;
validout_reg<=1'b1;
end
default:
begin
out_reg <= 5'b0;
validout_reg <= 1'b0;
end
endcase
end
end
assign out = out_reg;
assign validout = validout_reg;
//*************code***********//
endmodule
`timescale 1ns/1ns
module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,
output [4:0]out,
output validout
);
//*************code***********//
reg [4:0]out_temp;
reg validout_temp;
reg [15:0]d_temp;
always@(posedge clk or negedge rst)begin
if(!rst)begin
out_temp<=0;
validout_temp<=0;
end
else begin
case(sel)
0:begin out_temp<=0; d_temp<=d;validout_temp<=0; end
1:begin out_temp<=d_temp[3:0]+d_temp[7:4]; validout_temp<=1; end
2:begin out_temp<=d_temp[3:0]+d_temp[11:8]; validout_temp<=1; end
3:begin out_temp<=d_temp[3:0]+d_temp[15:12]; validout_temp<=1; end
default:begin out_temp<=0; validout_temp<=0; end
endcase
end
end
assign validout=validout_temp;
assign out=out_temp;
//*************code***********//
endmodule
666



被折叠的 条评论
为什么被折叠?



