regs.v
上传用户:bltddc
上传日期:2020-07-09
资源大小:4428k
文件大小:5k
源码类别:

SCSI/ASPI

开发平台:

VHDL

  1. //
  2. // Copyright (c) 1999 Thomas Coonan (tcoonan@mindspring.com)
  3. //
  4. //    This source code is free software; you can redistribute it
  5. //    and/or modify it in source code form under the terms of the GNU
  6. //    General Public License as published by the Free Software
  7. //    Foundation; either version 2 of the License, or (at your option)
  8. //    any later version.
  9. //
  10. //    This program is distributed in the hope that it will be useful,
  11. //    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. //    GNU General Public License for more details.
  14. //
  15. //    You should have received a copy of the GNU General Public License
  16. //    along with this program; if not, write to the Free Software
  17. //    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  18. //
  19. `define DEBUG_SHOWREADS
  20. `define DEBUG_SHOWWRITES
  21. // Memory Map:
  22. //
  23. // PIC Data Memory addressing is complicated.  See the Data Book for full explanation..
  24. //
  25. // Basically, each BANK contains 32 locations.  The lowest 16 locations in ALL Banks
  26. // are really all mapped to the same bank (bank #0).  The first 8 locations are the Special
  27. // registers like the STATUS and PC registers.  The upper 16 words in each bank, really are
  28. // unique to each bank.  The smallest PIC (16C54) only has the one bank #0.
  29. //
  30. // So, as a programmer, what you get is this.  No matter what bank you are in (FSR[6:5])
  31. // you always have access to your special registers and also to registers 8-15.  You can
  32. // change to a 1 of 4 banks by setting FSR[6:5] and get 4 different sets of registers
  33. // 16-31.
  34. //
  35. //
  36. //   bank location 
  37. //     XX 00rrr  -  The special registers are not implemented in this register file.
  38. //     XX 01rrr  -  The 8 common words, just above the Special Regs, same for all Banks
  39. //     00 1rrrr  -  The 16 words unique to Bank #0
  40. //     01 1rrrr  -  The 16 words unique to Bank #1
  41. //     10 1rrrr  -  The 16 words unique to Bank #2
  42. //     11 1rrrr  -  The 16 words unique to Bank #3
  43. //
  44. //  So, 
  45. //     Special Regs are location[4:3] == 00
  46. //     Common Regs are  location[4:3] == 01
  47. //     Words in banks   location[4]   == 1
  48. // 
  49. //  Remap to a new single memory space.  Remap in chunks of 8 words.  The PIC words
  50. //  will get remapped to the RAM in a contiguous manner.  The Common registers are
  51. //  mapped to the first 8 words of our RAM.  Next, each bank's words in the upper
  52. //  half of the bank are mapped to the RAM in a contiguous manner:
  53. //
  54. //      PIC View        Our RAM
  55. //   bank location      Address
  56. //     00 01rrr  =>     0  -   7   (common words)
  57. //     00 10rrr  =>     8  -  15
  58. //     00 11rrr  =>    16  -  23
  59. //     01 01rrr  =>     0  -   7   (common words)
  60. //     01 10rrr  =>    24  -  31
  61. //     01 11rrr  =>    32  -  39
  62. //     10 01rrr  =>     0  -   7   (common words)
  63. //     10 10rrr  =>    40  -  47
  64. //     10 11rrr  =>    48  -  55
  65. //     11 01rrr  =>     0  -   7   (common words)
  66. //     11 10rrr  =>    56  -  63
  67. //     11 11rrr  =>    64  -  71 <-- last four locations are not implemented
  68. //
  69. // 
  70. //
  71. module regs (clk, reset, we, re, bank, location, din, dout);
  72. input clk;
  73. input reset;
  74. input we;
  75. input re;
  76. input  [1:0] bank; // Bank 0,1,2,3
  77. input  [4:0] location; // Location
  78. input  [7:0] din; // Input 
  79. output [7:0] dout; // Output 
  80. // The top-level modulke, piccpu, is supposed to garuntee that re and we
  81. // are asserted for only valid locations.  So, we don't need to worry about
  82. // safely mapping invalid addresses.
  83. //
  84. reg [6:0] final_address;
  85. // Instatiate the final memory model.
  86. //
  87. dram dram (
  88.    .clk (clk),
  89.    .address (final_address),
  90.    .we (we),
  91.    .din (din),
  92.    .dout (dout)
  93. );
  94. // The final_address is our remapped address.  This combinational logic
  95. // is performed immediate on the input address signals, before any latching.
  96. // This is because a WRITE doesn't use the latched values whereas the READ does.
  97. //
  98. always @(bank or location) begin
  99.    casex ({bank, location})
  100.       // First, let's handle the locations that all get mirrored back
  101.       // into the bank #0 words from 8-15.
  102.       //
  103.       7'b00_01XXX: final_address = {4'b0000, location[2:0]};
  104.       7'b01_01XXX: final_address = {4'b0000, location[2:0]};
  105.       7'b10_01XXX: final_address = {4'b0000, location[2:0]};
  106.       7'b11_01XXX: final_address = {4'b0000, location[2:0]};
  107.       
  108.       // Now, handle words in the upper halves of each bank.
  109.       //
  110.       // Bank #0
  111.       7'b00_10XXX: final_address = {4'b0001, location[2:0]};
  112.       7'b00_11XXX: final_address = {4'b0010, location[2:0]};
  113.       // Bank #1
  114.       7'b01_10XXX: final_address = {4'b0011, location[2:0]};
  115.       7'b01_11XXX: final_address = {4'b0100, location[2:0]};
  116.       
  117.       // Bank #2
  118.       7'b10_10XXX: final_address = {4'b0101, location[2:0]};
  119.       7'b10_11XXX: final_address = {4'b0110, location[2:0]};
  120.       
  121.       // Bank #3
  122.       7'b11_10XXX: final_address = {4'b0111, location[2:0]};
  123.       7'b11_11XXX: final_address = {4'b1000, location[2:0]};
  124.       
  125.       default:     final_address = {4'b0000, location[2:0]};
  126.    endcase
  127. end
  128. endmodule