DESCRIPTION | FUNCTIONAL DESCRIPTION | CONNECTION DIAGRAM (16-pin DIP) | MODE SELECT TABLE | /RC TRUTH TABLE | STATE DIAGRAM | INPUT LOADING / FAN-OUT | DC CHARACTERISTICS OVER OPERATING TEMPERATURE RANGE (unless otherwise specified) | AC CHARACTERISTICS | AC OPERATING REQUIREMENTS | VERILOG MODEL
The 'F190 is a reversible BCD (8421) decade counter featuring synchronous counting and asynchronous presetting. The preset feature allows the 'F190 to be used in programmable dividers. The Count Enable input, the Terminal Count output and the Ripple Clock output make possible a variety of methods of implementing multistage counters. In the counting modes, state changes are initiated by the rising edge of the clock. o High speed -- 70 MHz typical count frequency o Synchronous counting o Asynchronous parallel load o Cascadable
The 'F190 is a synchronous up/down BCD decade counter containing four edge-triggered flip-flops, with internal gating and steering logic to provide individual preset, count-up and count-down operations. It has an asynchronous parallel load capability permitting the counter to be preset to any desired number. When the Parallel Load (/PL) input is LOW, information present on the Parallel Data inputs (P0 - P3) is loaded into the counter and appears on the Q outputs. This operation overrides the counting functions, as indicated in the Mode Select Table. A HIGH signal on the /CE input inhibits counting. When /CE is LOW, internal state changes are initiated synchronously by the LOW-to-HIGH transition of the clock input. The direction of counting is determined by the /U/D input signal, as indicated in the Mode Select Table. /CE and /U/D can be changed with the clock in either state, provided only that the recommended setup and hold times are observed. Two types of outputs are provided as overflow/underflow indicators. The Terminal Count (TC) output is normally LOW and goes HIGH when a circuit reaches zero in the count-down mode or reaches 9 in the count-up mode. The TC output will then remain HIGH until a state change occurs, whether by counting or presetting or until /U/D is changed. The TC output should not be used as a clock signal because it is subject to decoding spikes. The TC signal is also used internally to enable the Ripple Clock (/RC) output. The /RC output is normally HIGH. When /CE is LOW and TC is HIGH, the /RC output will go LOW when the clock next goes LOW and will stay LOW until the clock goes HIGH again. This feature simplifies the design of multistage counters. For a discussion and illustrations of the various methods of implementing multistage counters, please see the 'F191 data sheet.
Pin Function Pin Function --- --------------------------- --- -------------------------------- 1 P1 Parallel data input 1 16 Vcc 2 Q1 Flip-flop output 1 15 P0 Parallel data input 0 3 Q0 Flip-flop output 0 14 CP Clock Pulse 4 /CE Count Enable 13 /RC Ripple Clock output 5 /U/D Up/Down Count Control 12 TC Terminal Count output 6 Q2 Flip-flop output 2 11 /PL Parallel Load input 7 Q3 Flip-flop output 3 10 P2 Parallel data input 2 8 GND 9 P3 Parallel data input 3
/PL /CE /U/D CP Mode --- --- ---- --- --------------------- H L L ^ Count Up H L H ^ Count Down L X X X Preset (Asynchronous) H H X X No Change (Hold) H = HIGH voltage level; L = LOW voltage level; X = immaterial; ^ = LOW-to-HIGH transition.
/CE TC(1) CP /RC --- ----- ------- ------- L H (pulse) (pulse) H X X H X L X H (1) TC is generated internally.
The counter runs 0 <-> 9 in the BCD sequence, with wrap 9 -> 0 counting up and 0 -> 9 counting down. Illegal states 10 - 15 recover into the legal sequence: counting UP, the paths are 10 -> 11 -> 6, 12 -> 13 -> 4 and 14 -> 15 -> 2; counting DOWN, the illegal states chain downward 15 -> 14 -> 13 -> 12 -> 11 -> 10 -> 9, entering the legal sequence at 9. (Solid arrows = count up, dashed arrows = count down.)
Pin Names Description U.L. HIGH/LOW --------- --------------------------------------------- ------------- /CE Count Enable Input (Active LOW) 0.5 / 1.125 CP Clock Pulse Input (Active Rising Edge) 0.5 / 0.375 P0 - P3 Parallel Data Inputs 0.5 / 0.375 /PL Asynchronous Parallel Load Input (Active LOW) 0.5 / 0.375 /U/D Up/Down Count Control Input 0.5 / 0.375 Q0 - Q3 Flip-flop Outputs 25 / 12.5 /RC Ripple Clock Output (Active LOW) 25 / 12.5 TC Terminal Count Output (Active HIGH) 25 / 12.5
Symbol Parameter Min Typ Max Units Conditions ------ -------------------- --- --- --- ----- ---------- ICC Power Supply Current 38 mA Vcc = Max
Symbol Parameter Min Typ Max Units ------ ------------------------------------ --- --- --- ----- fmax Maximum Count Frequency 90 130 -- MHz tPLH Propagation Dly CP to Qn -- 4.5 -- ns tPHL Propagation Dly CP to Qn -- 5.5 -- ns tPLH Propagation Dly CP to TC -- 6.5 -- ns tPHL Propagation Dly CP to TC -- 8.5 -- ns tPLH Propagation Dly CP to /RC -- 4.5 -- ns tPHL Propagation Dly CP to /RC -- 4.0 -- ns tPLH Propagation Dly /CE to /RC -- 3.6 -- ns tPHL Propagation Dly /CE to /RC -- 3.5 -- ns tPLH Propagation Dly /U/D to /RC -- 10 -- ns tPHL Propagation Dly /U/D to /RC -- 8.0 -- ns tPLH Propagation Dly /U/D to TC -- 5.0 -- ns tPHL Propagation Dly /U/D to TC -- 5.5 -- ns tPLH Propagation Dly Pn to Qn -- 3.6 -- ns tPHL Propagation Dly Pn to Qn -- 6.3 -- ns tPLH Propagation Dly /PL to Qn, /RC or TC -- 5.7 -- ns tPHL Propagation Dly /PL to Qn, /RC or TC -- 6.2 -- ns
Symbol Parameter Min Typ Max Units ------ ----------------------------- --- --- --- ----- ts (H) Setup Time, HIGH -- Pn to /PL 5.0 -- -- ns ts (L) Setup Time, LOW -- Pn to /PL 5.0 -- -- ns th (H) Hold Time, HIGH -- Pn to /PL 3.0 -- -- ns th (L) Hold Time, LOW -- Pn to /PL 3.0 -- -- ns ts (L) Setup Time LOW -- /CE to CP 10 -- -- ns th (L) Hold Time LOW -- /CE to CP 0 -- -- ns tw (L) /PL Pulse Width LOW 5.0 -- -- ns tw (L) CP Pulse Width LOW 5.5 -- -- ns trec Recovery Time -- /PL to CP 6.0 -- -- ns
Data sheet transcription as plain text
// ============================================================================ // f190.v — 54F/74F190 Up/Down Decade Counter (with Preset and Ripple Clock) // // Fairchild FAST (Advanced Schottky TTL) // Source: docs/devices/54F74F190.txt (1980 Fairchild FAST Data Book, // pages 4-48 ... 4-51, PRELIMINARY) // // Modes of operation, in order of precedence (data sheet Mode Select table): // 1. /PL LOW : asynchronous parallel load — Pn // loaded into Qn immediately, // overriding all other inputs // 2. /PL HIGH, /CE LOW, /U/D LOW : count up on rising CP edge // 3. /PL HIGH, /CE LOW, /U/D HIGH : count down on rising CP edge // 4. /PL HIGH, /CE HIGH : hold (no change) // // Count sequence is BCD (8421): 0..9, then 9 -> 0 counting up and 0 -> 9 // counting down. Illegal states 10-15 recover into the legal sequence. // // TC = HIGH when (count UP and cnt=9) or (count DOWN and cnt=0). // // /RC is normally HIGH. When /CE = LOW and TC = HIGH, /RC follows CP: // /RC = CP (same polarity). Otherwise /RC = HIGH. // // Timing values from the data sheet AC Characteristics table, 54F/74F column // (T_A = +25 C, V_CC = +5.0 V, C_L = 15 pF). Prelim page — TYP values only // (Min/Max columns are blank), so each specparam carries the typ value alone. // // Ports are scalar and named after the data sheet pin names: Icarus Verilog // does not fully support multi-bit (parallel) specify path connections, so // vector ports would get incorrect per-bit delays. // ============================================================================ `timescale 1ns/100ps module f190 ( input wire cp, // clock pulse (active rising edge, pin 14) input wire pl_n, // parallel load (asynchronous, active LOW, pin 11) input wire ce_n, // count enable (active LOW, pin 4) input wire ud_n, // up/down count control (LOW=up, pin 5) input wire p0, // parallel data input 0 (pin 15) input wire p1, // parallel data input 1 (pin 1) input wire p2, // parallel data input 2 (pin 10) input wire p3, // parallel data input 3 (pin 9) output wire q0, // flip-flop output 0 (pin 3) output wire q1, // flip-flop output 1 (pin 2) output wire q2, // flip-flop output 2 (pin 6) output wire q3, // flip-flop output 3 (pin 7) output wire tc, // terminal count (active HIGH, pin 12) output wire rc_n // ripple clock (active LOW, pin 13) ); // Count sequences, per the State Diagram. Counting up, the illegal // states recover along 10 -> 11 -> 6, 12 -> 13 -> 4 and 14 -> 15 -> 2; // counting down they chain 15 -> ... -> 10 -> 9 into the legal sequence, // which is a plain decrement. function [3:0] count_up; input [3:0] c; case (c) 4'd9: count_up = 4'd0; 4'd10: count_up = 4'd11; 4'd11: count_up = 4'd6; 4'd12: count_up = 4'd13; 4'd13: count_up = 4'd4; 4'd14: count_up = 4'd15; 4'd15: count_up = 4'd2; default: count_up = c + 4'd1; endcase endfunction function [3:0] count_dn; input [3:0] c; count_dn = (c == 4'd0) ? 4'd9 : c - 4'd1; endfunction // /PL idles HIGH, hence the previous-level register's initial value. A // CP edge arriving while /PL is LOW is consumed by the load branch, which // has priority, and leaves nothing pending; a CP edge after the load // counts normally, since only a genuine rising edge fires the block. reg [3:0] state; reg pl_d = 1'b1; always @(posedge cp or posedge pl_n or negedge pl_n) begin if (!pl_n || !pl_d) state <= {p3, p2, p1, p0}; else if (!ce_n) state <= ud_n ? count_dn(state) : count_up(state); pl_d <= pl_n; end // /PL passes P straight to the outputs, overriding the state register, // which is what makes the load transparent to P while /PL is LOW. The // `!pl_d` term above recaptures P into the state register when /PL is // released. wire [3:0] cnt = !pl_n ? {p3, p2, p1, p0} : state; assign q0 = cnt[0]; assign q1 = cnt[1]; assign q2 = cnt[2]; assign q3 = cnt[3]; wire tc_int; assign tc_int = (!ud_n && cnt == 4'd9) || (ud_n && cnt == 4'd0); assign tc = tc_int; assign rc_n = (!ce_n && tc_int) ? cp : 1'b1; specify specparam tlh_cp_q = 4.5; specparam thl_cp_q = 5.5; specparam tlh_cp_tc = 6.5; specparam thl_cp_tc = 8.5; specparam tlh_cp_rc = 4.5; specparam thl_cp_rc = 4.0; specparam tlh_ce_rc = 3.6; specparam thl_ce_rc = 3.5; specparam tlh_ud_rc = 10.0; specparam thl_ud_rc = 8.0; specparam tlh_ud_tc = 5.0; specparam thl_ud_tc = 5.5; specparam tlh_pn_q = 3.6; specparam thl_pn_q = 6.3; specparam tlh_pl_q = 5.7; specparam thl_pl_q = 6.2; specparam tlh_pl_tc = 5.7; specparam thl_pl_tc = 6.2; specparam tlh_pl_rc = 5.7; specparam thl_pl_rc = 6.2; (cp => q0) = (tlh_cp_q, thl_cp_q); (cp => q1) = (tlh_cp_q, thl_cp_q); (cp => q2) = (tlh_cp_q, thl_cp_q); (cp => q3) = (tlh_cp_q, thl_cp_q); (cp => tc) = (tlh_cp_tc, thl_cp_tc); (cp => rc_n) = (tlh_cp_rc, thl_cp_rc); (ce_n => rc_n) = (tlh_ce_rc, thl_ce_rc); (ud_n => tc) = (tlh_ud_tc, thl_ud_tc); (ud_n => rc_n) = (tlh_ud_rc, thl_ud_rc); (p0 => q0) = (tlh_pn_q, thl_pn_q); (p1 => q1) = (tlh_pn_q, thl_pn_q); (p2 => q2) = (tlh_pn_q, thl_pn_q); (p3 => q3) = (tlh_pn_q, thl_pn_q); (pl_n => q0) = (tlh_pl_q, thl_pl_q); (pl_n => q1) = (tlh_pl_q, thl_pl_q); (pl_n => q2) = (tlh_pl_q, thl_pl_q); (pl_n => q3) = (tlh_pl_q, thl_pl_q); (pl_n => tc) = (tlh_pl_tc, thl_pl_tc); (pl_n => rc_n) = (tlh_pl_rc, thl_pl_rc); `ifndef __ICARUS__ specparam ts_ph = 5.0; specparam ts_pl = 5.0; specparam th_ph = 3.0; specparam th_pl = 3.0; specparam ts_ce = 10.0; specparam th_ce = 0.0; specparam tw_pl_l = 5.0; specparam tw_cp_l = 5.5; specparam trec_pl = 6.0; $setup(p0, posedge pl_n, ts_ph); $setup(p1, posedge pl_n, ts_ph); $setup(p2, posedge pl_n, ts_ph); $setup(p3, posedge pl_n, ts_ph); $hold(posedge pl_n, p0, th_ph); $hold(posedge pl_n, p1, th_ph); $hold(posedge pl_n, p2, th_ph); $hold(posedge pl_n, p3, th_ph); $setup(ce_n, posedge cp, ts_ce); $hold(posedge cp, ce_n, th_ce); $width(negedge pl_n, tw_pl_l); $width(negedge cp, tw_cp_l); $recovery(posedge pl_n, posedge cp, trec_pl); `endif endspecify endmodule