??? 09/29/07 15:38 Read: times |
#145098 - OP Update 6 of ? Responding to: ???'s previous message |
Following is the implementation and a testbench for the mark/space timer block of the Morse code decoder outlined here. The simulated output looks reasonable, as does the logic synthesized by the Xilinx tools.
Question: Note that I have `included the module implementation file as part of the testbench file, along with a global definitions file (that so far contains only the definition for TIME_WIDTH). This seems to me like a reasonable and convenient arrangement, but I'm wondering if there's a better way? Question: Does anybody see anything else that looks goofy? Thanks, -- Russ /* //////////////////////////////////////////////////////////////////////////// mst.v /////////////////////////////////////////////////////////////////////////////// DESCRIPTION: This is the mark/space timer part of the Morse code decoder. It continuously monitors the input line, looking for transitions in either direction. As each transition is detected, it records the the duration of the mark or space just ended (this is just the time since the previous transition), along with a single bit to indicate whether it was a mark or a space. It then pulses a third output to inform the client modules that a new event has occurred. REVISIONS: 28 Sep 07 - RAC - Adapted from an earlier attempt //////////////////////////////////////////////////////////////////////////// */ module MarkSpaceTimer (clock, rawInput, eventType, eventDuration, newEvent); input clock; // 20 µs (50 KHz) clock input rawInput; // Raw Morse code signal output eventType; // MARK (1) or SPACE (0) output eventDuration; // Length of mark or space, in // 20 µs units output newEvent; // Pulsed once for each event reg eventType; // See above reg newEvent; // See above reg [`TIME_WIDTH-1 : 0] eventDuration; // See above reg [`TIME_WIDTH-1 : 0] timer; // Accumulate event times here reg inputNow; // Raw input, synced to clock reg inputBefore; // Input delayed by one clock always @(posedge clock) begin // Every 20 µs inputBefore <= inputNow; // Note input at last clock inputNow <= rawInput; // Note input right now if (inputNow == inputBefore) begin // No transition timer <= timer + 1; // Just increment the timer newEvent <= 1; // Note that output is valid end // End 'no transition' else begin // We have a transition eventType <= inputBefore; // Record event type eventDuration <= timer; // Record event duration timer <= 1; // Reset the timer newEvent <= 0; // Trigger output 20 µs hence end // End 'we have a transition' end // End 'every 20 µs' endmodule // End MarkSpaceTimer module /* //////////////////////////////////////////////////////////////////////////// mst_t.v /////////////////////////////////////////////////////////////////////////////// DESCRIPTION: This is a testbench for the MarkSpaceTimer module of the Morse decoder project. It drives the module with a clock and some fake input. You have to examine and interpret the output waveforms manually. REVISIONS: 28 Sep 07 - RAC - Genesis //////////////////////////////////////////////////////////////////////////// */ `timescale 1us / 1ns `include "../modules/mcd.h" // Grab global definitions `include "../modules/mst.v" // Grab module to test module MstTester; reg clock; // The 20 µs clock reg morseCode; // The raw input signal wire eventType; // Type of last event wire [`TIME_WIDTH-1 : 0] eventDuration; // Duration of last event wire newEvent; // New event clock MarkSpaceTimer DUT (clock, morseCode, eventType, eventDuration, newEvent); always begin // Clock generator #10 clock <= 0; // 10 µs down #10 clock <= 1; // 10 µs up end // End 'clock generator' initial begin // Wiggle the input line up and #0 morseCode <= 0; // down a few times #101 morseCode <= 1; #300 morseCode <= 0; #100 morseCode <= 1; #100 morseCode <= 0; #100 morseCode <= 1; #300 morseCode <= 0; #100 morseCode <= 1; #100 morseCode <= 0; #100 morseCode <= 1; #300 morseCode <= 0; #100 morseCode <= 1; $finish; end endmodule |