В данном примере мы рассмотрим модель QPSK модулятора в связке с КИХ-фильтром, цель данного примера продемонстрировать возможности генератора когда, а так же верифицировать этот код при помощи симулятора Verilog встроенного в Engee, сама модель достаточно простая и состоит из 3 блоков.
-
Gen_data - просто генерирует комбинации бит от [0,0] до [1,1]
-
QPSK_modulator - преобразует последовательность битов в комплексные символы (сдвиги фазы несущей в этой реализации не учитывается).
- FIR - это цифровой фильтр с конечной импульсной характеристикой, который вычисляет каждое выходное значение как взвешенную сумму последних 11 входных отсчётов.
Теперь перейдём к запуску модели и кодогенерации.
Building...
Progress 0%
Progress 80%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
"FIR.im" => WorkspaceArray{Fixed{1, 8, 7, Int8}}("QPSK+FIR_verilog/FIR.im")
,
"FIR.re" => WorkspaceArray{Fixed{1, 8, 7, Int8}}("QPSK+FIR_verilog/FIR.re")
,
"FIR.valid" => WorkspaceArray{Bool}("QPSK+FIR_verilog/FIR.valid")
)
Out[0]:
301-element Vector{Fixed{1, 8, 7, Int8}}:
fi(-0.0078125, 1, 8, 7)
fi(-0.0078125, 1, 8, 7)
fi(-0.0234375, 1, 8, 7)
fi(-0.015625, 1, 8, 7)
fi(-0.03125, 1, 8, 7)
fi(0.25, 1, 8, 7)
fi(0.234375, 1, 8, 7)
fi(0.2421875, 1, 8, 7)
fi(0.2265625, 1, 8, 7)
fi(0.2265625, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
⋮
fi(0.2265625, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.21875, 1, 8, 7)
fi(0.2265625, 1, 8, 7)
Графики нам пригодится для сравнения с работой кода Verilog.
Теперь выполним генерацию кода из блоков модели и опишем тестовый модуль аналогично входам в модели.
Модуль tb — это тестовый стенд (testbench), который проверяет работу модулей QPSK-модулятора и FIR-фильтра, подавая на вход тестовые данные и записывая результаты.
Тестовый стенд подает на вход циклическую последовательность битов [11, 00, 10, 01], записывает выходные значения модулятора (QPSK_Re, QPSK_Im) и фильтра (FIR_Re, FIR_Im) в файл output_data.txt и визуализирует их в консоли, а также генерирует файл waveforms test_codgen_ic.vcd для анализа временных диаграмм.
Содержимое файла /user/my_projects/Demo/QPSK+FIR_verilog/prj/tb.v:
==================================================
module tb;
reg clock;
reg reset;
reg io_bit_1;
reg io_bit_2;
reg io_Valid;
wire io_Out_Valid;
wire [3:0] io_Out_Re;
wire [3:0] io_Out_Im;
wire fir_valid;
wire [7:0] fir_re;
wire [7:0] fir_im;
reg [1:0] test_pattern [0:3];
integer pattern_index;
integer cycle_count;
QPSKFIR_verilog_QPSK_modulator qpsk_mod (
.clock(clock),
.reset(reset),
.io_bit_1(io_bit_1),
.io_bit_2(io_bit_2),
.io_Valid(io_Valid),
.io_Out_Valid(io_Out_Valid),
.io_Out_Re(io_Out_Re),
.io_Out_Im(io_Out_Im)
);
QPSKFIR_verilog_FIR fir_filter (
.clock(clock),
.reset(reset),
.io_Re(io_Out_Re),
.io_Im(io_Out_Im),
.io_Valid(io_Out_Valid),
.io_valid(fir_valid),
.io_re(fir_re),
.io_im(fir_im)
);
always #5 clock = ~clock;
initial begin
$dumpfile("test_codgen_ic.vcd");
$dumpvars(0, tb);
end
// Функции для преобразования в дробный формат
function real qpsk_to_real;
input [3:0] value;
begin
qpsk_to_real = $signed(value) / 8.0; // Q3.4: 3 бита целая часть, 4 бита дробная
end
endfunction
function real fir_to_real;
input [7:0] value;
begin
fir_to_real = $signed(value) / 128.0; // Q1.7: 1 бит знак, 7 бит дробная часть
end
endfunction
integer data_file;
initial begin
data_file = $fopen("output_data.txt", "w");
$fwrite(data_file, "Cycle\tTime\tQPSK_Valid\tQPSK_Re\tQPSK_Im\tFIR_Valid\tFIR_Re\tFIR_Im\tQPSK_Re_Real\tQPSK_Im_Real\tFIR_Re_Real\tFIR_Im_Real\n");
end
initial begin
test_pattern[0] = 2'b11;
test_pattern[1] = 2'b00;
test_pattern[2] = 2'b10;
test_pattern[3] = 2'b01;
pattern_index = 0;
cycle_count = 0;
end
initial begin
clock = 0;
reset = 1;
io_bit_1 = 0;
io_bit_2 = 0;
io_Valid = 0;
#20 reset = 0;
#10;
for (integer i = 0; i < 50; i = i + 1) begin
io_bit_1 = test_pattern[pattern_index][1];
io_bit_2 = test_pattern[pattern_index][0];
io_Valid = 1;
pattern_index = (pattern_index + 1) % 4;
#10;
end
#100;
$fclose(data_file);
$finish;
end
always @(posedge clock) begin
if (!reset) begin
real qpsk_re_real, qpsk_im_real, fir_re_real, fir_im_real;
// Преобразуем в дробные числа
qpsk_re_real = qpsk_to_real(io_Out_Re);
qpsk_im_real = qpsk_to_real(io_Out_Im);
fir_re_real = fir_to_real(fir_re);
fir_im_real = fir_to_real(fir_im);
$fwrite(data_file, "%d\t%0t\t%b\t%d\t%d\t%b\t%d\t%d\t%f\t%f\t%f\t%f\n",
cycle_count, $time,
io_Out_Valid, $signed(io_Out_Re), $signed(io_Out_Im),
fir_valid, $signed(fir_re), $signed(fir_im),
qpsk_re_real, qpsk_im_real, fir_re_real, fir_im_real);
$display("Cycle: %d | QPSK: Valid=%b, Re=%d(%f), Im=%d(%f) | FIR: Valid=%b, Re=%d(%f), Im=%d(%f)",
cycle_count,
io_Out_Valid, $signed(io_Out_Re), qpsk_re_real, $signed(io_Out_Im), qpsk_im_real,
fir_valid, $signed(fir_re), fir_re_real, $signed(fir_im), fir_im_real);
cycle_count = cycle_count + 1;
end
end
endmodule
==================================================
Конец файла
Теперь запустим симулцию.
Как мы видим по результатам выполнения симуляции были сформированы 2 файла txt и vcd.
TXT — текстовый файл с таблицей данных (временные метки, значения сигналов).
VCD (Value Change Dump) — бинарный файл временных диаграмм, используемый для визуальной отладки сигналов в GTKWave и других анализаторах.
Давайте попробуем выполнить парсинг VCD.
Упрощенная конвертация VCD в TXT: test_codgen_ic.vcd
Упрощенная конвертация завершена: simple_result.txt
Как мы видим это возможно, но не очень удобно и грамоско, плюсом мы не вытащили названия полей.
Поэтому давайте воспользуемся вторым вариантом и проанализируем TXT.
Как мы можем заметить поведения теста идентично модели, не считая различий в типах данных, мы видим, что QPSK формирует символа, а FIR выполняет фильтрацию этих данных.
Вывод
В данном примере мы разобрали как можно визуализировать тесты симуляции Verilog кода, а так же сгенерировали простую модель передающего тракта системы связи.
{"id": "4c400fc7_46cb_4a37_9009_26eb4d20bd46", "data": [{"xaxis": "x", "colorbar": {"y": 0.513888888888889, "title": {"text": ""}, "len": 0.9525371828521435, "x": 0.9934383202099738}, "yaxis": "y", "x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301], "showlegend": true, "mode": "lines", "name": "Re", "legendgroup": "Re", "line": {"color": "rgba(0, 154, 250, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [-0.0078125, -0.0078125, -0.0234375, -0.015625, -0.03125, 0.25, 0.234375, 0.2421875, 0.2265625, 0.2265625, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.296875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.21875, 0.2265625], "type": "scatter"}, {"xaxis": "x", "colorbar": {"y": 0.513888888888889, "title": {"text": ""}, "len": 0.9525371828521435, "x": 0.9934383202099738}, "yaxis": "y", "x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301], "showlegend": true, "mode": "lines", "name": "Im", "legendgroup": "Im", "line": {"color": "rgba(227, 111, 71, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0, -0.0078125, 0, -0.015625, -0.0078125, -0.2890625, -0.28125, -0.296875, -0.2890625, -0.296875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625, 0.21875, 0.2421875, 0.21875, 0.2421875, -0.3203125, -0.296875, -0.3203125, -0.296875, -0.3046875, -0.3046875, -0.296875, -0.3203125, -0.296875, -0.3203125, 0.2421875, 0.21875, 0.2421875, 0.21875, 0.2265625, 0.2265625], "type": "scatter"}], "config": {"showlegend": true, "xaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 100, 200, 300], "range": [-8, 310], "domain": [0.0658209390492855, 0.9934383202099738], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0", "100", "200", "300"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "paper_bgcolor": "rgba(255, 255, 255, 1.000)", "annotations": [], "height": 400, "margin": {"l": 0, "b": 20, "r": 0, "t": 20}, "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "yaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [-0.30000000000000004, -0.2, -0.1, 0, 0.1, 0.2], "range": [-0.33742187500000004, 0.26710937500000004], "domain": [0.03762029746281716, 0.9901574803149606], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["-0.3", "-0.2", "-0.1", "0.0", "0.1", "0.2"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "legend": {"yanchor": "auto", "xanchor": "auto", "bordercolor": "rgba(0, 0, 0, 1)", "bgcolor": "rgba(255, 255, 255, 1.000)", "borderwidth": 1, "tracegroupgap": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "title": {"font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}, "text": ""}, "traceorder": "normal", "x": 1}, "width": 1156.453125}}
{"id": "ae3f5315_8405_4531_bfe5_c0b3ba2249b9", "data": [{"xaxis": "x", "colorbar": {"y": 0.7430555555555556, "title": {"text": ""}, "len": 0.4359507144940217, "x": 0.9950787401574803}, "yaxis": "y", "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60], "showlegend": true, "mode": "lines", "name": "QPSK Real", "legendgroup": "QPSK Real", "line": {"color": "rgba(0, 0, 255, 1.000)", "shape": "linear", "dash": "solid", "width": 2}, "y": [0, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], "type": "scatter"}, {"xaxis": "x", "colorbar": {"y": 0.7430555555555556, "title": {"text": ""}, "len": 0.4359507144940217, "x": 0.9950787401574803}, "yaxis": "y", "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60], "showlegend": true, "mode": "lines", "name": "QPSK Imag", "legendgroup": "QPSK Imag", "line": {"color": "rgba(255, 0, 0, 1.000)", "shape": "linear", "dash": "solid", "width": 2}, "y": [0, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, -6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], "type": "scatter"}, {"xaxis": "x2", "colorbar": {"y": 0.24305555555555555, "title": {"text": ""}, "len": 0.4359507144940216, "x": 0.9950787401574803}, "yaxis": "y2", "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60], "showlegend": true, "mode": "lines", "name": "FIR Real", "legendgroup": "FIR Real", "line": {"color": "rgba(0, 128, 0, 1.000)", "shape": "linear", "dash": "solid", "width": 2}, "y": [0, -1, -1, -2, -2, -2, 32, 31, -38, -38, 29, 29, -39, -39, 29, 29, -39, -39, 29, 29, -39, -39, 29, 29, -39, -39, 29, 29, -39, -39, 29, 29, -39, -39, 29, 29, -39, -39, 29, 29, -39, -39, 29, 29, -39, -39, 29, 29, -39, -39, 29, 28, -39, -41, 29, 28, 30, 28, 29, 28, 28], "type": "scatter"}, {"xaxis": "x2", "colorbar": {"y": 0.24305555555555555, "title": {"text": ""}, "len": 0.4359507144940216, "x": 0.9950787401574803}, "yaxis": "y2", "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60], "showlegend": true, "mode": "lines", "name": "FIR Imag", "legendgroup": "FIR Imag", "line": {"color": "rgba(255, 165, 0, 1.000)", "shape": "linear", "dash": "solid", "width": 2}, "y": [0, 0, -2, 1, -6, 3, -44, 40, -48, 42, -51, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 42, -52, 41, -51, 38, -48, 35, 24, 32, 27, 29, 28], "type": "scatter"}], "config": {"showlegend": true, "paper_bgcolor": "rgba(255, 255, 255, 1.000)", "legend": {"yanchor": "auto", "xanchor": "auto", "bordercolor": "rgba(0, 0, 0, 1)", "bgcolor": "rgba(255, 255, 255, 1.000)", "borderwidth": 1, "tracegroupgap": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "title": {"font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}, "text": ""}, "traceorder": "normal", "x": 1}, "height": 600, "yaxis2": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [-40, -20, 0, 20, 40], "range": [-54.82, 44.82], "domain": [0.025080198308544768, 0.46103091280256636], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["-40", "-20", "0", "20", "40"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x2", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "xaxis2": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 10, 20, 30, 40, 50, 60], "range": [-1.8000000000000007, 61.8], "domain": [0.04936570428696413, 0.9950787401574803], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0", "10", "20", "30", "40", "50", "60"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y2", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "annotations": [{"yanchor": "top", "xanchor": "center", "rotation": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 20}, "yref": "paper", "showarrow": false, "text": "QPSK Signal", "xref": "paper", "x": 0.5222222222222223}, {"yanchor": "top", "xanchor": "center", "rotation": 0, "y": 0.5, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 20}, "yref": "paper", "showarrow": false, "text": "FIR Filter Output", "xref": "paper", "x": 0.5222222222222223}], "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "margin": {"l": 0, "b": 20, "r": 0, "t": 20}, "width": 591.96875, "xaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 10, 20, 30, 40, 50, 60], "range": [-1.8000000000000007, 61.8], "domain": [0.04936570428696413, 0.9950787401574803], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0", "10", "20", "30", "40", "50", "60"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "yaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [-5, -2.5, 0, 2.5, 5], "range": [-6.36, 6.36], "domain": [0.5250801983085448, 0.9610309128025665], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["-5.0", "-2.5", "0.0", "2.5", "5.0"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}}}