Merge branch 'change-uart-freq' into submission-mpw-3
diff --git a/verilog/dv/jacaranda_test/jacaranda_test.c b/verilog/dv/jacaranda_test/jacaranda_test.c
index 746da67..42e1d36 100644
--- a/verilog/dv/jacaranda_test/jacaranda_test.c
+++ b/verilog/dv/jacaranda_test/jacaranda_test.c
@@ -25,6 +25,7 @@
 
 #define BASE_ADDR 0x30000000
 #define IMEM_WRITE BASE_ADDR
+#define UART_CLK_FREQ BASE_ADDR + 0x4
 
 static void
 write(uint32_t addr, uint32_t val)
@@ -55,6 +56,9 @@
     // set reset to high
 	reg_la0_data = 1;
 
+    // set uart clk frequency
+    write(UART_CLK_FREQ, 40000000);
+
     for(int i = 0; i < 29; ++i) {
         write(IMEM_WRITE, i << 8 | mem[i]);
     }
diff --git a/verilog/rtl/jacaranda-8/UART/UART.v b/verilog/rtl/jacaranda-8/UART/UART.v
index 9262a66..f76325d 100644
--- a/verilog/rtl/jacaranda-8/UART/UART.v
+++ b/verilog/rtl/jacaranda-8/UART/UART.v
@@ -15,11 +15,17 @@
     output wire[7:0] rx_data,
     output wire busy_flag,
     output wire receive_flag,
-    output reg int_req
+    output reg int_req,
+    input wire [31:0] clk_freq
 );
 
+    parameter BAUD_RATE = 115200;
+
+    wire [31:0] clk_count_bit;
     reg state;
 
