[Oberon] RISC5 implementation issues.
Magnus Karlsson
magnus at saanlima.com
Wed Feb 17 22:30:59 CET 2016
Hi Walter,
Since this is really Paul's design, I guess it would be more appropriate
to discuss it with him, I was just trying to explain why it looks like
it does.
Cheers,
Magnus
On 2/17/2016 1:15 PM, Walter Gallegos wrote:
> Magnus,
>
> Some of messages was delayed; so, I continue from here to not overload
> the list.
>
> If I understand you correctly, you justify a uncontrolled delay
> because they simplify the SRAM handling.
> Sorry, is as using the old circuit with an and/inverted to generate a
> pulse. If you need a delayed signal you should use the DCM 90°, 180°
> or 270° clock outputs and keep all under control, I think don't need a
> state machine in this case.
>
> About ISE warnings, be careful, non warning do not means good
> methodology.
>
> About XILINX docs; really, I don't remember. Doing training, first as
> Xilinx ATP and now as independent consultant, I touch this problem in
> my trainings. Have an uncontrolled delay in clock is a big door to
> random problems. FPGA design must be synchronous all times; no
> exceptions.
>
> Regards,
> Walter
>
>
> El 2016-02-17 a las 14:41, Magnus Karlsson escribió:
>> Walter,
>>
>> I agree with you that the "pure" way of doing this is as you stated,
>> with a DCM to directly generate both clk and pclk. So how come Paul
>> didn't do that? It's not like he doesn't know how to use the DCM,
>> after all the current code generates pclk from clk using a DCM, and
>> there would probably be less code to do it like you suggest. No, the
>> reason for this is very subtle and is easy to miss if you just take a
>> quick look at the code, and it has to the asynchronous SRAM interface.
>>
>> One of the most critical aspects of using SRAM is to control the
>> write signal - ideally the write signal should be asserted after all
>> other control signals (like address, data, byte-enable, read, oe) are
>> valid, and should be de-asserted well before any of the other control
>> signals go invalid, to avoid spurious writes. However, this is not
>> that easy to do in a synchronous system where all signals change at
>> the clock edge. The most common way to do this is to have a state
>> machine that is clocked at say 4x the CPU clock so that you can
>> divided the SRAM access cycle into several phases and assert the
>> write signal on some of those phases.
>>
>> However, this is not the way Paul choose to do it, instead he choose
>> to do a less "pure" clock generation by generating clk from a
>> flip-flop rather than from a DCM. By doing so, he actually generates
>> an early version of the clock signal called clk that is leading the
>> global clock signal clk_BUFG by the delay of the BUFG buffer. Since
>> this early version of the clock signal is generated like any other
>> logic signal, he could use this signal to gate the write signal to
>> the SRAM such that write signal will be de-asserted well before the
>> other control signals (clocked by clk_BUFG) will change, and thus
>> avoiding the need to have a state machine controlling the write
>> signal. The price for this is that the clock signal is now generated
>> in a less "pure" way, but still a valid way as long as you know what
>> you are doing. The BUFG clock driver can be driven from a PLL, a DCM
>> or from the logic fabric. The first two are speed optimized paths
>> going directly from the PLL or DCM to the BUFG and can be clock at
>> much higher clock rate, while the logic fabric path is limited by the
>> maximum clock rate of the logic fabric. However, at the clock rate
>> we use (25 MHz) this is not an issue. When you do this there are no
>> warnings generated by ISE that this is not a good idea, and I have
>> not read anywhere in the Xilinx clocking resource guide that you
>> should avoid doing this. Basically, the BUFG clock driver is designed
>> to do this, the tool will allow you to do it and at the clock rate we
>> use it has no performance implications. As I see it, this is another
>> place where the goal of simplification has driven the implementation
>> of the system at the expense of a slightly less "pure" clock generation.
>>
>> Just my 2c
>>
>> Magnus
>>
>>
>> On 2/17/2016 4:18 AM, Walter Gallegos wrote:
>>> Hi Paul,
>>>
>>> My apologies for this off topic, ProjectOberon is basically a
>>> learning tool some hardware comments should not be bad.
>>>
>>> Yes the tool add the clock buffers because FF clock edge detectors
>>> must be connected to clock distribution tree, this do no correct the
>>> issue.
>>> The problem is, to connect a FF output, as clk signal is, to the
>>> clock buffer input the signal need be routed by general propose
>>> lines and interconnection matrix. This generate an uncontrolled delay.
>>> This issue has minor effect in RISC5 because is very special case
>>> where all project is self contained.
>>>
>>> A correct technique could be, RISC5 use a DCM to generate 75MHZ, use
>>> the same DCM to generate both 25MHZ (CLKDV) and 75MHZ (CLKFX) from
>>> 50MHZ (CLKIN).
>>>
>>> Regards,
>>> Walter
>>>
>>>
>>> El 2016-02-17 a las 06:39, Paul Reed escribió:
>>>> Hi Walter,
>>>>
>>>>> So, RISC5 use general propose resources to routing a clock signal.
>>>> I agree with Magnus, the tools add the relevant clock buffer as
>>>> part of
>>>> their job, and the source code is kept simple and clear.
>>>>
>>>> FPGAs are a little off-topic for many Oberoners, but hopefully the
>>>> below
>>>> simple hardware LED counter for the Spartan 3 board (easily adapted to
>>>> almost any other board!) might be indulged, and interesting for enough
>>>> people :)
>>>>
>>>> If you create a project in Xilinx ISE for the xc3s200-4ft256 and
>>>> add these
>>>> source files, then "Generate Programming File", then as far as I
>>>> can see
>>>> from the reports, the tools add the appropriate clock buffers and
>>>> global
>>>> resources - correct me if I'm wrong!
>>>>
>>>> Cheers,
>>>> Paul
>>>>
>>>>
>>>> (test.v)
>>>>
>>>> `timescale 1ns / 1ps
>>>>
>>>> module TestTop(
>>>> input CLK50M, //50MHz
>>>> output [7:0] leds);
>>>>
>>>> reg clk;
>>>> reg [31:0] cnt;
>>>>
>>>> assign leds = cnt[31:24];
>>>>
>>>> always @(posedge clk) //25MHz
>>>> cnt <= cnt + 1;
>>>>
>>>> always @(posedge CLK50M) clk <= ~clk;
>>>>
>>>> endmodule
>>>>
>>>> (test.ucf)
>>>>
>>>> NET "CLK50M" LOC = "T9" ;
>>>> NET "leds[0]" LOC = "K12";
>>>> NET "leds[1]" LOC = "P14";
>>>> NET "leds[2]" LOC = "L12";
>>>> NET "leds[3]" LOC = "N14";
>>>> NET "leds[4]" LOC = "P13";
>>>> NET "leds[5]" LOC = "N12";
>>>> NET "leds[6]" LOC = "P12";
>>>> NET "leds[7]" LOC = "P11";
>>>>
>>>>
>>>> --
>>>> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related
>>>> systems
>>>> https://lists.inf.ethz.ch/mailman/listinfo/oberon
>>>>
>>>
>>
>> --
>> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
>> https://lists.inf.ethz.ch/mailman/listinfo/oberon
>>
>
More information about the Oberon
mailing list