Verilog 如何正确连接接收器、发送器和top并使它们相互依赖-RS232

Verilog 如何正确连接接收器、发送器和top并使它们相互依赖-RS232,verilog,fpga,hdl,Verilog,Fpga,Hdl,我有一个简单的项目,需要我为RS232接收器和发送器编写一个代码,然后将它们放在一起,最后测试它是否正常工作。我已经为发送方和接收方(以及连接块-顶部)准备了代码。我的问题是,我不知道如何将它们连接起来,这样它们就可以正常地工作了 主要问题是我无法将数据从数据_o传输到数据_I,因为一个是reg,另一个是wire。出于这些目的,我不想使用inout。我想不出任何可能的修改来让它工作 另一个问题是放置一些标志,可以遵循这样的想法:如果接收->不发送,如果发送->不接收 这是我的密码: 顶五 `时间

我有一个简单的项目,需要我为RS232接收器和发送器编写一个代码,然后将它们放在一起,最后测试它是否正常工作。我已经为发送方接收方(以及连接块-顶部)准备了代码。我的问题是,我不知道如何将它们连接起来,这样它们就可以正常地工作了

主要问题是我无法将数据从数据_o传输到数据_I,因为一个是reg,另一个是wire。出于这些目的,我不想使用inout
。我想不出任何可能的修改来让它工作

另一个问题是放置一些标志,可以遵循这样的想法:如果接收->不发送,如果发送->不接收

这是我的密码:

顶五

`时间刻度为1ns/1ps
模块顶部(
中华民国,
第一,,
RXD_i,
数据(i),
TXD_o,
数据
);
输入时钟i;
输入rst_i;
输入RXD_i;
输出TXD_o;
//问题就在这里,难道你不能
在当今所有的CPU和FPGA中,读写数据路径都是独立的总线。你会发现,所有的CPU核心都是如此。看看ARM的AXI或AHB总线协议

更令人担忧的是,您实现功能的方式。您至少需要一些“数据有效”信号,以便发射机知道何时有有效数据发送,以及何时有效数据到达,以便接收。
即使这样也不够,因为对于TX,连接逻辑需要知道数据何时发送,下一个字节何时可以输出

您需要制作一个(最好是标准的)CPU接口来与UART通信。(对于初学者,我不会使用AXI。)

至于您的标志:它们将来自CPU接口


最后:UART应能同时发送和接收。

RS232是电压级而不是协议。你是说你想写-15V和+15V,还是说你想串行发送一些位?我想串行发送一些位。我实际上已经尝试在我的代码中插入这些东西,不幸的是我没有成功。可能是因为我做错了什么。如何解决这个问题?从测试台上的一个简单CPU总线模型开始,它可以模拟读写操作。制作一个UART CPU接口,您可以在其中读取和写入寄存器。有一个网站不仅发布Verilog代码(许多人都发布),还发布测试台:
`timescale 1ns / 1ps

module top (
    clk_i,
    rst_i,
    RXD_i,
    data_i,
    TXD_o,
    data_o
);

input clk_i;
input rst_i;
input RXD_i;
output TXD_o;

//the problem is here, can't data_i <= data_o because output is reg
input [7:0] data_i;
output [7:0] data_o;

receiver r1(clk_i, RXD_i, data_o);
sender s1(clk_i, data_i, TXD_o);

endmodule
`timescale 1ns / 1ps

module receiver (
    clk_i,
    RXD_i,
    data_o
);

//inputs and outputs
input clk_i;
input RXD_i;
output reg [7:0] data_o;

//counter values
parameter received_bit_period = 5208;
parameter half_received_bit_period = 2604;

//state definitions
parameter ready = 2'b00;
parameter start_bit = 2'b01;
parameter data_bits = 2'b10;
parameter stop_bit = 2'b11;

//operational regs
reg [12:0] counter = 0;  //9765.625Hz
reg [7:0] received_data = 8'b00000000;
reg [3:0] data_bit_count = 0;
reg [1:0] state = ready;

//latching part
reg internal_RXD;

always @(posedge clk_i) //latch RXD_i value to internal_RXD
    begin
        internal_RXD = RXD_i;
    end

always @(clk_i) //receiving process
    begin  
        case (state)
            ready : 
                begin
                    if (internal_RXD == 0)
                        begin
                            state <= start_bit;
                            counter <= counter + 1;
                        end
                    else
                        begin
                            state <= ready;
                            counter <= 0;
                            data_bit_count <= 0;
                        end
                end     
            start_bit :
                begin
                    if (counter == half_received_bit_period)
                        begin
                            if (internal_RXD == 0)
                                begin
                                    state <= data_bits;
                                    counter <= 0;
                                end
                        end
                    else
                        begin
                            state <= start_bit;
                            counter <= counter + 1;
                        end     

                end
            data_bits : 
                begin           
                    if (counter == received_bit_period)
                        begin
                            received_data[data_bit_count] <= internal_RXD;
                            data_bit_count <= data_bit_count + 1;   
                            counter <= 0;
                            if (data_bit_count == 8)
                                state <= stop_bit;
                        end
                    else
                        counter <= counter + 1; 
                end
            stop_bit:
                begin
                    counter <= counter + 1;
                    if (counter == received_bit_period)
                        begin
                            state <= ready;
                            data_o <= received_data;
                        end
                end
        endcase 
    end

endmodule
`timescale 1ns / 1ps

module sender (
    clk_i,
    data_i,
    TXD_o
);

//inputs and outputs
input clk_i;
input [7:0] data_i;
output reg TXD_o;

//counter values
parameter received_bit_period = 5208;
parameter half_received_bit_period = 2604;

//state definitions
parameter ready = 1'b0;
parameter data_bits = 1'b1;

//operational regs
reg [12:0] counter = 0;  //9765.625Hz
reg [9:0] framed_data = 0;
reg [3:0] data_bit_count = 0;
reg state = ready;

always @(posedge clk_i) //sending process
    begin
        case (state)
            ready : 
                begin // flag needed?
                    state <= data_bits;
                    TXD_o <= 1;
                    framed_data[0] <= 1'b0;
                    framed_data[8:1] <= data_i;
                    framed_data[9] <= 1'b1;
                    counter <= 0;
                end
            data_bits :
                begin
                    counter <= counter + 1;
                    if (data_bit_count == 10)
                        begin // flag needed?
                            state <= ready;
                            data_bit_count <= 0;
                            TXD_o <= 1;
                        end
                    else
                        begin
                            if (counter == received_bit_period)
                                begin
                                    data_bit_count <= data_bit_count + 1;
                                end
                            TXD_o <= framed_data[data_bit_count];
                        end     
                end
        endcase 
    end

endmodule