Advertisement
Guest User

Untitled

a guest
Jun 15th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module morse(SW, KEY, LEDR, CLOCK_50);
  2.     input[2:0] SW;
  3.     input [1:0] KEY;
  4.     input CLOCK_50;
  5.     output [0:0] LEDR;
  6.  
  7.     morsecoder m0(
  8.         .letters(SW[2:0]),
  9.         .start(KEY[1]),
  10.         .reset_n(KEY[0]),
  11.         .out(LEDR[0]),
  12.         .clock(CLOCK_50)
  13.     );
  14. endmodule
  15.  
  16. module morsecoder(letters, start, reset_n, out, clock);
  17.     input [2:0] letters;
  18.     input start, reset_n, clock;
  19.     output out;
  20.  
  21.     wire[13:0] w_morsecodebinary;
  22.     wire[24:0] w_rdivider;
  23.     wire enable_r0;
  24.  
  25.     LUT l0(
  26.         .letter(letters),
  27.         .morsec_binary(w_morsecodebinary)
  28.     );
  29.  
  30.     ratedivider rd0(
  31.         .d(25'd24_999_999),
  32.         .clock(clock),
  33.         .reset_n(reset_n),
  34.         .q(w_rdivider)
  35.     );
  36.    
  37.     assign enable_r0 = (w_rdivider == 0)? 1: 0;
  38.  
  39.     register r0(
  40.         .load_val(w_morsecodebinary),
  41.         .load_n(start),
  42.         .clock(clock),
  43.         .reset_n(reset_n),
  44.         .enable(enable_r0), // from rate divider
  45.         .out(out)
  46.     );
  47.  
  48.  
  49. endmodule
  50.  
  51. module LUT(letter, morsec_binary);
  52.     input [2:0] letter;
  53.     output reg [13:0] morsec_binary;
  54.  
  55.     always @(*)
  56.     begin
  57.         case(letter)
  58.         3'b000: morsec_binary = {6'b101010, 8'd0}; //binary for S
  59.         3'b001: morsec_binary = {4'b1110, 10'd0}; // binary for T
  60.         3'b010: morsec_binary = {8'b10101110, 6'd0}; // binary for U
  61.         3'b011: morsec_binary = {10'b1010101110,4'd0}; // binary for V
  62.         3'b100: morsec_binary = {10'b1011101110, 4'd0}; // binary for W
  63.         3'b101: morsec_binary = {12'b111010101110,2'd0}; // binary for X
  64.         3'b110: morsec_binary = 14'b11101011101110 // binary for Y
  65.         3'b111: morsec_binary = {12'111011101010,2'd0} // binary for Z
  66.     end
  67. endmodule
  68.  
  69. module register(load_val, load_n, reset_n, clock, out, enable);
  70.     input [13:0] load_val;
  71.     input load_n, clock, reset_n, enable; // reset_n key 0 asynchrnous reset . load_n = key 1 start displaying morse code
  72.     output reg out;
  73.     reg [13:0] morsec;
  74.  
  75.     always @ (posedge clock, negedge reset_n)
  76.     begin
  77.         if(reset_n == 1'b0)
  78.         begin
  79.             load_n <= 1'b0;
  80.             out <= 1'b0;
  81.             morsec <= 14'd0;
  82.         end
  83.         else if (load_n == 1'b0)
  84.         begin
  85.            out <= 1'b0;
  86.            morsec <= load_val;
  87.         end
  88.         else if (enable == 1'b1)
  89.         begin
  90.             out <= morsec[13];
  91.             morsec <= morsec << 1'b1;
  92.         end
  93.     end
  94.  
  95. endmodule
  96.  
  97.  
  98. module ratedivider(d, clock, reset_n, q);
  99.     input [24:0] d; // because 2^25 equal to 33 million which is more than enough for 25 million
  100.     input clock, reset_n;
  101.     output reg [24:0] q;
  102.  
  103.     always @(posedge clock, negedge reset_n)
  104.     begin
  105.         if(reset_n == 1'b0)
  106.             q <= d;
  107.         else if(q == 1'b0)
  108.             q <= d
  109.         else
  110.             q<= q - 1'b1;
  111.     end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement