OpenCores
URL https://opencores.org/ocsvn/two_dimensional_fast_hartley_transform/two_dimensional_fast_hartley_transform/trunk

Subversion Repositories two_dimensional_fast_hartley_transform

[/] [two_dimensional_fast_hartley_transform/] [trunk/] [mtx_trps_8x8_dpsram.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 irezki
//
2
// File: mtx_trps_8x8_dpsram.v
3
// Author: Ivan Rezki
4
// Topic: RTL Core
5
//                2-Dimensional Fast Hartley Transform
6
//
7
 
8
// Matrix Transpose 8x8
9
// DPSRAM-based Double Buffer
10
// Buffer size is 64*2 words, each word is 16 bits
11
 
12
// Matrix Transpose -> 64 clk delay
13
//                      - Double Buffer Solution:
14
 
15
 
16
module mtx_trps_8x8_dpsram (
17
        rstn,
18
        sclk,
19
 
20
        // Input
21
        inp_valid,
22
        inp_data,
23
 
24
        // Output
25
        mem_data,
26
        mem_valid
27
);
28
parameter N = 8;
29
 
30
input                   rstn;
31
input                   sclk;
32
 
33
input                   inp_valid;
34
input   [N-1:0]  inp_data;
35
 
36
output  [N-1:0]  mem_data;
37
output                  mem_valid;
38
 
39
reg [6:0]        cnt128d_wr;                             // Write Mode Counter
40
wire            indicator;                              // 64 words written - Indication(pos. or neg. edge)
41
reg                     indicator_1d;                   // Indication 1 clock delay
42
wire            indicator_pos_edge;             // positive edge
43
wire            indicator_neg_edge;             // negative edge
44
reg     [6:0]    cnt128d_rd;                             // Read Counter
45
wire            cnt128d_rd_valid_start; // Counter start increment
46
wire            cnt128d_rd_valid_stop;  // Counter stop increment
47
reg                     cnt128d_rd_valid;               // valid time for cnt128d_rd counter
48
reg                     mem_valid;                              // 1 clock delay after reading
49
 
50
// DPSRAM Memory Signal Description
51
wire [15:0] wr_DATA;
52
wire [ 6:0] wr_ADDR;
53
wire            wr_CSN;
54
wire            wr_WEN;
55
 
56
wire [15:0] rd_DATA;
57
wire [ 6:0] rd_ADDR;
58
wire            rd_CSN;
59
 
60
dpsram_128x16 u_dpsram(
61
        .addra  (wr_ADDR),
62
        .addrb  (rd_ADDR),
63
        .clka   (sclk),
64
        .clkb   (sclk),
65
        .dina   (wr_DATA),
66
        .dinb   ({16{1'b0}}),
67
        .douta  (/* OPEN */),
68
        .doutb  (rd_DATA),
69
        .ena    (wr_CSN),
70
        .enb    (rd_CSN),
71
        .wea    (wr_WEN),
72
        .web    (1'b1)
73
);
74
 
75
always @(posedge sclk or negedge rstn)
76
if              (!rstn)         cnt128d_wr <= #1 0;
77
else if (inp_valid)     cnt128d_wr <= #1 cnt128d_wr + 1;
78
 
79
assign wr_DATA = {{16-N{1'b0}},inp_data};
80
assign wr_ADDR = cnt128d_wr;
81
assign wr_CSN  = ~inp_valid;
82
assign wr_WEN  = ~inp_valid;
83
 
84
// Start Reading After fisrt 64 words had been written
85
assign indicator = cnt128d_wr[6];
86
always @(posedge sclk or negedge rstn)
87
if      (!rstn) indicator_1d <= #1 1'b0;
88
else            indicator_1d <= #1 indicator;
89
 
90
assign indicator_pos_edge =  indicator & ~indicator_1d;
91
assign indicator_neg_edge = ~indicator &  indicator_1d;
92
 
93
assign cnt128d_rd_valid_start = indicator_pos_edge | indicator_neg_edge;
94
assign cnt128d_rd_valid_stop  = (cnt128d_rd[5:0] == 63) ? 1'b1 : 1'b0;
95
 
96
always @(posedge sclk or negedge rstn)
97
if              (!rstn)                                 cnt128d_rd_valid <= #1 1'b0;
98
else if (cnt128d_rd_valid_start)cnt128d_rd_valid <= #1 1'b1;
99
else if (cnt128d_rd_valid_stop) cnt128d_rd_valid <= #1 1'b0;
100
 
101
// Read Mode Counter
102
always @(posedge sclk or negedge rstn)
103
if              (!rstn)                         cnt128d_rd <= #1 1'b0;
104
else if (cnt128d_rd_valid)      cnt128d_rd <= #1 cnt128d_rd + 1;
105
 
106
assign rd_ADDR = {cnt128d_rd[6],cnt128d_rd[2:0],cnt128d_rd[5:3]};
107
assign rd_CSN  = ~cnt128d_rd_valid;
108
 
109
// Output
110
always @(posedge sclk or negedge rstn)
111
if      (!rstn) mem_valid <= #1 1'b0;
112
else            mem_valid <= #1 cnt128d_rd_valid;
113
 
114
assign #1 mem_data = rd_DATA[N-1:0];
115
 
116
// synopsys translate_off
117
// <<<------------- DUMP Section
118
 
119
// 2D FHT OUTPUT DUMP DATA 
120
parameter MEM_TRPS_DPSRAM_FILE = "./result/mem_trps_dpsram.txt";
121
integer mem_trps_dpsram_dump;
122
initial mem_trps_dpsram_dump = $fopen(MEM_TRPS_DPSRAM_FILE);
123
 
124
always @(posedge sclk)
125
if (mem_valid) $fdisplay(mem_trps_dpsram_dump,"%h",mem_data);
126
 
127
// synopsys translate_on
128
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.