sync for different clock
Signed-off-by: liangkangnan <liangkangnan@163.com>pull/1/head
parent
43aca8195c
commit
02bcee9aa9
|
@ -14,9 +14,14 @@
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
`include "../core/defines.v"
|
||||||
|
|
||||||
|
// JTAG顶层模块
|
||||||
|
// 涉及跨时钟域传输,这里采用打两拍的方式进行同步
|
||||||
module jtag_top(
|
module jtag_top(
|
||||||
|
|
||||||
|
input wire clk,
|
||||||
|
|
||||||
input wire jtag_rst_n,
|
input wire jtag_rst_n,
|
||||||
|
|
||||||
input wire jtag_pin_TCK,
|
input wire jtag_pin_TCK,
|
||||||
|
@ -24,18 +29,18 @@ module jtag_top(
|
||||||
input wire jtag_pin_TDI,
|
input wire jtag_pin_TDI,
|
||||||
output wire jtag_pin_TDO,
|
output wire jtag_pin_TDO,
|
||||||
|
|
||||||
output wire reg_we_o,
|
output reg reg_we_o,
|
||||||
output wire[4:0] reg_addr_o,
|
output reg[4:0] reg_addr_o,
|
||||||
output wire[31:0] reg_wdata_o,
|
output reg[31:0] reg_wdata_o,
|
||||||
input wire[31:0] reg_rdata_i,
|
input wire[31:0] reg_rdata_i,
|
||||||
output wire mem_we_o,
|
output reg mem_we_o,
|
||||||
output wire[31:0] mem_addr_o,
|
output reg[31:0] mem_addr_o,
|
||||||
output wire[31:0] mem_wdata_o,
|
output reg[31:0] mem_wdata_o,
|
||||||
input wire[31:0] mem_rdata_i,
|
input wire[31:0] mem_rdata_i,
|
||||||
output wire op_req_o,
|
output reg op_req_o,
|
||||||
|
|
||||||
output wire halt_req_o,
|
output reg halt_req_o,
|
||||||
output wire reset_req_o
|
output reg reset_req_o
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -52,7 +57,76 @@ module jtag_top(
|
||||||
// jtag_dm
|
// jtag_dm
|
||||||
wire dm_is_busy;
|
wire dm_is_busy;
|
||||||
wire[DM_RESP_BITS - 1:0] dm_resp_data;
|
wire[DM_RESP_BITS - 1:0] dm_resp_data;
|
||||||
|
wire dm_reg_we_o;
|
||||||
|
wire[4:0] dm_reg_addr_o;
|
||||||
|
wire[31:0] dm_reg_wdata_o;
|
||||||
|
wire dm_mem_we_o;
|
||||||
|
wire[31:0] dm_mem_addr_o;
|
||||||
|
wire[31:0] dm_mem_wdata_o;
|
||||||
|
wire dm_op_req_o;
|
||||||
|
wire dm_halt_req_o;
|
||||||
|
wire dm_reset_req_o;
|
||||||
|
|
||||||
|
reg tmp_reg_we_o;
|
||||||
|
reg[4:0] tmp_reg_addr_o;
|
||||||
|
reg[31:0] tmp_reg_wdata_o;
|
||||||
|
reg tmp_mem_we_o;
|
||||||
|
reg[31:0] tmp_mem_addr_o;
|
||||||
|
reg[31:0] tmp_mem_wdata_o;
|
||||||
|
reg tmp_op_req_o;
|
||||||
|
reg tmp_halt_req_o;
|
||||||
|
reg tmp_reset_req_o;
|
||||||
|
|
||||||
|
|
||||||
|
// 打第一拍
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
if (!jtag_rst_n) begin
|
||||||
|
tmp_reg_we_o <= `WriteDisable;
|
||||||
|
tmp_reg_addr_o <= `ZeroReg;
|
||||||
|
tmp_reg_wdata_o <= `ZeroWord;
|
||||||
|
tmp_mem_we_o <= `WriteDisable;
|
||||||
|
tmp_mem_addr_o <= `ZeroWord;
|
||||||
|
tmp_mem_wdata_o <= `ZeroWord;
|
||||||
|
tmp_op_req_o <= 1'b0;
|
||||||
|
tmp_halt_req_o <= 1'b0;
|
||||||
|
tmp_reset_req_o <= 1'b0;
|
||||||
|
end else begin
|
||||||
|
tmp_reg_we_o <= dm_reg_we_o;
|
||||||
|
tmp_reg_addr_o <= dm_reg_addr_o;
|
||||||
|
tmp_reg_wdata_o <= dm_reg_wdata_o;
|
||||||
|
tmp_mem_we_o <= dm_mem_we_o;
|
||||||
|
tmp_mem_addr_o <= dm_mem_addr_o;
|
||||||
|
tmp_mem_wdata_o <= dm_mem_wdata_o;
|
||||||
|
tmp_op_req_o <= dm_op_req_o;
|
||||||
|
tmp_halt_req_o <= dm_halt_req_o;
|
||||||
|
tmp_reset_req_o <= dm_reset_req_o;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// 打第二拍
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
if (!jtag_rst_n) begin
|
||||||
|
reg_we_o <= `WriteDisable;
|
||||||
|
reg_addr_o <= `ZeroReg;
|
||||||
|
reg_wdata_o <= `ZeroWord;
|
||||||
|
mem_we_o <= `WriteDisable;
|
||||||
|
mem_addr_o <= `ZeroWord;
|
||||||
|
mem_wdata_o <= `ZeroWord;
|
||||||
|
op_req_o <= 1'b0;
|
||||||
|
halt_req_o <= 1'b0;
|
||||||
|
reset_req_o <= 1'b0;
|
||||||
|
end else begin
|
||||||
|
reg_we_o <= tmp_reg_we_o;
|
||||||
|
reg_addr_o <= tmp_reg_addr_o;
|
||||||
|
reg_wdata_o <= tmp_reg_wdata_o;
|
||||||
|
mem_we_o <= tmp_mem_we_o;
|
||||||
|
mem_addr_o <= tmp_mem_addr_o;
|
||||||
|
mem_wdata_o <= tmp_mem_wdata_o;
|
||||||
|
op_req_o <= tmp_op_req_o;
|
||||||
|
halt_req_o <= tmp_halt_req_o;
|
||||||
|
reset_req_o <= tmp_reset_req_o;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
jtag_driver u_jtag_driver(
|
jtag_driver u_jtag_driver(
|
||||||
.rst_n(jtag_rst_n),
|
.rst_n(jtag_rst_n),
|
||||||
|
@ -73,17 +147,17 @@ module jtag_top(
|
||||||
.dtm_req_data(dtm_req_data),
|
.dtm_req_data(dtm_req_data),
|
||||||
.dm_is_busy(dm_is_busy),
|
.dm_is_busy(dm_is_busy),
|
||||||
.dm_resp_data(dm_resp_data),
|
.dm_resp_data(dm_resp_data),
|
||||||
.dm_reg_we(reg_we_o),
|
.dm_reg_we(dm_reg_we_o),
|
||||||
.dm_reg_addr(reg_addr_o),
|
.dm_reg_addr(dm_reg_addr_o),
|
||||||
.dm_reg_wdata(reg_wdata_o),
|
.dm_reg_wdata(dm_reg_wdata_o),
|
||||||
.dm_reg_rdata(reg_rdata_i),
|
.dm_reg_rdata(reg_rdata_i),
|
||||||
.dm_mem_we(mem_we_o),
|
.dm_mem_we(dm_mem_we_o),
|
||||||
.dm_mem_addr(mem_addr_o),
|
.dm_mem_addr(dm_mem_addr_o),
|
||||||
.dm_mem_wdata(mem_wdata_o),
|
.dm_mem_wdata(dm_mem_wdata_o),
|
||||||
.dm_mem_rdata(mem_rdata_i),
|
.dm_mem_rdata(mem_rdata_i),
|
||||||
.dm_op_req(op_req_o),
|
.dm_op_req(dm_op_req_o),
|
||||||
.dm_halt_req(halt_req_o),
|
.dm_halt_req(dm_halt_req_o),
|
||||||
.dm_reset_req(reset_req_o)
|
.dm_reset_req(dm_reset_req_o)
|
||||||
);
|
);
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
Loading…
Reference in New Issue