- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear Community,
I’ve two modules – on is parsing the USART RX signal and the other one is a state machine which shall do something else in case the first module founds e.g. the word “read” inside the usart stream. In my first attempt I tried to use an inout wire that is connected with two regs, one inside the first module “USARTDecoder” and the other one inside the second module “Branch”. However if I compile the stuff I get a fan out error for obvious reasons. I would be very glad if someone could suggest a way how to implement a flag – like wire/reg that can be accessed/set and reset by two modules e.g. for synch puposes.
module USARTDecoder_READ_OKsignal(trigger, signal_in, capture, clk) ;//capture_reset,clk);
input trigger;
input clk;
input signal_in;
inout capture;
//input capture_reset;
parameter p1 = "r";
parameter p2 = "e";
parameter p3 = "a";
parameter p4 = "d";
reg counter;
reg trigger_locked;
reg reg_capture;
initial trigger_locked = 1'b0;
initial reg_capture = 1'b0;
//trigger: _____|-|_____ is high while the stop byte is receives by receiver
always @(posedge clk) //use a clock higher than usart
begin
if(trigger == 1'b1 && !trigger_locked) begin
counter <= counter + 8'd1;
trigger_locked <= 1'b1; // lock the addition (make ssure there is only one addition per trigger
end
if(trigger == 1'b0 ) begin
trigger_locked <= 1'b0; // unlock lock for a subseqeunt addition
end
case (counter)
0: begin
// stay here until the fist byte arives
// if(capture_reset) reg_capture <= 1'b0;
end
//stopbyte addition turns counter to 1
1:if(p1 == signal_in) counter<= counter + 8'd1;
else counter <= 8'd0;
//received byte equal to requested byte turn counter to 2
// next stopbyte turn counter to 3 etc.
3:if(p2 == signal_in) counter<= counter + 8'd1;
else counter <= 8'd0;
5:if(p3 == signal_in) counter<= counter + 8'd1;
else counter <= 8'd0;
7:if(p4 == signal_in) begin
reg_capture <= 1'b1; //set capture high until it is reset by another process
counter <= 8'd0; // back to zero with the next clock cycle
end
else counter <= 8'd0;
endcase;
end //posedge always on clk
assign capture = reg_capture;
endmodule
module Branch(write, read, channela, channelb, out, clk);
inout write,read;
//output write_reset;
//output read_reset;
input clk;
input channela;
input channelb;
output out;
reg reg_out;
reg reg_write,reg_read;
initial reg_out = 16'd0;
initial reg_write = 1'b0;
initial reg_read = 1'b0;
always @(posedge clk) //use a clock higher than usart here
begin
if(write) begin
reg_out = channela;
reg_write <= 1'b0;
end
if(read) begin
reg_out = channelb;
reg_read <= 1'b0;
end
end
assign out = reg_out;
//assign read_reset = reg_read;
//assign write_reset = reg_write;
assign read = reg_read;
assign write = reg_write
endmodule
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The code is hard to read, so I did not read it in details. As for the question, normally you would instantiate a register with synchronous set and reset signal. Then you would create these set and reset signals in other synchronous processes (different modules in your case).

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page