Thursday 7 March 2019

xilinx - verilog code with two falling edges


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




Answer



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).


No comments:

Post a Comment

arduino - Can I use TI&#39;s cc2541 BLE as micro controller to perform operations/ processing instead of ATmega328P AU to save cost?

I am using arduino pro mini (which contains Atmega328p AU ) along with cc2541(HM-10) to process and transfer data over BLE to smartphone. I...