<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mv="http://macVmlSchemaUri" xmlns="http://www.w3.org/TR/REC-html40"><head><meta name=Titel content=""><meta name=Stichwörter content=""><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Nur Text Zchn";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
span.NurTextZchn
        {mso-style-name:"Nur Text Zchn";
        mso-style-priority:99;
        mso-style-link:"Nur Text";
        font-family:"Calibri",sans-serif;}
span.msoIns
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:underline;
        color:teal;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:595.0pt 842.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body bgcolor=white lang=DE link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoPlainText><span lang=EN-US>Wojtek<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-US><o:p> </o:p></span></p><p class=MsoPlainText><span lang=EN-US>Thanx for the info.<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-US>So, a proper design would look something like this.<o:p></o:p></span></p><p class=MsoPlainText><span style='mso-fareast-language:DE'><img width=867 height=232 id="Bild_x0020_1" src="cid:image001.png@01D33FBA.8D9CD950"></span><o:p></o:p></p><p class=MsoPlainText><span lang=EN-US>According to the Xilinx text, the main problem seems to be the skew. As RISC-5 only runs at 25 MHz, it might be that there is a lot of time reserve and the different arrival times of the clk signal do not matter so much…<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-US><o:p> </o:p></span></p><p class=MsoPlainText><span lang=EN-US>br<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-US>Jörg<o:p></o:p></span></p><p class=MsoPlainText><span lang=EN-US><o:p> </o:p></span></p><p class=MsoPlainText>Am 07.10.17, 22:12 schrieb "Oberon im Auftrag von Skulski, Wojciech" <oberon-bounces@lists.inf.ethz.ch im Auftrag von skulski@pas.rochester.edu>:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>    Joerg:<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    Here is the wording from "Spartan-6 FPGA Clocking Resources", User Guide UG382 (v1.10) June 19, 2015, page 12.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    "BUFGMUX can multiplex between two global clock sources or be used as a simple BUFG<o:p></o:p></p><p class=MsoPlainText>    clock buffer. The clock buffer can only directly drive the global clock routing resources,<o:p></o:p></p><p class=MsoPlainText>    which can only drive clock inputs. However, clock inputs on the FPGA logic flip-flops can<o:p></o:p></p><p class=MsoPlainText>    also come from general-purpose routing, although their use should be limited due to<o:p></o:p></p><p class=MsoPlainText>    higher skew."<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    The way I understand these words is that you are allowed to route the derived clock via BUFG (which physically is the same as BUFGMUX), but you are then impacting the performance of your design. From my experience, achieving a glitch-free operation of the FPGA design will be much more iffy when the design is invoking any grief from the Xilinx tools in the clocking arena. The design may work, but it may also generate corrupt bits, if there is any unresolved clocking warning from the tools. Based on my experience, I would stay away from any simplistic tricks where the clock signals are involved.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    If I ever used the code like RISC5, then I would spend ample time analyzing the translation warnings. In practice it is much better to write the code according to the Xilinx User Guides then to try a seemingly simple code which leads to potentially iffy translation into the hardware.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    And this is why LOLA and its resulting seemingly simple Verilog should not be treated like a gospel. Reliable FPGA design requires reading through Xilinx User Guides for the particular family you are using. These will be different for Spartan-3, Spartan-6, or Series-7. Do not rely on Spartan-3 User Guide when working with Artix!<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    And then there are also silicon bugs and undocumented features which you discover the hard way yourself, or read read on the Xilinx Developer Zone where the Q&A records are numbered in tens-of-thousands. <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    Do not get discouraged. It all can be done! But not necessarily with just LOLA.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    W.<o:p></o:p></p><p class=MsoPlainText>    ________________________________________<o:p></o:p></p><p class=MsoPlainText>    From: Skulski, Wojciech<o:p></o:p></p><p class=MsoPlainText>    Sent: Saturday, October 7, 2017 3:52 PM<o:p></o:p></p><p class=MsoPlainText>    To: ETH Oberon and related systems<o:p></o:p></p><p class=MsoPlainText>    Subject: RE: [Oberon] FPGA - Colour Support<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    Joerg:<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>      your diagram is entirely fine. However, you canot run any Q, Q#, AND (Q,Q#), or anything like this into the CLK inputs of the other flip-flops. I mean, the inputs marked with triangles.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    The intent of the code snippet which you posted was to generate clocking signals of half the frequency, which are then routed to some flip flops in the design. This is not allowed because there is no direct connection from the flip-flop outputs, or from the AND gate output, to any of the flip-flop clocking inputs anywhere. These triangle inputs are on an entirely separate "clocking tree".<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    You may use the derived clock by connecting it to the clocking tree. This should be done explicitly like the following. The "derived_clock" is routed via the BUFG, which physically is a very strong current driver, to the "clocking tree" connected to the output "O". As far as I know, Xilinx does not recommend this practice. They rather recommend using "clock enable" inputs of the flip-flops. These inputs were not shown in your diagram.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    Note that the connection via the BUFG can be inserted by the Xilinx tools themselves, without you being aware. If this happens then you will be notified in the translation reports. Not looking into these, you may stay under the impression that the clock derivation is a simple thing to write in the code. You may not be aware that your design is consuming these BUFG drivers to achieve the goal.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    -- global clock buffer for signal processing<o:p></o:p></p><p class=MsoPlainText>    clk100_buf: BUFG<o:p></o:p></p><p class=MsoPlainText>     port map(<o:p></o:p></p><p class=MsoPlainText>    I  => derived_clock,<o:p></o:p></p><p class=MsoPlainText>    O => system_clock<o:p></o:p></p><p class=MsoPlainText>    );<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    W.<o:p></o:p></p><p class=MsoPlainText>    ________________________________________<o:p></o:p></p><p class=MsoPlainText>    From: Oberon [oberon-bounces@lists.inf.ethz.ch] on behalf of Jörg [joerg.straube@iaeth.ch]<o:p></o:p></p><p class=MsoPlainText>    Sent: Saturday, October 7, 2017 3:12 PM<o:p></o:p></p><p class=MsoPlainText>    To: ETH Oberon and related systems<o:p></o:p></p><p class=MsoPlainText>    Subject: Re: [Oberon] FPGA - Colour Support<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    Hi Wojtek<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    Are you saying FPGA can not implement this:?<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    [cid:image001.png@01D33FB0.F72AFD20]<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    Am 07.10.17, 20:26 schrieb "Oberon im Auftrag von Skulski, Wojciech" <oberon-bounces@lists.inf.ethz.ch im Auftrag von skulski@pas.rochester.edu>:<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        Joerg:<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        These clock manipulations look interesting. I wonder how ISE or Vivado translate these into logic. Combinatorial clocks cannot be used in FPGA designs. Combinatorial means "derived from logic equations" like the ones we see below. The reason is that the clocking inputs to flip flops are seldom (if ever) directly connected to the fabric, where such equations are implemented in hardware. And even if such connections exist (I doubt they do), using them is strongly discouraged by the FPGA manufacturers. Maybe ISE tools are smart enough to somehow pack these equations into the Digital Clock Manager (DCM)?<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        So it is an interesting piece of HDL which is calling either for a rework or for examination of the translation report to find out, how it is implemented by the tools. If you want to divide the clock by five, then I am pretty sure the DCM will need to be used.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        Concerning the SPI, it can run at a wide range of frequencies. Perhaps some part has some special requirements, which then need to be dealt with locally in the respective HDL module.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        W.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        ________________________________________<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        For the OberonStation, RISC5Top.v looks like this:<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        always @(posedge clk0) clk <= ~clk;<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        always @(posedge clkfx) begin<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>          clk0 <= ~clk0 & ~clk1; clk1 <= clk0;<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>          pclk <= ~pclk;<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        end<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        clkfx runs at 150 MHz<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        pcclk runs at 75 MHz (VGA timing)<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        clk0 runs at 50 MHz<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        clk runs at 25 MHz<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        So, instead of dividing by 3 and then by 2 to get to clk, we would need to divide clkfx by 5.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        Of course the SPI divider „tick“ needs to adopted from 63 to 75 and so on. (400 kHz = 25MHz / 63 = 30 MHz / 75)<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        Sorry, I forgot to mention these details.<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        --<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        Oberon@lists.inf.ethz.ch mailing list for ETH Oberon and related systems<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>        https://lists.inf.ethz.ch/mailman/listinfo/oberon<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p><p class=MsoPlainText>    --<o:p></o:p></p><p class=MsoPlainText>    Oberon@lists.inf.ethz.ch mailing list for ETH Oberon and related systems<o:p></o:p></p><p class=MsoPlainText>    https://lists.inf.ethz.ch/mailman/listinfo/oberon<o:p></o:p></p><p class=MsoPlainText>    <o:p></o:p></p></div></body></html>