МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Помощь в написании интерфейса uart на verilog.

Помощь в написании интерфейса uart на verilog. 3 года 10 мес. назад #2898

Добрый день,люди добрые, прошу помощи в описании 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

Нужна помощь в тест бенче, ну и соответственно поисков ошибок в коде.
Вложения:
Спасибо сказали: Mastar24

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Помощь в написании интерфейса uart на verilog. 3 года 10 мес. назад #2899

Для начала поставили задание написать передатчик и приемник.

Прилагаю схемку того, что нужно сделать, коды Приемника, Передатчика и Core.

Не совсем понятно, пишите, что дали задание написать, а потом выкладываете коды, это то что вы написали? Или тоже дали? Еще пару раз всплывает слово процессор, что под этим подразумевается? Вообще UART написать не мудрено. Надо вам все таки собраться и нормально сформулировать задание. Перечитайте еще раз свое первое сообщение, дикий сумбур.
Спасибо сказали: Mastar24

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.139 секунд

facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Языки программирования Помощь в написании интерфейса uart на verilog.