有符号数和无符号数比较大小,有符号数会被当做无符号数。
代码如下。我把波形信号data和dac输出进行比较,比较结果如图。可以看到当data为正时,比较结果是对的;当data为负时,被当做正的进行比较了。
reg [19:0] signed data;
reg [18:0] unsigned dac_out;
wire cmp_out;
assign cmp_out = (data > dac_out)? 1'b1: 1'b0;
结论:有符号数只能和有符号数比较。
reg [19:0] signed data;
reg [19:0] signed dac_out;
wire cmp_out;
assign cmp_out = (data > dac_out)? 1'b1: 1'b0;
附代码文件和数据文件:
代码
`timescale 1ns/1ns
module file_operation_tb;
reg clk_50M;
reg signed [19:0] data; // 18+1, 1 for sign bit
reg unsigned [31:0] count; // data counter
integer fp; // file handler
wire cmp_out; // comparator output
reg unsigned [31:0] wave_cnt; // wave counter
wire signed [19:0] dac_out; // dac output
reg [15:0] dac_load; // dac loading value
wire [31:0] buffer;
initial begin
clk_50M = 1'b0;
data = 20'd0;
count = 32'd0;
wave_cnt = 32'd0;
end
always #10 clk_50M = ~clk_50M;
initial begin
#100
fp = $fopen("../../../testbench/sine.txt", "r");
if(!(|fp)) begin
$display("cannot open file\n");
#100
$stop;
end
else begin
while(wave_cnt < 32'd50) begin // genearte 50 sine waves
$display("reading file...\n");
while(!($feof(fp))) begin
@(posedge clk_50M) begin
$fscanf(fp, "%d", data);
count <= count + 32'd1;
//$display("%d %d", data, count);
end
end
$display("done reading: round %d\n", wave_cnt + 1);
$fseek(fp, 0, 0);
wave_cnt = wave_cnt + 1;
end
$fclose(fp);
#500
$stop;
end
end
assign cmp_out = (data > dac_out)? 1'b1: 1'b0;
initial begin
dac_load = 16'd1;
end
always@(wave_cnt) begin
if(wave_cnt < 30 && !(wave_cnt % 2)) // take dac load by 2 every 2 sine waves in the first 30 waves
dac_load <= dac_load << 1;
else
dac_load <= dac_load;
end
assign buffer = dac_load; // use buffer to avoid truncature
assign dac_out = (((buffer * 5000) >> 8) * 100) >> 8;
endmodule