+    assign clk_count_bit = clk_freq / BAUD_RATE;
+
     always @(negedge clk) begin
         if(state == 1'b0) begin //データ待機中
             int_req <= 1'b0;
@@ -42,7 +48,7 @@
         state   <= 1'b0;
     end
 
-    tx tx1(clk, reset, tx_en, begin_flag, tx_data, tx, busy_flag);
-    rx rx1(clk, rx_en, rx, rx_data, receive_flag);
+    tx tx1(clk, reset, tx_en, begin_flag, tx_data, tx, busy_flag, clk_count_bit);
+    rx rx1(clk, rx_en, rx, rx_data, receive_flag, clk_count_bit);
     
 endmodule
diff --git a/verilog/rtl/jacaranda-8/UART/rx.v b/verilog/rtl/jacaranda-8/UART/rx.v
index 9f3efd3..3afd654 100644
--- a/verilog/rtl/jacaranda-8/UART/rx.v
+++ b/verilog/rtl/jacaranda-8/UART/rx.v
@@ -1,24 +1,24 @@
-module rx(clk, rx_en, rx, data, end_flag);
+module rx(clk, rx_en, rx, data, end_flag, clk_count_bit);
     input wire clk;
     input wire rx_en;
     input wire rx;
     output reg[7:0] data = 8'b00000000;
     output reg end_flag = 1'b0;
+    input wire [31:0] clk_count_bit;
 
-    parameter CLK_FREQ = 50_000_000;
-    parameter BAUD_RATE = 115200;
-    parameter CLK_COUNT_BIT = CLK_FREQ / BAUD_RATE;
-    parameter CLK_BEGIN_TO_RECEIVE = CLK_COUNT_BIT + CLK_COUNT_BIT / 2 - 4;
-    
+    wire [31:0] clk_begin_to_receive;
+
     reg[1:0] state = 2'b00;
     reg[31:0] clk_count = 32'd0;
     reg[2:0] bit_count = 3'd0;
     reg[3:0] recent = 4'b1111;
     wire update_flag;
 
+    assign clk_begin_to_receive = clk_count_bit + clk_count_bit / 2 - 4;
+
     assign update_flag = (state == 2'b01) 
-        ? clk_count == CLK_BEGIN_TO_RECEIVE 
-        : clk_count == CLK_COUNT_BIT - 32'd1;
+        ? clk_count == clk_begin_to_receive
+        : clk_count == clk_count_bit - 32'd1;
     
     always @(posedge clk) begin
         case(state)
diff --git a/verilog/rtl/jacaranda-8/UART/tx.v b/verilog/rtl/jacaranda-8/UART/tx.v
index 9389f8a..60d1b4a 100644
--- a/verilog/rtl/jacaranda-8/UART/tx.v
+++ b/verilog/rtl/jacaranda-8/UART/tx.v
@@ -1,4 +1,4 @@
-module tx(clk, reset, tx_en, begin_flag, data, tx, busy_flag);
+module tx(clk, reset, tx_en, begin_flag, data, tx, busy_flag, clk_count_bit);
     input wire clk;
     input wire reset;
     input wire tx_en;
@@ -6,17 +6,14 @@
     input wire[7:0] data;
     output reg tx;
     output wire busy_flag;
-
-    parameter CLK_FREQ = 40_000_000;
-    parameter BAUD_RATE = 115200;
-    parameter CLK_COUNT_BIT = CLK_FREQ / BAUD_RATE;
+    input wire [31:0] clk_count_bit;
 
     reg[1:0] state;
     reg[31:0] clk_count;
     reg[2:0] bit_count;
     wire update_flag;
     
-    assign update_flag = (clk_count == CLK_COUNT_BIT - 32'd1);
+    assign update_flag = (clk_count == clk_count_bit - 32'd1);
     assign busy_flag = ~(state == 2'b00);
 
     always @(posedge clk or posedge reset) begin
diff --git a/verilog/rtl/jacaranda-8/computer.v b/verilog/rtl/jacaranda-8/computer.v
index 84b8325..52f8b4d 100644
--- a/verilog/rtl/jacaranda-8/computer.v
+++ b/verilog/rtl/jacaranda-8/computer.v
@@ -60,7 +60,6 @@
 
     wire [7:0] instr;
     wire [7:0] pc;
-    assign la_data_out[7:0] = pc;
     wire [7:0] rd_data;
     wire [7:0] rs_data;
     wire mem_w_en;
@@ -94,6 +93,8 @@
 
     wire [7:0] wb_instr_req_addr;
 
+    wire [31:0] uart_clk_freq;
+
     assign instr_mem_addr = reset ? wb_instr_req_addr: pc;
 
     wire reset;
@@ -115,7 +116,9 @@
                 .wbs_dat_o(wbs_dat_o),
                 .instr_mem_addr(wb_instr_req_addr),
                 .instr_mem_data(instr_mem_data),
-                .instr_mem_en(instr_mem_en));
+                .instr_mem_en(instr_mem_en),
+                .uart_freq(uart_clk_freq)
+            );
 
     instr_mem instr_mem(.addr(instr_mem_addr),
                         .w_data(instr_mem_data),
@@ -217,7 +220,9 @@
               .receive_flag(receive_flag),
               .int_req(int_req),
               .access_addr(rs_data),
-              .reg_w_en(reg_w_en));
+              .reg_w_en(reg_w_en),
+              .clk_freq(uart_clk_freq)
+        );
 //
 //    LED4 LED4(.in_data(led_in_data),
 //              .begin_flag(led_begin_flag),
diff --git a/verilog/rtl/jacaranda-8/wishbone.v b/verilog/rtl/jacaranda-8/wishbone.v
index 06e2125..01682f9 100644
--- a/verilog/rtl/jacaranda-8/wishbone.v
+++ b/verilog/rtl/jacaranda-8/wishbone.v
@@ -12,10 +12,13 @@
 
     output reg [7:0] instr_mem_addr,
     output reg [7:0] instr_mem_data,
-    output reg instr_mem_en
+    output reg instr_mem_en,
+
+    output reg [31:0] uart_freq
 );
 
 parameter IMEM_WRITE = 32'h3000_0000;
+parameter UART_CLK_FREQ = 32'h3000_0004;
 
 wire valid;
 wire we;
@@ -55,6 +58,9 @@
                     instr_mem_data <= wdata[7:0];
                     instr_mem_en <= 1'b1;
                 end
+                UART_CLK_FREQ: begin
+                    uart_freq <= wdata;
+                end
             endcase
             ready <= 1'b1;
         end