From af6516eb8597bef0dfbfe730ea43eace81ecff86 Mon Sep 17 00:00:00 2001 From: Imants Pulkstenis Date: Mon, 8 Jun 2020 20:45:20 +0300 Subject: [PATCH] Signal generators are working. Tested on TestBench --- ld2/top_tb.v | 29 +- ld3/dds_vhdl/dds_vhdl.qpf | 31 ++ ld3/dds_vhdl/dds_vhdl.qsf | 59 ++++ ld3/dds_vhdl/dds_vhdl.vhd | 603 +++++++++++++++++++++++++++++++++++ ld3/dds_vhdl/dds_vhdl_tb.vhd | 108 +++++++ ld3/ld3.m | 61 ++++ ld3/ls3_fixed_point.slx | Bin 0 -> 23930 bytes ld3/ls3_floting_point.slx | Bin 0 -> 22014 bytes 8 files changed, 885 insertions(+), 6 deletions(-) create mode 100644 ld3/dds_vhdl/dds_vhdl.qpf create mode 100644 ld3/dds_vhdl/dds_vhdl.qsf create mode 100644 ld3/dds_vhdl/dds_vhdl.vhd create mode 100644 ld3/dds_vhdl/dds_vhdl_tb.vhd create mode 100644 ld3/ld3.m create mode 100644 ld3/ls3_fixed_point.slx create mode 100644 ld3/ls3_floting_point.slx diff --git a/ld2/top_tb.v b/ld2/top_tb.v index ae273ac..ba5d8a5 100644 --- a/ld2/top_tb.v +++ b/ld2/top_tb.v @@ -40,8 +40,8 @@ module top_tb(); reg clk = 1'b0; reg reset = 1'b0; -reg [3:0] sw = 4'b0000; -reg start = 1'b0; +reg [3:0] sw = 4'b0001; +reg start = 1'b1; reg up = 1'b0; // 50% duty cycle clock @@ -57,14 +57,31 @@ top Test_Unit( ); initial begin - start = 1; - up = 1; #1_000_000; $display("*"); #1_000_000; $display("*"); - start = 0; - up = 0; + #1_000_000; + $display("*"); + #1_000_000; + $display("*"); + #1_000_000; + $display("*"); + #1_000_000; + start = 1'b0; + $display("*"); + #1_000_000; + $display("*"); + #1_000_000; + $display("*"); + #1_000_000; + $display("*"); + #1_000_000; + $display("*"); + #1_000_000; + $display("*"); + #1_000_000; + $display("*"); #1_000_000; $display("*"); #1_000_000; diff --git a/ld3/dds_vhdl/dds_vhdl.qpf b/ld3/dds_vhdl/dds_vhdl.qpf new file mode 100644 index 0000000..9fb9890 --- /dev/null +++ b/ld3/dds_vhdl/dds_vhdl.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2015 Altera Corporation. All rights reserved. +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, the Altera Quartus II License Agreement, +# the Altera MegaCore Function License Agreement, or other +# applicable license agreement, including, without limitation, +# that your use is for the sole purpose of programming logic +# devices manufactured by Altera and sold by Altera or its +# authorized distributors. Please refer to the applicable +# agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 15.0.0 Build 145 04/22/2015 SJ Web Edition +# Date created = 22:16:23 March 21, 2018 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "15.0" +DATE = "22:16:23 March 21, 2018" + +# Revisions + +PROJECT_REVISION = "dds_vhdl" diff --git a/ld3/dds_vhdl/dds_vhdl.qsf b/ld3/dds_vhdl/dds_vhdl.qsf new file mode 100644 index 0000000..ea51e49 --- /dev/null +++ b/ld3/dds_vhdl/dds_vhdl.qsf @@ -0,0 +1,59 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2015 Altera Corporation. All rights reserved. +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, the Altera Quartus II License Agreement, +# the Altera MegaCore Function License Agreement, or other +# applicable license agreement, including, without limitation, +# that your use is for the sole purpose of programming logic +# devices manufactured by Altera and sold by Altera or its +# authorized distributors. Please refer to the applicable +# agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 64-Bit +# Version 15.0.0 Build 145 04/22/2015 SJ Web Edition +# Date created = 22:16:23 March 21, 2018 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# dds_vhdl_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "Cyclone V" +set_global_assignment -name DEVICE 5CGXFC7C7F23C8 +set_global_assignment -name TOP_LEVEL_ENTITY dds_vhdl +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 15.0.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "22:16:23 MARCH 21, 2018" +set_global_assignment -name LAST_QUARTUS_VERSION "19.1.0 Lite Edition" +set_global_assignment -name VHDL_FILE dds_vhdl_tb.vhd +set_global_assignment -name VHDL_FILE dds_vhdl.vhd +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 256 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/ld3/dds_vhdl/dds_vhdl.vhd b/ld3/dds_vhdl/dds_vhdl.vhd new file mode 100644 index 0000000..80585d4 --- /dev/null +++ b/ld3/dds_vhdl/dds_vhdl.vhd @@ -0,0 +1,603 @@ +----------------------------- +-- Author - Imants Pulkstenis +-- Date - 04.06.2020 +-- Project name - Lab work No3 +-- Module name - dds_vhdl +-- +-- Detailed module description: +-- DDS sinusoidal signal generator +-- +-- Revision: +-- A - initial design +-- B - +-- +----------------------------- +library ieee; --always use this library +use ieee.std_logic_1164.all; --always use this library + +use ieee.numeric_std.all; --use this library if arithmetic required + + +--define connections to outside +entity dds_vhdl is +generic +( + phase_width : integer := 9; + data_width : integer := 16 +); +port +( + clk : in std_logic; --100mhz clock + rst : in std_logic; --rst + phase_incr : in std_Logic_vector(phase_width - 1 downto 0); --"frequency" + phase_out : out std_Logic_vector(phase_width - 1 downto 0); + signal_out : out std_Logic_vector(data_width - 1 downto 0) +); +end dds_vhdl; + +--define inside of the module +architecture behavioral of dds_vhdl is + + --define inside use signals + type rom_table is array ( 0 to 2**phase_width - 1) of std_logic_vector(data_width - 1 downto 0); + constant signal_rom_table : rom_table := + ( + 0 => x"0000", + 1 => x"00c9", + 2 => x"0192", + 3 => x"025b", + 4 => x"0324", + 5 => x"03ed", + 6 => x"04b5", + 7 => x"057e", + 8 => x"0646", + 9 => x"070e", + 10 => x"07d6", + 11 => x"089d", + 12 => x"0964", + 13 => x"0a2b", + 14 => x"0af1", + 15 => x"0bb7", + 16 => x"0c7c", + 17 => x"0d41", + 18 => x"0e06", + 19 => x"0eca", + 20 => x"0f8d", + 21 => x"1050", + 22 => x"1112", + 23 => x"11d3", + 24 => x"1294", + 25 => x"1354", + 26 => x"1413", + 27 => x"14d2", + 28 => x"1590", + 29 => x"164d", + 30 => x"1709", + 31 => x"17c4", + 32 => x"187e", + 33 => x"1937", + 34 => x"19f0", + 35 => x"1aa7", + 36 => x"1b5d", + 37 => x"1c12", + 38 => x"1cc7", + 39 => x"1d7a", + 40 => x"1e2b", + 41 => x"1edc", + 42 => x"1f8c", + 43 => x"203a", + 44 => x"20e7", + 45 => x"2193", + 46 => x"223e", + 47 => x"22e7", + 48 => x"238f", + 49 => x"2435", + 50 => x"24da", + 51 => x"257e", + 52 => x"2620", + 53 => x"26c1", + 54 => x"2760", + 55 => x"27fe", + 56 => x"289a", + 57 => x"2935", + 58 => x"29ce", + 59 => x"2a65", + 60 => x"2afb", + 61 => x"2b8f", + 62 => x"2c22", + 63 => x"2cb2", + 64 => x"2d41", + 65 => x"2dcf", + 66 => x"2e5a", + 67 => x"2ee4", + 68 => x"2f6c", + 69 => x"2ff2", + 70 => x"3076", + 71 => x"30f9", + 72 => x"3179", + 73 => x"31f8", + 74 => x"3274", + 75 => x"32ef", + 76 => x"3368", + 77 => x"33df", + 78 => x"3453", + 79 => x"34c6", + 80 => x"3537", + 81 => x"35a6", + 82 => x"3612", + 83 => x"367d", + 84 => x"36e5", + 85 => x"374b", + 86 => x"37b0", + 87 => x"3812", + 88 => x"3872", + 89 => x"38cf", + 90 => x"392b", + 91 => x"3984", + 92 => x"39db", + 93 => x"3a30", + 94 => x"3a83", + 95 => x"3ad3", + 96 => x"3b21", + 97 => x"3b6d", + 98 => x"3bb6", + 99 => x"3bfd", + 100 => x"3c42", + 101 => x"3c85", + 102 => x"3cc5", + 103 => x"3d03", + 104 => x"3d3f", + 105 => x"3d78", + 106 => x"3daf", + 107 => x"3de3", + 108 => x"3e15", + 109 => x"3e45", + 110 => x"3e72", + 111 => x"3e9d", + 112 => x"3ec5", + 113 => x"3eeb", + 114 => x"3f0f", + 115 => x"3f30", + 116 => x"3f4f", + 117 => x"3f6b", + 118 => x"3f85", + 119 => x"3f9c", + 120 => x"3fb1", + 121 => x"3fc4", + 122 => x"3fd4", + 123 => x"3fe1", + 124 => x"3fec", + 125 => x"3ff5", + 126 => x"3ffb", + 127 => x"3fff", + 128 => x"4000", + 129 => x"3fff", + 130 => x"3ffb", + 131 => x"3ff5", + 132 => x"3fec", + 133 => x"3fe1", + 134 => x"3fd4", + 135 => x"3fc4", + 136 => x"3fb1", + 137 => x"3f9c", + 138 => x"3f85", + 139 => x"3f6b", + 140 => x"3f4f", + 141 => x"3f30", + 142 => x"3f0f", + 143 => x"3eeb", + 144 => x"3ec5", + 145 => x"3e9d", + 146 => x"3e72", + 147 => x"3e45", + 148 => x"3e15", + 149 => x"3de3", + 150 => x"3daf", + 151 => x"3d78", + 152 => x"3d3f", + 153 => x"3d03", + 154 => x"3cc5", + 155 => x"3c85", + 156 => x"3c42", + 157 => x"3bfd", + 158 => x"3bb6", + 159 => x"3b6d", + 160 => x"3b21", + 161 => x"3ad3", + 162 => x"3a83", + 163 => x"3a30", + 164 => x"39db", + 165 => x"3984", + 166 => x"392b", + 167 => x"38cf", + 168 => x"3872", + 169 => x"3812", + 170 => x"37b0", + 171 => x"374b", + 172 => x"36e5", + 173 => x"367d", + 174 => x"3612", + 175 => x"35a6", + 176 => x"3537", + 177 => x"34c6", + 178 => x"3453", + 179 => x"33df", + 180 => x"3368", + 181 => x"32ef", + 182 => x"3274", + 183 => x"31f8", + 184 => x"3179", + 185 => x"30f9", + 186 => x"3076", + 187 => x"2ff2", + 188 => x"2f6c", + 189 => x"2ee4", + 190 => x"2e5a", + 191 => x"2dcf", + 192 => x"2d41", + 193 => x"2cb2", + 194 => x"2c22", + 195 => x"2b8f", + 196 => x"2afb", + 197 => x"2a65", + 198 => x"29ce", + 199 => x"2935", + 200 => x"289a", + 201 => x"27fe", + 202 => x"2760", + 203 => x"26c1", + 204 => x"2620", + 205 => x"257e", + 206 => x"24da", + 207 => x"2435", + 208 => x"238f", + 209 => x"22e7", + 210 => x"223e", + 211 => x"2193", + 212 => x"20e7", + 213 => x"203a", + 214 => x"1f8c", + 215 => x"1edc", + 216 => x"1e2b", + 217 => x"1d7a", + 218 => x"1cc7", + 219 => x"1c12", + 220 => x"1b5d", + 221 => x"1aa7", + 222 => x"19f0", + 223 => x"1937", + 224 => x"187e", + 225 => x"17c4", + 226 => x"1709", + 227 => x"164d", + 228 => x"1590", + 229 => x"14d2", + 230 => x"1413", + 231 => x"1354", + 232 => x"1294", + 233 => x"11d3", + 234 => x"1112", + 235 => x"1050", + 236 => x"0f8d", + 237 => x"0eca", + 238 => x"0e06", + 239 => x"0d41", + 240 => x"0c7c", + 241 => x"0bb7", + 242 => x"0af1", + 243 => x"0a2b", + 244 => x"0964", + 245 => x"089d", + 246 => x"07d6", + 247 => x"070e", + 248 => x"0646", + 249 => x"057e", + 250 => x"04b5", + 251 => x"03ed", + 252 => x"0324", + 253 => x"025b", + 254 => x"0192", + 255 => x"00c9", + 256 => x"0000", + 257 => x"ff37", + 258 => x"fe6e", + 259 => x"fda5", + 260 => x"fcdc", + 261 => x"fc13", + 262 => x"fb4b", + 263 => x"fa82", + 264 => x"f9ba", + 265 => x"f8f2", + 266 => x"f82b", + 267 => x"f763", + 268 => x"f69c", + 269 => x"f5d5", + 270 => x"f50f", + 271 => x"f449", + 272 => x"f384", + 273 => x"f2bf", + 274 => x"f1fa", + 275 => x"f136", + 276 => x"f073", + 277 => x"efb0", + 278 => x"eeee", + 279 => x"ee2d", + 280 => x"ed6c", + 281 => x"ecac", + 282 => x"ebed", + 283 => x"eb2e", + 284 => x"ea71", + 285 => x"e9b4", + 286 => x"e8f8", + 287 => x"e83c", + 288 => x"e782", + 289 => x"e6c9", + 290 => x"e611", + 291 => x"e559", + 292 => x"e4a3", + 293 => x"e3ee", + 294 => x"e33a", + 295 => x"e287", + 296 => x"e1d5", + 297 => x"e124", + 298 => x"e074", + 299 => x"dfc6", + 300 => x"df19", + 301 => x"de6d", + 302 => x"ddc3", + 303 => x"dd1a", + 304 => x"dc72", + 305 => x"dbcb", + 306 => x"db26", + 307 => x"da82", + 308 => x"d9e0", + 309 => x"d93f", + 310 => x"d8a0", + 311 => x"d802", + 312 => x"d766", + 313 => x"d6cc", + 314 => x"d633", + 315 => x"d59b", + 316 => x"d505", + 317 => x"d471", + 318 => x"d3df", + 319 => x"d34e", + 320 => x"d2bf", + 321 => x"d232", + 322 => x"d1a6", + 323 => x"d11c", + 324 => x"d094", + 325 => x"d00e", + 326 => x"cf8a", + 327 => x"cf08", + 328 => x"ce87", + 329 => x"ce09", + 330 => x"cd8c", + 331 => x"cd11", + 332 => x"cc98", + 333 => x"cc22", + 334 => x"cbad", + 335 => x"cb3a", + 336 => x"cac9", + 337 => x"ca5b", + 338 => x"c9ee", + 339 => x"c984", + 340 => x"c91b", + 341 => x"c8b5", + 342 => x"c851", + 343 => x"c7ef", + 344 => x"c78f", + 345 => x"c731", + 346 => x"c6d6", + 347 => x"c67c", + 348 => x"c625", + 349 => x"c5d0", + 350 => x"c57e", + 351 => x"c52d", + 352 => x"c4df", + 353 => x"c493", + 354 => x"c44a", + 355 => x"c403", + 356 => x"c3be", + 357 => x"c37b", + 358 => x"c33b", + 359 => x"c2fd", + 360 => x"c2c2", + 361 => x"c288", + 362 => x"c252", + 363 => x"c21d", + 364 => x"c1eb", + 365 => x"c1bb", + 366 => x"c18e", + 367 => x"c163", + 368 => x"c13b", + 369 => x"c115", + 370 => x"c0f1", + 371 => x"c0d0", + 372 => x"c0b1", + 373 => x"c095", + 374 => x"c07b", + 375 => x"c064", + 376 => x"c04f", + 377 => x"c03d", + 378 => x"c02d", + 379 => x"c01f", + 380 => x"c014", + 381 => x"c00b", + 382 => x"c005", + 383 => x"c001", + 384 => x"c000", + 385 => x"c001", + 386 => x"c005", + 387 => x"c00b", + 388 => x"c014", + 389 => x"c01f", + 390 => x"c02d", + 391 => x"c03d", + 392 => x"c04f", + 393 => x"c064", + 394 => x"c07b", + 395 => x"c095", + 396 => x"c0b1", + 397 => x"c0d0", + 398 => x"c0f1", + 399 => x"c115", + 400 => x"c13b", + 401 => x"c163", + 402 => x"c18e", + 403 => x"c1bb", + 404 => x"c1eb", + 405 => x"c21d", + 406 => x"c252", + 407 => x"c288", + 408 => x"c2c2", + 409 => x"c2fd", + 410 => x"c33b", + 411 => x"c37b", + 412 => x"c3be", + 413 => x"c403", + 414 => x"c44a", + 415 => x"c493", + 416 => x"c4df", + 417 => x"c52d", + 418 => x"c57e", + 419 => x"c5d0", + 420 => x"c625", + 421 => x"c67c", + 422 => x"c6d6", + 423 => x"c731", + 424 => x"c78f", + 425 => x"c7ef", + 426 => x"c851", + 427 => x"c8b5", + 428 => x"c91b", + 429 => x"c984", + 430 => x"c9ee", + 431 => x"ca5b", + 432 => x"cac9", + 433 => x"cb3a", + 434 => x"cbad", + 435 => x"cc22", + 436 => x"cc98", + 437 => x"cd11", + 438 => x"cd8c", + 439 => x"ce09", + 440 => x"ce87", + 441 => x"cf08", + 442 => x"cf8a", + 443 => x"d00e", + 444 => x"d094", + 445 => x"d11c", + 446 => x"d1a6", + 447 => x"d232", + 448 => x"d2bf", + 449 => x"d34e", + 450 => x"d3df", + 451 => x"d471", + 452 => x"d505", + 453 => x"d59b", + 454 => x"d633", + 455 => x"d6cc", + 456 => x"d766", + 457 => x"d802", + 458 => x"d8a0", + 459 => x"d93f", + 460 => x"d9e0", + 461 => x"da82", + 462 => x"db26", + 463 => x"dbcb", + 464 => x"dc72", + 465 => x"dd1a", + 466 => x"ddc3", + 467 => x"de6d", + 468 => x"df19", + 469 => x"dfc6", + 470 => x"e074", + 471 => x"e124", + 472 => x"e1d5", + 473 => x"e287", + 474 => x"e33a", + 475 => x"e3ee", + 476 => x"e4a3", + 477 => x"e559", + 478 => x"e611", + 479 => x"e6c9", + 480 => x"e782", + 481 => x"e83c", + 482 => x"e8f8", + 483 => x"e9b4", + 484 => x"ea71", + 485 => x"eb2e", + 486 => x"ebed", + 487 => x"ecac", + 488 => x"ed6c", + 489 => x"ee2d", + 490 => x"eeee", + 491 => x"efb0", + 492 => x"f073", + 493 => x"f136", + 494 => x"f1fa", + 495 => x"f2bf", + 496 => x"f384", + 497 => x"f449", + 498 => x"f50f", + 499 => x"f5d5", + 500 => x"f69c", + 501 => x"f763", + 502 => x"f82b", + 503 => x"f8f2", + 504 => x"f9ba", + 505 => x"fa82", + 506 => x"fb4b", + 507 => x"fc13", + 508 => x"fcdc", + 509 => x"fda5", + 510 => x"fe6e", + 511 => x"ff37" + ); + + + -- phase counter + signal phase_cnt : unsigned(phase_width - 1 downto 0) := (others => '0'); + + + + +begin --define the operation of the module! + + --phase output for debugging + phase_out <= std_logic_Vector(phase_cnt); + + --phase counter + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + phase_cnt <= (others => '0'); + else + phase_cnt <= unsigned(phase_cnt) + unsigned(phase_incr); + end if; + end if; + end process; + + + + --data output + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + signal_out <= (others => '0'); + else + --assign value from table + signal_out <= signal_rom_table(to_integer(unsigned(phase_cnt))); + end if; + end if; + end process; + +end behavioral; + + + + + diff --git a/ld3/dds_vhdl/dds_vhdl_tb.vhd b/ld3/dds_vhdl/dds_vhdl_tb.vhd new file mode 100644 index 0000000..64d4e1d --- /dev/null +++ b/ld3/dds_vhdl/dds_vhdl_tb.vhd @@ -0,0 +1,108 @@ +----------------------------- +-- Author +-- Date +-- Project name +-- Module name +-- +-- Detailed module description +-- +-- +-- +-- +-- +-- +-- +-- Revision: +-- A - initial design +-- B - +-- +----------------------------- +library ieee; --always use this library +use ieee.std_logic_1164.all; --always use this library + +use ieee.numeric_std.all; --use this library if arithmetic required + + +--define connections to outside +entity dds_vhdl_tb is +generic +( + phase_width : integer := 9; + data_width : integer := 16 +); +end dds_vhdl_tb; + +--define inside of the module +architecture behavioral of dds_vhdl_tb is + + --signals + signal clk : std_logic := '0'; --100mhz clock + signal rst : std_logic := '0'; --rst + signal phase_incr : std_Logic_vector(phase_width - 1 downto 0) := (others => '0'); --"frequency" + signal phase_out : std_Logic_vector(phase_width - 1 downto 0) := (others => '0'); + signal signal_out : std_Logic_vector(data_width - 1 downto 0) := (others => '0'); + + --define components to use + component dds_vhdl is + generic + ( + phase_width : integer := 9; + data_width : integer := 16 + ); + port + ( + clk : in std_logic; --100mhz clock + rst : in std_logic; --rst + phase_incr : in std_Logic_vector(phase_width - 1 downto 0); --"frequency" + phase_out : out std_Logic_vector(phase_width - 1 downto 0); + signal_out : out std_Logic_vector(data_width - 1 downto 0) + ); + end component; + + constant clk_period : time := 10 ns; + + + + +begin + + clk <= not clk after clk_period/2; + + uut : dds_vhdl + generic map + ( + phase_width => phase_width, + data_width => data_width + ) + port map + ( + clk => clk, + rst => rst, + phase_incr => phase_incr, + phase_out => phase_out, + signal_out => signal_out + ); + + + --tb process + process + begin + rst <= '1'; + wait for 100 ns; + rst <= '0'; + + wait for clk_period/2; + --phase_incr <= (0 => '1', others => '0'); --1 + phase_incr <= (1 => '1', others => '0'); --2 + + wait; + end process; + + + +end behavioral; + + + + + diff --git a/ld3/ld3.m b/ld3/ld3.m new file mode 100644 index 0000000..05163e6 --- /dev/null +++ b/ld3/ld3.m @@ -0,0 +1,61 @@ +%% Funkcionalo un logisko shemu modelesana +% Laboratorijas darbs Nr.3. +% sinusoidu generesana un filtresana +% Autors: Imants Pulkstenis +% +% Apliecibas Nr.021REB152 +%% 1.Sakuma dati +% +% Piemers:https://la.mathworks.com/help/simulink/slref/digital-waveform-generation-approximating-a-sine-wave.html +% +clear; format shortEng; +fs = 22050; % (ciparu dalas sample clock) = 22050 (audio standarts). +k = 52; % k - studenta apliecibas pedejie 2 cipari +f1 = 32 * k; +f2 = 48 * k; +%% 2.FIR bandpass filtrs +n1 = 40; % First filter order +n2 = 40; % Second filter order + +band = 100; % filter bandwidth +fsh = fs/2; % corresponding to half the sample rate + +Wn1= f1/fsh; % The cut-off frequency Wn must be between 0 < Wn < 1.0, with 1.0 corresponding to half the sample rate. +Wn2= f2/fsh; + +b1 = fir1(n1,[Wn1-band/(fsh*2) Wn1+band/(fsh*2) ], 'bandpass'); % Window-based FIR filter design +b2 = fir1(n2,[Wn2-band/(fsh*2) Wn2+band/(fsh*2) ], 'bandpass'); % Window-based FIR filter design + +[h1,w1] = freqz(b1); +[h2,w2] = freqz(b2); +figure (1) +plot (w1/pi,db(h1), ... + w2/pi,db(h2),... + [Wn1 Wn1],[3 -80], '--', ... + [Wn2 Wn2], [3 -80], '--',... + [0 1],[-20 -20], '--') +axis([0 1 -80 3]) +grid on, +xlabel('Normalized Frequency (\times\pi rad/sample)') +ylabel('Magnitude (dB)') +legend('Response FIR_1','Response FIR_2','f_1','f_2', '-20dB target', 'Location','East') +title('Magnitude response') +%% 3.IIR bandpass filtrs +[b,a] = iirpeak(Wn1,2*(Wn2-Wn1),-22); %Wo must satisfy 0.0 < Wo < 1.0, with 1.0 corresponding to pi radians/sample +[h3,w3] = freqz(b,a); +[b,a] = iirpeak(Wn2,2*(Wn2-Wn1),-19); +[h4,w4] = freqz(b,a); +figure (2) +plot (w3/pi,db(h3), ... + w4/pi,db(h4),... + [Wn1 Wn1],[3 -80], '--', ... + [Wn2 Wn2], [3 -80], '--',... + [0 1],[-20 -20], '--') +axis([0 1 -80 3]) +grid on, +xlabel('Normalized Frequency (\times\pi rad/sample)') +ylabel('Magnitude (dB)') +legend('Response IIR_1','Response IIR_2','f_1','f_2', '-20dB target', 'Location','East') +title('Magnitude response') + + diff --git a/ld3/ls3_fixed_point.slx b/ld3/ls3_fixed_point.slx new file mode 100644 index 0000000000000000000000000000000000000000..e63dde622e0dbb262e6cd369c70c3f034638a3c7 GIT binary patch literal 23930 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%0AYRta3VGw(J|V*H*&5vL#H5Ves} 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 literal 0 HcmV?d00001