Hallo
bin noch bisschen neu in FPGA und frage mich ob meine Logik in
nachfolgendem Code bzgl. synchronem Design richtig ist?
Der A/D-Wandler sampelt mit der pos. Taktflanke, bei der neg. Flanke
stehen die Daten am Ausgang bereit.
Der D/A-Wandler übernimmt mit der pos. Taktflanke die Eingangsdaten und
gibt sie aus.
Ist der Code nun so richtig gedacht oder wäre es sinnvoller überall
@posedge zu verwenden und stattdessen die CLK-Signale einfach in der
assign-Anweisung invertieren?
Ich hoffe man versteht den Code trotz Verilog, die Hardware versteht
ihn.
1 | /*
|
2 | CLK Oscillator 50 MHz
|
3 | ADCLK Clock für AD-Wandler, L-H Sample, H-L Daten bereit
|
4 | DACLK Clock für DA-Wandler, L-H Latch
|
5 | clk_50 50 MHz Clock für AD-Wandler
|
6 | clk_200 200 MHz Clock für DA-Wandler, Sys
|
7 | */
|
8 |
|
9 | module top(
|
10 | input CLK,
|
11 | output ADCLK,
|
12 | output DACLK,
|
13 | input [7:0] AD,
|
14 | output [11:0] DA
|
15 | );
|
16 |
|
17 | reg [7:0] data_in; // Eingangsregister
|
18 | reg [11:0] data_out; // Ausgangsregister
|
19 | reg [11:0] data_tmp; // Temporäres Register
|
20 |
|
21 | wire clk_50;
|
22 | wire clk_200;
|
23 |
|
24 | pll p1 (.inclk0(CLK), .c0(clk_50), .c1(clk_200));
|
25 |
|
26 | assign ADCLK = clk_50;
|
27 | assign DACLK = clk_200;
|
28 |
|
29 | assign DA = data_out;
|
30 |
|
31 | // AD-Wandler mit fallender Flanke AD-Clk einlesen
|
32 |
|
33 | always @(negedge clk_50)
|
34 | begin
|
35 | data_in <= AD;
|
36 | end
|
37 |
|
38 | // DA-Ausgangsregister mit fallender Flanke DA-Clk beschreiben
|
39 |
|
40 | always @(negedge clk_200)
|
41 | begin
|
42 | data_out <= data_tmp;
|
43 | end
|
44 |
|
45 | // Daten aus Eingangsregister in temp. Register übernehmen, evtl. manipulieren
|
46 |
|
47 | always @(posedge clk_200)
|
48 | begin
|
49 | data_tmp <= data_in >> 4; // Von 8 -> 12 bit
|
50 | end
|
51 |
|
52 | endmodule
|