0

Please look at the picture for this description. I have a problem with writing verilog for the following logic: Consider clk and R3 are input signals & out is the output signal. At the falling edge of clk, out is reset to 0. At the falling edge of R3, out is set to 1. How can I implement this logic in verilog? I am stuck because it seems to me that there is no way to distinguish between falling edge of R3 and falling edge of clk.

At the falling edge of both clk and R3, both clk and R3 are equal to 0 so I can't distinguish them.

    module startup(clk, R3, out); 
   input clk, R3; 
   output reg out; 
   always@(negedge clk, negedge R3) begin 


   end 
   endmodule

enter image description here

emnha
  • 1,619
  • 5
  • 38
  • 91

2 Answers2

3

Each input requires its own process. Create two "toggle" FFs, and then XOR their outputs together. Toggle the "set" FF when the output is zero, and toggle the "reset" FF when the output is one.

module dual_edge_ff (
  input set,
  input reset,
  output q
);
  reg set_ff;
  reg reset_ff;
  assign q = set_ff ^ reset_ff;

  always @(negedge set) if (!q) set_ff <= !set_ff;
  always @(negedge reset) if (q) reset_ff <= !reset_ff;
endmodule

If you're building this with discrete logic, you just need a 74xx73 (dual negative edge triggered JK FF) and a 74xx86 (quad XOR gate, use one section as an inverter).

Dave Tweed
  • 172,781
  • 17
  • 234
  • 402
1

At the falling edge of clk, out is reset to 0. At the falling edge of R3, out is set to 1. How can I implement this logic in verilog?

First, you should consider whether your logic is realizable in the technology you're using. Since you are using Quartus, I'll assume you're targeting an FPGA or CPLD technology.

And the logic you're asking for is not a well known latch or flip-flop type, so you will not be able to implement it directly in an FPGA or CPLD.

A typical solution to this is to introduce a high-speed clock, maybe 10 or more times faster than any of your other signals, and use that to detect transitions in the original signals (code not tested)

module latch1 (input hsclk, 
               input clk, 
               input r3, 
               output out);
reg clka, r3a;

always @(posedge hsclk) begin
    clka <= clk;
    r3a <= r3;
end

always @(posedge hsclk) begin
    if (clka & ~clk) begin
         // Actions for falling edge of clk
         out <= 0;
    end
    if (r3a & ~r3) begin
         // Actions for falling edge of r3
         out <= 1;
    end
end

endmodule

Notice that if the falling edge of r3 and falling edge of clk occur within one cycle of hsclk of each other, then the r3 edge will take precedence. Choose the period of hsclk to minimize the risk of this happening.

The Photon
  • 129,671
  • 3
  • 164
  • 309
  • Thanks for the help but I don't have a higher clock available. – emnha Apr 11 '19 at 16:44
  • @anhnha, if your clk signal is actually a periodic clock, you could use the PLL in your FPGA to generate a high frequency clock from it. Otherwise, an FPGA is probably not a good solution to your problem. – The Photon Apr 11 '19 at 16:50