реклама на сайте
подробности

 
 
> Конвертер RS232 - внутренняя шина FPGA, не переключается FSM
hdl_student
сообщение Aug 8 2011, 16:18
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 122
Регистрация: 22-02-10
Из: Москва
Пользователь №: 55 617



Добрый день.

Бьюсь над модулем конвертера RS232 -> внутренняя шина FPGA. Идея простая: по RS232 приходит $WR(ADDR)(DATA) - проводим цикл записи на шине. $RD(ADDR) - цикл чтения. Интерфейс с внутренней шиной пока опустил, т.к. не работает приём команды.

Проблема: при симуляции в Modelsim всё работает как должно. В железе (Altera FLEX EPF10K100, 40 МГц) не переключается состояние FSM, стоит всегда в 0 (CONV_IDLE). На вентильном уровне решил пока не моделировать, - думаю, проблема в неточном описании логики.

Модуль rs232_rx работает (выводил все сигналы наружу и щупал). Взят с fpga4fun.com, работает на 9600 бод.

Код модуля:
CODE
`timescale 1 ns / 10 ps

`define CONV_IDLE 'd0
`define CONV_WRITE 'd1
`define CONV_READ 'd2

module i41_rs232 (
input clk,

/* RS-232 */
input rs232_rx,
output rs232_tx
);

/* RS-232 */

wire rs232_rx_ready;
wire rs232_rx_idle;
wire [7:0] rs232_rx_data;

rs232_rx u1_rs232_rx (
.clk(clk),
.RxD(rs232_rx),
.RxD_data_ready(rs232_rx_ready),
.RxD_data(rs232_rx_data),
.RxD_idle(rs232_rx_idle)
);

reg rs232_tx_start;
reg [7:0] rs232_tx_data;
wire rs232_tx_busy;

rs232_tx u2_rs232_tx (
.clk(clk),
.TxD_start(rs232_tx_start),
.TxD_data(rs232_tx_data),
.TxD(rs232_tx),
.TxD_busy(rs232_tx_busy)
);

/* Сдвиговый регистр для команды от RS232 */

reg [7:0] rs232_rx_data_buf [5:0];

always @(posedge rs232_rx_ready) begin
rs232_rx_data_buf[0] <= rs232_rx_data_buf[1];
rs232_rx_data_buf[1] <= rs232_rx_data_buf[2];
rs232_rx_data_buf[2] <= rs232_rx_data_buf[3];
rs232_rx_data_buf[3] <= rs232_rx_data_buf[4];
rs232_rx_data_buf[4] <= rs232_rx_data_buf[5];
rs232_rx_data_buf[5] <= rs232_rx_data;
end

/* FSM */

reg [4:0] conv_state, conv_state_next;

always @ (posedge clk) begin
case (conv_state)
`CONV_IDLE: case ({rs232_rx_data_buf[0], rs232_rx_data_buf[1], rs232_rx_data_buf[2]})
"$WR": conv_state_next = `CONV_WRITE;
"$RD": conv_state_next = `CONV_READ;
default: conv_state_next = `CONV_IDLE;
endcase
/* Состояния чтения и записи пока оставил без переходов: */
`CONV_WRITE: ;
`CONV_READ: ;
default: conv_state_next = `CONV_IDLE;
endcase
end

initial begin
rs232_rx_data_buf[0] = 0;
rs232_rx_data_buf[1] = 0;
rs232_rx_data_buf[2] = 0;
rs232_rx_data_buf[3] = 0;
rs232_rx_data_buf[4] = 0;
rs232_rx_data_buf[5] = 0;
conv_state = 0;
conv_state_next = 0;
rs232_tx_start = 0;
rs232_tx_data = 0;
end

endmodule


Заранее признателен за ответы.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
hdl_student
сообщение Aug 9 2011, 07:34
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 122
Регистрация: 22-02-10
Из: Москва
Пользователь №: 55 617



Прошу прощения за беспокойство.

Невнимательно смотрел в Modelsim и в вывод синтезатора. Логики смены состояний в коде и нет.

Забыл добавить:
CODE
always @ (posedge clk)
conv_state = conv_state_next;


Тему можно закрывать.
Go to the top of the page
 
+Quote Post
XVR
сообщение Aug 9 2011, 08:31
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
always @(posedge rs232_rx_ready) begin
- нехорошо это. Сделайте
Код
always @(posedge clk) if (rs232_rx_ready) begin
Go to the top of the page
 
+Quote Post
hdl_student
сообщение Aug 9 2011, 10:48
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 122
Регистрация: 22-02-10
Из: Москва
Пользователь №: 55 617



XVR:
Большое спасибо за совет, время от времени забываю о синхронизации.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016