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

SCSI/ASPI

开发平台:

VHDL

  1. // 
  2. // SYNTHETIC PIC 2.0                                          4/23/98
  3. //
  4. //    This is a synthesizable Microchip 16C57 compatible
  5. //    microcontroller.  This core is not intended as a high fidelity model of
  6. //    the PIC, but simply a way to offer a simple processor core to people
  7. //    familiar with the PIC who also have PIC tools.  
  8. //
  9. //    pictest.v  -   top-level testbench (NOT SYNTHESIZABLE)
  10. //    piccpu.v   -   top-level synthesizable module
  11. //    picregs.v  -   register file instantiated under piccpu
  12. //    picalu.v   -   ALU instantiated under piccpu
  13. //    picidec.v  -   Instruction Decoder instantiated under piccpu
  14. //    hex2rom.c  -   C program used to translate MPLAB's INTEL HEX output
  15. //                   into the Verilog $readmemh compatible file
  16. //    test*.asm  -   (note the wildcard..) Several test programs used
  17. //                   to help debug the verilog.  I used MPLAB and the simulator
  18. //                   to develop these programs and get the expected results.
  19. //                   Then, I ran them on Verilog-XL where they appeared to
  20. //                   match.
  21. //
  22. //    Copyright, Tom Coonan, '97.
  23. //    Use freely, but not for resale as is.  You may use this in your
  24. //    own projects as desired.  Just don't try to sell it as is!
  25. //
  26. //
  27. // This is an expansion module containing a Direct Digital Synthesizer (DDS).
  28. // Simply put, it is a programmable sinewave generator.  It is used in a little
  29. // example suggesting how a FSK modulator might be done.
  30. //
  31. // Address  Direction   Description
  32. //   7E       R/W         Control:
  33. //                           0  -  Enable.  Must set to '1' to get output.
  34. //   7F       W           DDS Value
  35. //
  36. // Copyright (c) 1999 Thomas Coonan (tcoonan@mindspring.com)
  37. //
  38. //    This source code is free software; you can redistribute it
  39. //    and/or modify it in source code form under the terms of the GNU
  40. //    General Public License as published by the Free Software
  41. //    Foundation; either version 2 of the License, or (at your option)
  42. //    any later version.
  43. //
  44. //    This program is distributed in the hope that it will be useful,
  45. //    but WITHOUT ANY WARRANTY; without even the implied warranty of
  46. //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  47. //    GNU General Public License for more details.
  48. //
  49. //    You should have received a copy of the GNU General Public License
  50. //    along with this program; if not, write to the Free Software
  51. //    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  52. //
  53. //    
  54. //
  55. module exp (
  56.    clk,
  57.    reset,
  58.    dds_out,
  59.    
  60.    expdin,
  61.    expdout,
  62.    expaddr,
  63.    expread,
  64.    expwrite
  65. );
  66. input clk;
  67. input reset;
  68. output [7:0] dds_out; // DDS output
  69. // Expansion Interface
  70. output [7:0] expdin; // TO the PIC core.
  71. input [7:0] expdout; // FROM the PIC core.
  72. input [6:0] expaddr; // Address
  73. input expread; // Asserted (high) when PIC is reading FROM us.
  74. input expwrite; // Asserted (high) when PIC is writing TO us.
  75. // Outputs used as registers
  76. reg [7:0] expdin;
  77. reg [7:0] dds_out;
  78. // Programmable registers
  79. reg [7:0] ddsstep;
  80. reg [0:0] ctl;
  81. // *** DDS ***
  82. reg [9:0] accum;
  83. reg [7:0] sinout;
  84. reg [7:0] sin_rom [0:1023];
  85. // Look up the SIN value.  This is usually implemented as a memory, either
  86. // a RAM or a ROM.  It is therefore highly dependent on the particular
  87. // technology and is not really explored in this simple example.  We will
  88. // simply declare a big register array, and read the SIN data from a file
  89. // at the start of the simulation.
  90. //
  91. initial begin
  92.    $display ("Reading in SIN data for example DDS in EXP.V from sindata.hex");
  93.    $readmemh ("sindata.hex", sin_rom);
  94. end
  95. always @(posedge clk) begin
  96.    if (reset) begin
  97.       accum <= 0;
  98.    end
  99.    else begin
  100.       accum <= accum + ddsstep;
  101.    end
  102. end
  103. always @(posedge clk) begin
  104.    if (reset) begin
  105.       sinout <= 0;
  106.    end
  107.    else begin
  108.       sinout <= sin_rom[accum];
  109.    end
  110. end
  111. always @(posedge clk) begin
  112.    if (reset) begin
  113.       dds_out <= 0;
  114.    end
  115.    else begin
  116.       if (ctl[0]) begin
  117.          dds_out <= sinout;
  118.       end
  119.       else begin
  120.          dds_out <= 0;
  121.       end
  122.    end
  123. end
  124. // Drive the expdin bus back to the PIC.  This should just be a MUX.
  125. // For several different expansion submodules, this would be our gateway
  126. // MUX back to the PIC core.
  127. //
  128. always @(expread or expaddr) begin
  129.    if (expread) begin
  130.       case (expaddr)
  131.          7'h7F:    expdin <= ddsstep;
  132.          default:  expdin <= 0;
  133.       endcase
  134.    end
  135.    else begin
  136.       expdin <= 0;
  137.    end
  138. end
  139. // 
  140. always @(posedge clk) begin
  141.    if (reset) begin
  142.       ctl      <= 0;
  143.       ddsstep  <= 0;
  144.    end
  145.    else begin
  146.       if (expwrite) begin
  147.          case (expaddr) // synopsys parallel_case
  148.             7'h7E: ctl     <= expdout[7:0];
  149.             7'h7F: ddsstep <= expdout[7:0];
  150.          endcase
  151.       end
  152.    end
  153. end
  154. endmodule