From f82462f98e92f9584ddfaa3978e041be2cbd3238 Mon Sep 17 00:00:00 2001 From: Johann Faerber Date: Sun, 13 Mar 2022 16:35:52 +0100 Subject: added documentation examples in markdown --- doc/pulse_width_modulator_datasheet.md | 136 +++++++++++++-------------------- 1 file changed, 54 insertions(+), 82 deletions(-) (limited to 'doc/pulse_width_modulator_datasheet.md') diff --git a/doc/pulse_width_modulator_datasheet.md b/doc/pulse_width_modulator_datasheet.md index 2f1caa4..5aa4784 100644 --- a/doc/pulse_width_modulator_datasheet.md +++ b/doc/pulse_width_modulator_datasheet.md @@ -1,45 +1,38 @@ Introduction ============ -A heartbeat generator can be used in a digital system to ... +Pulse width modulation (PWM) is a technique to generate periodic waveforms with adjustable duty cycles. PWM is used in many application areas like communications, power control, measurement, AD/DA-conversion, etc. [[1]](https://en.wikipedia.org/wiki/Pulse-width_modulation) + Features ======== -Normal rhythm produces four entities – a P wave, a QRS complex, a T wave, and a U wave – that each -have a fairly unique pattern. [[1]](https://en.wikipedia.org/wiki/Electrocardiography) - -For simplicity the existing heartbeat module generates the QRS complex and T wave only. - - * Models QRS-Complex and T-Wave - * Average time values based on 72 bpm - * Enable input for external prescaler + * default 8-bit resolution + * 8-bit control word input + * Enable input for external prescaler to control PWM period General Description =================== -![Heartbeat Generator - Schematic Symbol](images/heartbeat_gen.png){width=40%} +![Pulse Width Modulator - Schematic Symbol](images/pwm.svg){width=40%} -| **Name** | **Type** | **Direction** | **Polarity** | **Description** | -|-------------|-------------------|:-------------:|:------------:|-----------------| -| clk_i | std_ulogic | IN | HIGH | clock | +| **Name** | **Type** | **Direction** | **Polarity** | **Description** | +|-------------|----------------------|:-------------:|:------------:|-----------------| +| clk_i | std_ulogic | IN | HIGH | | +| rst_ni | std_ulogic | IN | LOW | | +| en_pi | std_ulogic | IN | HIGH | | +| pwm_width_i | std_ulogic_vector[8] | IN | HIGH | 8-bit control input word | +| pwm_o | std_ulogic | OUT | HIGH | | -: Heartbeat Generator - Description of I/O Signals +: Pulse Width Modulator - Description of I/O Signals Functional Description ====================== -The shape of an [electrogardiogramm](https://en.wikipedia.org/wiki/Electrocardiography) as a voltage graph over time - - -![Electrocardiogram](images/ECG-SinusRhythmLabel.png){width=20%} - -The important QRS complex and T wave are modelled as digital pulses. - -![QRS Complex and T Wave Pulses](images/qrs-complex-t-wave-pulses.pdf){width=80%} +A mod-256 counter ... Design Description @@ -47,27 +40,27 @@ Design Description A conceptional RTL diagram is shown below. -![Heartbeat Generator - Conceptional RTL](images/heartbeat_gen_conceptional_rtl.pdf){width=60%} +![Pulse Width Modulator - Conceptional RTL](images/pwm_conceptional_rtl.svg){width=60%} -The simulation result shows two full periods based on a clock period of 1 ms +The simulation result shows the corner cases minimum, maximum, switched off, and a cuty cycle of 50 %. -![Two Periods - Simulation Result](images/heartbeat_gen_two_periods_simwave.png){width=80%} +![Pulse Width Modulator - Simulation Result](images/pwm_simwave.png){width=80%} -In more detail using cursors to display correct parameters of the QRS complex and T wave. +In more detail using cursors to display a PWM frequency of f~PWM~=21.7kHz -![QRS-Complex and T-Wave - Simulation Result](images/qrs-complex-t-wave_simwave.png){width=80%} +![Pulse Width Modulator - 21.7 kHz - Simulation Result](images/pwm_21.7kHz_simwave.png){width=80%} Device Utilization and Performance ================================== -The following table shows the utilisation of both modules heartbeat_gen and cntdnmodm. +The following table shows the utilisation of both modules pwm and cntdnmodm. The following results are extracted from ```pure - pnr/de1_heartbeat_gen/de1_heartbeat_gen.fit.rpt + pnr/de1_pwm/de1_pwm.fit.rpt ``` @@ -80,7 +73,7 @@ The following results are extracted from The following results are extracted from ```pure -de1_heartbeat_gen.sta.rpt +de1_pwm.sta.rpt ``` ```pure @@ -103,9 +96,9 @@ Application Note ================ The following test environment on a DE1 prototype board uses a system clock frequency of 50 MHz. -A prescaler is parameterised to generate an output signal with a period of 1 ms. +A prescaler is parameterised to generate an output signal with a period of 46.08 us. -![Test Environment on DE1 Prototype Board](images/de1_heartbeat_gen_schematic.pdf){width=70%} +![Test Environment on DE1 Prototype Board](images/de1_pwm_schematic.svg){width=70%} @@ -115,7 +108,7 @@ Appendix References ---------- -* [Wiki: Electrocardiography](https://en.wikipedia.org/wiki/Electrocardiography) +* [Wiki: Pulse Width Modulation](https://en.wikipedia.org/wiki/Pulse-width_modulation) Project Hierarchy ----------------- @@ -123,15 +116,15 @@ Project Hierarchy ### Module Hierarchy for Verification ```pure -t_heartbeat_gen(tbench) - heartbeat_gen(rtl) +t_pwm(tbench) + pwm(rtl) ``` ### Prototype Environment ```pure -de1_heartbeat_gen(structure) - heartbeat_gen(rtl) +de1_pwm(structure) + pwm(rtl) cntdnmodm(rtl) ``` @@ -139,60 +132,39 @@ VHDL Sources ------------ ```vhdl -LIBRARY IEEE; -USE IEEE.std_logic_1164.ALL; - -ENTITY heartbeat_gen IS - PORT (clk_i : IN std_ulogic; - rst_ni : IN std_ulogic; - en_pi : IN std_ulogic; - count_o : OUT std_ulogic_vector; - heartbeat_o : OUT std_ulogic - ); -END heartbeat_gen; -``` - -```vhdl -LIBRARY IEEE; +LIBRARY ieee; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; -ARCHITECTURE rtl OF heartbeat_gen IS +ENTITY pwm IS - CONSTANT n : natural := 10; - CONSTANT zero : unsigned(n-1 DOWNTO 0) := (OTHERS => '0'); + PORT( + clk_i : IN std_ulogic; -- clock input + rst_ni : IN std_ulogic; -- reset L-active + en_pi : IN std_ulogic; -- enable H-active + pwm_width_i : IN std_ulogic_vector(7 DOWNTO 0); -- width of pulse + pwm_o : OUT std_ulogic); -- pwm output - CONSTANT heartbeat_period : unsigned(n-1 DOWNTO 0) := to_unsigned(833, n); - CONSTANT qrs_width : unsigned(n-1 DOWNTO 0) := to_unsigned(100, n); - CONSTANT st_width - CONSTANT t_width - CONSTANT qt_width +END pwm; - SIGNAL next_state, current_state : unsigned(n-1 DOWNTO 0); +ARCHITECTURE rtl OF pwm IS - SIGNAL tc_qrs : std_ulogic; -- qrs interval - SIGNAL tc_t : std_ulogic; -- T wave - -BEGIN + SIGNAL next_state, current_state : unsigned(7 DOWNTO 0); -- states - next_state_logic : - + SIGNAL buf_next : std_ulogic; -- output buffer +BEGIN - state_register : - - - -- output_logic - t_wave : tc_t <= - - - - qrs_complex : tc_qrs <= - - - output_value : heartbeat_o <= - + next_state_logic : next_state <= + + state_register : current_state <= (OTHERS => '0') WHEN rst_ni = '0' ELSE + next_state WHEN rising_edge(clk_i) AND (en_pi = '1'); + counter_output : buf_next <= + + -- output buffer + output_register : pwm_o <= + END rtl; ``` @@ -201,6 +173,6 @@ Revision History | **Date** | **Version** | **Change Summary** | |:----------|:-------------|:--------------------| -| May 2020 | 0.1 | Initial Release | -| April 2021 | 0.2 | Added parameterisation | +| May 2022 | 0.1 | Initial Release | +| April 2022 | 0.2 | Added VHDL code | -- cgit v1.2.3