|
1000资产
设计一个位宽为4的加法器,其输出受到输入最低位与的结果的影响。如果最低位的与为0,则当前时钟周期直接输出结果(下一个时钟周期可以读取下一组输入);如果最低位的与为1,则当前时钟周期输出高阻,在下一个时钟周期输出全0(下一个时钟周期不能读取下一组输入)。
在testbench中,需要根据最低位的结果循环读入输入数据:如果最低位的与为0,则在下一个时钟周期读取下一组输入;如果最低位的与为1,则在下下一个时钟周期读取下一组输入。
我的代码有问题,请大神帮忙修改下,能够实现所需功能。谢谢。
module test #(parameter width_in = 4)
(
input clk, rst,
input [width_in - 1 : 0] x, y,
output E,
output reg [width_in : 0] out
);
wire [width_in : 0] s;
reg flag;
assign s = x + y;
assign E = x[0] & y[0];
always @ (posedge clk or negedge rst)
begin
if (!rst)
begin
out <= 'd0;
flag <= 'd0;
end
else if (!E) //E == 0 normal ouput
begin
out <= s;
flag <= 'd0;
end
else if (flag)
begin
out <= 'd0;
flag <= 'd0;
end
else
begin
out <= 'dz;
flag <= 1'b1;
end
end
endmodule
`timescale 1ns / 1ps
module test_tb #(parameter width_in = 4, count = 10) ();
reg clk, rst;
reg [width_in - 1 : 0] x, y;
wire E;
wire [width_in : 0] out;
test #(4) dut (clk, rst, x, y, E, out);
reg [width_in - 1 : 0] inx [0 : count-1];
reg [width_in - 1 : 0] iny [0 : count-1];
integer i;
initial
begin
clk = 1'b1;
end
always
begin
#5 clk = ~clk;
end
initial
begin
rst = 1'b0;
#10
rst = 1'b1;
$readmemb("../../inx.txt", inx);
$readmemb("../../iny.txt", iny);
for (i = 0; i <= count-1; i = i + 1)
begin
x <= inx;
y <= iny;
if (~E)
#10;
else
#20;
end
#20 $stop;
end
endmodule
|
最佳答案
查看完整内容
再修改了一下,输出 E 规范了一下波形
module test #(parameter width_in = 4)
(
input clk, rst,
input [width_in - 1 : 0] x, y,
output E,
output [width_in : 0] out
);
wire E_0;
wire [width_in : 0] s;
reg flag;
reg [width_in : 0] out_r;
assign s = x + y;
assign E = flag ? 1'b0 : (x[0] & y[0]); // input data reading c ...
|