2025-05-13 19:44:53 +08:00

255 lines
5.0 KiB
Verilog
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module convert(
input da ,
input wra_n ,
input clka ,
input clkb ,
input rst_n ,
output reg wrb ,
output reg [7:0]db
)
reg da_r;
reg [1:0] state;
reg wra_n_r;
reg sample_act, sample_act_npulse;
reg [3:0] sample_cnt;
reg [7:0] sample_data,sample_data2;
wire wra_n_nge;
assign wra_n_nge = wra_n_r & (~wra_n);
always @(posedge clka) begin
da_r <= da;
end
always @(posedge clka or negedge rst_n) begin
if(!rst_n) begin
wra_n_r <= 1'b1;
end
else begin
wra_n_r <= wra_n;
end
end
always @(posedge clka or negedge rst_n) begin
if(!rst_n) begin
state <= 2'b01;
sample_cnt <= 4'd0;
sample_data <= 8'b0;
sample_act <= 1'b0;
end
else begin
case(state)
2'b01: begin
sample_cnt <= 4'b0;
sample_act <= 1'b0;
if(wra_n_nge) begin
state <= 2'b10;
end
end
2'b10:begin
sample_data <= {sample_data[6:0] , da_r};
if(sample_cnt >= 4'd7) begin
sample_act <= 1'b1;
state <= 2'b10;
end
else begin
sample_cnt <= sample_cnt +1;
end
end
endcase
end
end
always @(posedge clka or negedge rst_n) begin
if(!rst_n) begin
sample_act_npulse <= 1'b0;
sample_data2 <= 8'b0;
end
else begin
sample_data2 <= sample_act ? sample_data : sample_data2;
sample_act_npulse <= sample_act_npulse ^ sample_act;
end
end
reg [2:0]sample_act_b;
always@(posedge clkb or negedge rst_n) begin
if(!rst_n) begin
sample_act_b <= 3'b0;
end
else begin
sample_act_b[2:0] <= {sample_act_b[0] , sample_act_npulse};
end
end
always @(posedge clka or negedge rst_n) begin
if(!rst_n) begin
wrb <= 1'b0;
db <= 8'b0;
end
else begin
wrb <= sample_act_b[2] ^sample_act_b[1];
db <= sample_act_b[1] ? sample_data2:db;
end
end
module top_module (
input clk,
input resetn,//active-low asynchronous reset
input[2:0]r , //request, synchronized to clk posedge
output [2:0] g // grant
);
localparam IDLE = 4'B0001,
ACK0 = 4'B0010,
ACK1 = 4'B0100,
ACK2 = 4'B1000;
localparam idle_t = 1,
ack0_t = 2,
ack1_t = 3,
ack2_t = 4;
reg [3:0] ct_state, nt_state;
reg [2:0] grant;
wire idle_2_idle , idle_2_ack0 , idle_2_ack1 , idle_2_ack2 ;
wire ack0_2_idle , ack0_2_ack0 , ack0_2_ack1 , ack0_2_ack2 ;
wire ack1_2_idle , ack1_2_ack0 , ack1_2_ack1 , ack1_2_ack2 ;
wire ack2_2_idle , ack2_2_ack0 , ack2_2_ack1 , ack2_2_ack2 ;
wire stepinidle , stepinack0 , stepinack1, stepinack2;
assign idle_2_idle = ct_state[idle_t] && r = 3'b000;
assign idle_2_ack0 = ct_state[idle_t] && r[0] = 1'b1;
assign idle_2_ack1 = ct_state[idle_t] && r[1:0] = 2'b10;
assign idle_2_ack2 = ct_state[idle_t] && r = 3'b100;
assign ack0_2_idle = ct_state[ack0_t] && r = 3'b000;
assign ack0_2_ack0 = ct_state[ack0_t] && r[0] = 1'b1;
assign ack0_2_ack1 = ct_state[ack0_t] && r[1:0] = 2'b10;
assign ack0_2_ack2 = ct_state[ack0_t] && r = 3'b100;
assign ack1_2_idle = ct_state[ack1_t] && r = 3'b000;
assign ack1_2_ack0 = ct_state[ack1_t] && r[0] = 1'b1;
assign ack1_2_ack1 = ct_state[ack1_t] && r[1:0] = 2'b10;
assign ack1_2_ack2 = ct_state[ack1_t] && r = 3'b100;
assign ack2_2_idle = ct_state[ack2_t] && r = 3'b000;
assign ack2_2_ack0 = ct_state[ack2_t] && r[0] = 1'b1;
assign ack2_2_ack1 = ct_state[ack2_t] && r[1:0] = 2'b10;
assign ack2_2_ack2 = ct_state[ack2_t] && r = 3'b100;
assign stepinidle = idle_2_idle | ack0_2_idle | ack1_2_idle | ack2_2_idle
assign stepinack0 = idle_2_ack0 | ack0_2_ack0 | ack1_2_ack0 | ack2_2_ack0
assign stepinack1 = idle_2_ack1 | ack0_2_ack1 | ack1_2_ack1 | ack2_2_ack1
assign stepinack2 = idle_2_ack2 | ack0_2_ack2 | ack1_2_ack2 | ack2_2_ack2
always @(posedge clk or resetn) begi
if(!resetn) begin
ct_state <= IDLE;
end
else begin
ct_state <= nt_state;
end
end
always@(*) begin
nt_state = IDLE;
case(1'b1)
stepinidle:nt_state = IDLE ;
stepinack0:nt_state = ACK0;
stepinack1:nt_state = ACK1;
stepinack2:nt_state = ACK2;
default:nt_state = ct_state;
endcase
end
if(r[0] == 1)
nt_state = ACK0;
else if(r[1:0] = 2'b10)
nt_state = ACK1;
else if(r == 3'b100)
nt_state = ACK2;
else
nt_state = ct_state;
always@(*)
grant = ct_state[1+:3];
assign g = grant;
endmodule
//我是24应届-谢玉东-南航-集成电路设计-硕士 18318541191
module top(
input clk ,
input rst_n ,
input [1:0] sig_in ,
output reg [1:0] db_out
);
//
localparam NUM_1MS = 20'd1000_000;
localparam IDLE = 1'b0, WAIT = 1'b1;
reg [19:0] cnt;
reg [1:0] sig_in_r;
reg ct_state , nt_state;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
ct_state <= IDLE;
end
else begin
ct_state <= nt_state
end
end
always @(*) begin
case(ct_state)
IDLE:nt_state = sig_in_r != sig_in ? WAIT : IDLE;
WAIT:nt_state = (cnt == NUM_1MS-1'b1 || sig_in_r!= sig_in )? IDLE : WAIT;
endcase
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
sig_in_r <= 2'b00;
cnt <= 20'd0;
end
else begin
case(ct_state)
1'b0:begin
sig_in_r <= sig_in ;
cnt <= 20'd0;
end
1'b1:begin
if(sig_in_r == sig_in) begin
if(cnt >= NUM_1MS-1) begin
cnt <= 20'b0;
db_out <= sig_in_r;
end
else begin
cnt <= cnt + 1'b1;
end
end
end
endcase
end
end
endmodule