Добрый день,люди добрые, прошу помощи в описании uart на Verilog.
Изучали Active hdl на 3 курсе, сейчас уже на 5, многое приходится заново восполнять. Буду очень благодарна любой помощи.
Для начала поставили задание написать передатчик и приемник. Далее нужно составить модель процессора и с tx объединить в тест бенч, аналогично для rx. Далее объединить это всё,а получится я так понимаю как 2 микроконтроллера, в ещё один тест бенч. Не знаю поняла ли я сама правильно задание и доходчиво ли его объяснила. Прилагаю схемку того, что нужно сделать, коды Приемника, Передатчика и Core. Core это как я понимаю и будет модель процессора, там задаем управляющие сигналы.
Приемник:`timescale 1ns / 1ps
module uart_rx (clk, rx, data, data_ready);
input wire clk;
input wire rx;
output reg [7:0] data;
output data_ready;
reg rx_ff1, rx_ff2;
always @(posedge clk)
begin
rx_ff1 <= rx;
rx_ff2 <= rx_ff1;
end
wire spad = ~rx_ff1 & rx_ff2;
reg receive;
initial receive = 0;
always @(posedge clk)
if (spad)
receive <= 1'b1;
else
if (data_ready)
receive <= 1'b0;
wire start = ~receive & spad;
reg [2:0] count_os;
always @(posedge clk)
if (start)
count_os <= 1'b0;
else
if(receive)
count_os <= count_os + 1'b1;
wire get_bit = ~|count_os;
reg [3:0] count_byte;
always @(posedge get_bit or posedge start)
begin
if (start)
count_byte <= 0;
else
count_byte <= count_byte + 4'b1;
end
wire data_ready = (count_byte == 9);
always @(negedge get_bit)
if (!data_ready) data <= {rx_ff1, data[7:1]};
endmodule
Передатчик:`timescale 1ns / 1ps
module uart_tx(clk, rst, start, data, tx, ready);
input wire clk;
input wire rst;
input wire start;
input wire data;
output reg [7:0] tx;
output wire ready;
reg[7:0] data_tx;
reg[3:0] status;
reg[2:0] control;
initial control = 0;
always@(posedge clk)
control<=control + 1;
assign clock =~|control;
always@(posedge clk)
case (status)
4'b0000: tx <= 1'b1;
4'b0001: tx <= 1'b0;
4'b0010: tx <= data_tx[0];
4'b0011: tx <= data_tx[1];
4'b0100: tx <= data_tx[2];
4'b0101: tx <= data_tx[3];
4'b0110: tx <= data_tx[4];
4'b0111: tx <= data_tx[5];
4'b1000: tx <= data_tx[6];
4'b1001: tx <= data_tx[7];
4'b1010: tx <= 1'b1;
default: tx <= 1'b1;
endcase
assign ready = (status == 4'b0000);
initial status = 0;
always @(posedge clock or posedge rst)
if (rst)
begin
data_tx <= 0;
status <= 0;
end
else
begin
if (start & ready)
begin
data_tx <= data;
status <= 4'b0001;
end
else
if (status > 4'b1010)
status <= 4'b0000;
else
if (!ready & clock)
status <= status + 1'b1;
end
endmodule
Core для tx:module Core_1 (
start,
data,
ready,
clk
);
output start;
output data;
input ready;
input clk;
reg start;
reg [7:0] data;
endmodule
Core для rx:
module Core_2 (
data_ready,
data,
clk );
output data_ready;
output data;
input clk;
reg [7:0] data;
endmodule
Нужна помощь в тест бенче, ну и соответственно поисков ошибок в коде.