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