EmbDev.net

Forum: FPGA, VHDL & Verilog VHDL: Synchronizing an asynchronous interface without a clock


von Alex K. (ak55)


Attached files:

Rate this post
0 useful
not useful
I am trying to implement a custom bridge between a clocked synchronous 
interface and an asynchronous interface which is not clocked. I am 
having difficuties in synchronizing the asnychronous interface. I want 
to synchronize it to avoid timing issues in Quartus.

The signals like ebi_cs_n, ebi_bs1_n are misinterpreted as clocks by the 
tool when left asynchronous. I want to avoid that.

Please find the code in attachments.

How can I get a synchronous behavior of the synchronous interface. Or is 
there a better way to kepe the asynchronous interface without running 
into metastability  issues.

P.S. Unfortunately the asynchrnonous interface comes without a clock. 
And that is why I want to turn into a clean code having a synchronous 
behavior

: Edited by User
von Klakx (Guest)


Rate this post
0 useful
not useful
if your EBI runs at ..50 MHz or lower then a reliable approach can be 
achieved by using a high oversampling clock, like 200 MHz.

von Lothar M. (lkmiller) (Moderator)


Rate this post
0 useful
not useful
Alex K. wrote:
> The signals like ebi_cs_n, ebi_bs1_n are misinterpreted as clocks by the
> tool when left asynchronous.
You have written them in a way, they must be "clocks" to a latch.

> I want to avoid that.
Indeed you should avoid latches unless you want them. And if you want 
them e.g. for the storing signal s_TSREV then you must accept that the 
toolchain invokes some kind of clock for those signals.

The other way (as already said) is to oversample and synchronize the 
control signals cs, we, bs... and work with the synchronized signals 
further on (edge detection for storing/latching the bus value...).

BTW: where did you find this strange kind of code?
   process(avln_clk, avln_reset)
       variable sync_rst   : std_logic;
   begin
       if falling_edge(avln_clk) then 
           sync_rst    := not avln_reset; 
       end if;
       if rising_edge(avln_clk) then 
           nReset    <= sync_rst;
           
       end if;
   end process;
This is a very uncommon way to tighten up the timing requirements to the 
design. Or with other words: do not use both edges of a clock in 1 
design. Additionally the avln_reset ist not needed in the sensitivity 
list, because the result of the process only depends on the avln_clk.

Reply

Entering an e-mail address is optional. If you want to receive reply notifications by e-mail, please log in.

Rules — please read before posting

  • Post long source code as attachment, not in the text
  • Posting advertisements is forbidden.

Formatting options

  • [c]C code[/c]
  • [avrasm]AVR assembler code[/avrasm]
  • [vhdl]VHDL code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]




Bild automatisch verkleinern, falls nötig