|
各位大神,我新學(xué)了幾天 Verilog HDL 語言,寫了個(gè)小小程序,使用高云芯片 GW1NS-4,運(yùn)行后,不知什麼原因總是復(fù)位重啟,能否各位指點(diǎn)下,感激不盡,目的是對(duì)輸入的BCD碼解碼顯示,led_dp 是小數(shù)點(diǎn),led_en是外部MCU鎖存信號(hào), 我的思路是 用芯片的OSC 作為時(shí)鐘,然后上電后,檢測(cè)到 led_en 為高電平,才開始程序的運(yùn)行,有22個(gè)LED的輸出,有兩個(gè)LED作小數(shù)點(diǎn),程序中將這兩點(diǎn)熄滅,其他的拼成七段數(shù)碼顯示,運(yùn)行后,一段時(shí)間正常工作后,會(huì)不正常閃爍,然后回到上電后的狀態(tài),全亮
module ledigital(
// clk,
// rst_n,
led_dp,
led_en,
bcd_code,
led
);
//=================================================================
// PORT DECLARATION
//=================================================================
//input clk;
//input rst_n;
input led_dp;
input led_en;
input[3:0] bcd_code;
output[21:0] led;
//------------------------------------------------------------------
//
reg[19:0] timecnt;
reg[19:0] temp_led;
assign {led[21:15],led[13:9],led[7:0]} = {temp_led[19:0]};
wire osc_clk;
wire led_8pin;
wire led_14pin;
assign led[8]=led_8pin;
assign led[14]=led_14pin;
assign led_8pin = 1; // 熄滅小數(shù)點(diǎn)
assign led_14pin = 1;
reg[19:0] rst_count;
reg rst_en;
reg[3:0] temp_bcd;
reg temp_dp;
//reg temp_en;
reg[1:0] temp_work;
Gowin_OSC Gowin_OSC_inst ( // 用內(nèi)部振蕩作CLK
.oscout(osc_clk),
.oscen(1'd1)
);
always @(posedge osc_clk) begin
if(!rst_en)
begin
rst_count <= rst_count + 1'd1;
if(rst_count >= 20'b1111_1111_1111_1111_1110) //上電延時(shí)一段時(shí)間后,檢測(cè)外部 led_en 是否拉高,拉高,則開始工作
begin
rst_count <= 0;
if(led_en)
rst_en <= 1;
end
end
end
always @(posedge osc_clk ) begin
if(!rst_en)
begin
temp_led <= 20'b0000_0000_0000_0000_0000;
end
else
begin
if(temp_work == 0) //因?yàn)?led_en 是鎖存信號(hào), 下降沿改變數(shù)據(jù), 上升沿鎖存
begin
if(!led_en) //檢測(cè)下降沿
temp_work <= 1;
end
else if(temp_work == 1) //檢測(cè)上升沿
begin
if(led_en)
begin
temp_bcd <= #20 bcd_code; //顯示解碼的BCD數(shù)據(jù)
case (temp_bcd)
5'd0: temp_led <= 20'b0101_1100_1100_0000_0000;
5'd1: temp_led <= 20'b0001_1101_0101_1011_1111;
5'd2: temp_led <= 20'b1100_0001_0011_1100_0000;
5'd3: temp_led <= 20'b0100_0001_1001_1110_0010;
5'd4: temp_led <= 20'b0000_0100_0000_0011_1111;
5'd5: temp_led <= 20'b0010_0010_1000_0110_0010;
5'd6: temp_led <= 20'b0111_0110_1000_0100_0000;
5'd7: temp_led <= 20'b0000_1101_0101_1011_0011;
5'd8: temp_led <= 20'b0101_0101_1000_0100_0000;
5'd9: temp_led <= 20'b0101_0101_1000_0110_0010;
5'd10: temp_led <= 20'b0101_0000_0000_0001_0001;
5'd11: temp_led <= 20'b0100_0000_1000_0000_0000;
5'd12: temp_led <= 20'b1011_1110_0110_0100_0000;
5'd13: temp_led <= 20'b0100_1000_1100_0000_0000;
5'd14: temp_led <= 20'b1010_0010_0010_0100_0000;
5'd15: temp_led <= 20'b1010_0010_1010_0101_0001;
default:temp_led <= 20'b1111_1111_1111_1111_1111;
endcase
temp_work<= 0;
end
end
end
end
endmodule
|
|