`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 17:30:28 08/12/2013
// Design Name:
// Module Name: GPS_SELECTION
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module GPS_SELECTION(
SEL,
GPS_EVENT_A,
GPS_EVENT_B,
SEPT_PPS_IN,
SEPT_RST_IN,
NOVA_ODO_IN_A,
NOVA_ODO_IN_B,
NOVA_PPS_IN,
SEPT_RESET_OUT,
GPS_PPS,
NOVA_ODO_OUT_A,
NOVA_ODO_OUT_B,
SEPT_EVENT_A,
SEPT_EVENT_B,
NOVA_EVENT_A,
Main_CLK,
MCU_PWR_CHK,
GPS_Standby,
MCU_PWR_SIG_LED,
Sept_led,
Nova_led
);
input Main_CLK;
input SEL;
input GPS_EVENT_A, GPS_EVENT_B;
input SEPT_PPS_IN, SEPT_RST_IN;
input NOVA_ODO_IN_A, NOVA_ODO_IN_B, NOVA_PPS_IN;
input MCU_PWR_CHK;
output reg SEPT_RESET_OUT, NOVA_ODO_OUT_A, NOVA_ODO_OUT_B, SEPT_EVENT_A, SEPT_EVENT_B,NOVA_EVENT_A;
output reg MCU_PWR_SIG_LED, Sept_led, Nova_led, GPS_Standby;
output GPS_PPS;
wire Sec_9sec, clk_10hz, clk_1hz, clk_reset;
wire reset_9sec;
parameter Sept = 1'b1;
parameter Nova = 1'b0;
reg temp_9sec_MCUPWR;
reg MCU_PWR_SIG;
// Novatel : 1pps Posedge 일때, 1ms
// Span-cpt : 1pps Posedge 일때, 2ms
always @(*)
if(SEL == Nova)
NOVA_EVENT_A <= GPS_EVENT_A;
else
NOVA_EVENT_A <= 1'bz;
always @(*)
if(SEL == Nova)
NOVA_ODO_OUT_A <= NOVA_ODO_IN_A;
else
NOVA_ODO_OUT_A <= 1'b0;
always @(*)
if(SEL == Nova)
NOVA_ODO_OUT_B <= NOVA_ODO_IN_B;
else
NOVA_ODO_OUT_B <= 1'b0;
assign GPS_PPS = ((SEL == Nova) ? (!NOVA_PPS_IN) : //active high에서 low로 떨어지기 때문에 반전시켜 output.
((SEL == Sept) ? (SEPT_PPS_IN) : (1'b0))) ;
always @(*)
if(SEL == Sept)
SEPT_RESET_OUT = SEPT_RST_IN;
else
SEPT_RESET_OUT = 1'bz;
always @(*)
begin
case(SEL == Sept)
1'b1 :
begin
SEPT_EVENT_A <= GPS_EVENT_A;
SEPT_EVENT_B <= GPS_EVENT_B;
end
1'b0 :
begin
SEPT_EVENT_A <= 1'bz;
SEPT_EVENT_B <= 1'b0;
end
default
begin
SEPT_EVENT_A <= 1'bz; //Novatel GPS Event와 voltage 충돌 때문에..
SEPT_EVENT_B <= 1'bz;
end
endcase
end
assign reset_9sec = MCU_PWR_CHK; // Main PWR on/off에 따라.9초 카운터 리셋.
assign clk_reset = MCU_PWR_CHK;
always @(posedge Sec_9sec)
begin
temp_9sec_MCUPWR <= 0;
if(MCU_PWR_CHK)
temp_9sec_MCUPWR <= 1'b1;
else
temp_9sec_MCUPWR <= 1'b0;
end
always @(posedge clk_10hz)
begin
MCU_PWR_SIG_LED <= 0;
MCU_PWR_SIG <= 0;
if(MCU_PWR_CHK == 1)
begin
MCU_PWR_SIG_LED <= ~MCU_PWR_SIG_LED;
MCU_PWR_SIG <= 1'b1;
end
else
MCU_PWR_SIG_LED <= 1'b0;
MCU_PWR_SIG <= 1'b0;
end
// Sept_led, Nova_led
always @(posedge Main_CLK) //main clk 교체
begin
begin
Sept_led <= 1'b0;
Nova_led <= 1'b0;
GPS_Standby <= 1'bz;
end
case({temp_9sec_MCUPWR,SEL})
2'b11 : begin
GPS_Standby <= 1'b0; //Septentrio GPS
Sept_led <= 1'b1;
end
2'b10 : begin
GPS_Standby <= 1'b1; //novatel GPS
Nova_led <= 1'b1;
end
default : begin
GPS_Standby <= 1'bz;
Sept_led <= 1'b0;
Nova_led <= 1'b0;
end
endcase
end
CLK_div instance_name (
.clk_20M(Main_CLK),
.slow_9sec(Sec_9sec),
.clk_1khz(clk_1khz),
.clk_10hz(clk_10hz),
.clk_1hz(clk_1hz),
.reset(clk_reset),
.reset_9sec(reset_9sec)
);
endmodule
==========================================================
안녕하세요~~
빨강색 텍스트의 동작이 원하는 대로 안되서 문의 드려요~
mcu 파워 off에서 on 후 9초후에 체크되는 인자가 : temp_9sec_MCUPWR 입니다.
그런데.. cpld 전원 off에서 on 할때.. 1회적으로만,, led 점등이.. 정상 동작하고..
mcu 파워 off에서 on 스위치로 동작확인하면.. led가 latch되는 듯이.. led on 되어 있네요~
어떤 부분이 잘못 되었는지. 답변 부탁드려요~^^;
==========================================================
첫댓글 temp_9secMCUPWR신호가1을 유지하는 경우가 led불들어오는경우입니다
0으로는 어는조건에서 바뀌나요
9초 카운터에.맞추어 mcu pwr chk가 0 일때 0이 됩니다~~
0으로바뀌는것 확인하쎴나요
확인됐음 led꺼질덴되요
mcu pwr chk오프시에 꺼지지 않네요~~
위에 코드에 있는 MCU_PWR_SIG_LED만 꺼졌다 켜졌다하고. 나머지 led는 상황에 따라 스위칭은 되지만. mcu pwr chk 온 오프시에도 항상 .led 온이네요~^^;;
소스코드가 동일표현이중복되어
불필요한코드가 여럿있네요
동작이바뀌는것은 아니지만
불필요합니다
님이잘알고있는데 어디가 문제지요
led 키고 끄는것은 회로의 기본입니다
키는 조건과 끄는 조건을 살펴보세요
네네~코드 단순화해서 다시해볼께요~^^;;