Verilog 我如何控制两个模块中的信号

Verilog 我如何控制两个模块中的信号,verilog,fpga,Verilog,Fpga,我正在尝试写初始LCD模块。我没有写完信的部分。当我创建那个部分时,我的代码中有一个小问题。我不能在两个块中写入数据。当我这样做时,Xilinx会说错误:计数器信号连接到多个驱动程序。,注释语言是土耳其语,但并不重要 我只想知道如何在始终*(posedge CLK或posedge reset)块中重置和递增计数器reg以增加始终*(posedge CLK或posedge reset)块,并在始终*@块中重置计数器reg /* Wait 45ms. Write 0x38, wait 4.

我正在尝试写初始LCD模块。我没有写完信的部分。当我创建那个部分时,我的代码中有一个小问题。我不能在两个块中写入数据。当我这样做时,Xilinx会说错误:计数器信号连接到多个驱动程序。,注释语言是土耳其语,但并不重要

我只想知道如何在
始终*(posedge CLK或posedge reset)
块中重置和递增
计数器
reg以增加
始终*(posedge CLK或posedge reset)
块,并在
始终*@
块中重置
计数器
reg

/*


 Wait 45ms. 
 Write 0x38, wait 4.1ms. 
 Write 0x38, wait 100us. 
 Write 0x38, wait 40us. 
 Write 0x38, wait 40us. 
 Write 0x0F, wait 40us. (Display ON, Cursor ON, Blinking ON) 
 Write 0x01, wait 1.64ms. (Clear display) 
 Write 0x06, wait 40us. (Entry Mode Set, Auto-Increment, No Shift) 
 Write LETTER_PRINTED 
*/
//////////////////////////////////////////////////////////////////////////////////
module LCD_Baslangic(
    input CLK,
    input RESET,
     input wire [7:0] LETTER_PRINTED, //letter to be printed
    output wire LCD_E,
     //output wire LCD_RW,
    output wire LCD_RS,
    output wire [7:0] LCD_DATA
    );
        //Başlangıç değerleri
    reg [7:0] sampled_LCD_DATA = 8'd0;
    reg sampled_LCD_E = 0;
    reg sampled_LCD_RS = 0;
    //reg sampled_LCD_RW = 0;



    reg [19:0] counter = 20'd0 ; // 83.3 ns göre hesaplandı. 
    //En yüksek bekleme süresi 45ms olduğu için counter 10000011111111111111 
    //dönmesi demek,540671 kez dönmesi demektir.

    reg [19:0] precomp_delay = 20'd0;
    reg flag_45ms = 0, flag_function_is_set = 0;


    localparam t_45ms = 540000; // beslenme delayı
    localparam t_4_1ms = 54000;  // 
   localparam t_1_64ms = 19680; // Clear Display komutun işleme cycle
   localparam t_100us = 1200;
    localparam t_40us = 480;
    localparam t_40_80ns = 1;
    localparam t_240ns = 3;

    localparam [3:0] 
                        starting_state                          = 4'd0, // 45ms Beklenen kısım
                        reset_state                                 = 4'd1,
                        write_state                                 = 4'd2, // İlk Write State
                        data_delay_state                            = 4'd3, // 80ns bir bekleme yapıyoruz. Yazılan data garanti olsun diye 
                        enable_high_state                       = 4'd4, // Enable ın 1 oldugu durum bu state 240ns korunur.
                        oneclock_delay_state                    = 4'd5, // 240ns den sonra 10 ns bir bekleme gerçekleşir.Fakat FPGA kartımız en 83.3 ns clock üretebildiği için en az bir clock sağlıyabilirz.
                        precompiler_delay_state                 = 4'd6, // yapılan işleme göre LCD gerçekleştirme süresidir
                        check_isthereanywritingdata_state   = 4'd7, // yapilacak başka bir işlem varsa write state'e geri döner, yoksa bir state atlar
                        infinity_state                              = 4'd8; // Programın sona erdiği yer.

    reg [4:0] substate = 5'd0;
    reg [3:0] state_reg = 4'd0;
    reg [3:0] state_next = 4'd0;

    always @(posedge CLK or posedge RESET)
        begin
            if (RESET)
                begin
                    state_reg <= reset_state;
                    counter      <= 20'd0;
                end
            else
                begin
                    state_reg   <= state_next;
                    counter       <= counter + 20'd1;
                end 
        end

    always @*
        begin
            state_next = state_reg;
            case (state_reg)
                starting_state:
                        begin
                            if (counter == t_45ms)
                                begin
                                        counter = 20'd0;
                                        state_next = write_state;
                                        flag_45ms = 1;
                                end
                        end
                    reset_state:
                        begin
                            if (RESET == 0)
                                begin
                                    if (flag_45ms == 1) // Demekki ilk durum gerçekleşmiş
                                        begin
                                            if (flag_function_is_set == 0) // Fonksiyonlarda gönderilmemiş
                                                state_next = write_state;
                                            else
                                                state_next = infinity_state;
                                        end
                                    else
                                        state_next = starting_state;
                                end
                            else
                                state_next = reset_state;
                        end
                    write_state:
                        begin
                                case (substate)
                                        5'd0:
                                            begin
                                                sampled_LCD_DATA = 8'h38;
                                                precomp_delay = t_4_1ms;
                                                sampled_LCD_RS = 0;
                                            end
                                        5'd1:
                                            begin
                                                sampled_LCD_DATA = 8'h38;
                                                precomp_delay =  t_100us;
                                                sampled_LCD_RS = 0;
                                            end
                                        5'd2:
                                            begin
                                                sampled_LCD_DATA = 8'h38;
                                                precomp_delay = t_40us;
                                                sampled_LCD_RS = 0;
                                            end 
                                        5'd3:
                                            begin
                                                sampled_LCD_DATA = 8'h38;
                                                precomp_delay = t_40us;
                                                sampled_LCD_RS = 0;
                                            end
                                        5'd4:
                                            begin
                                                sampled_LCD_DATA = 8'h0F; // Display ON, Cursor On, Blinking On
                                                precomp_delay = t_40us;
                                                sampled_LCD_RS = 0;
                                            end
                                        5'd5:
                                            begin
                                                sampled_LCD_DATA = 8'h01; // Clear Display
                                                precomp_delay = t_1_64ms;
                                                sampled_LCD_RS = 0;
                                            end
                                        5'd6:
                                            begin
                                                sampled_LCD_DATA = 8'h06; // Entry Set, Auto-Increment,No Shift
                                                precomp_delay = t_40us;
                                                sampled_LCD_RS = 0;
                                            end
                                        default:
                                            sampled_LCD_DATA = sampled_LCD_DATA;
                                    endcase
                                state_next = data_delay_state;
                        end
                    data_delay_state: // Data Oluşum Delayı
                        begin
                            if (counter >= t_40_80ns)
                                begin
                                    state_next = enable_high_state;
                                    counter = 20'd0;
                                    sampled_LCD_E = 1; // Enable High olur
                                end

                        end
                    enable_high_state: // 240ns Enable High durumunu korur.
                        begin
                            if (counter == t_240ns)
                                begin
                                    state_next = oneclock_delay_state;
                                    counter = 20'd0;
                                    sampled_LCD_E = 0; // 10 ns bekleme yapalım
                                end
                        end
                    oneclock_delay_state:
                        begin
                            if (counter >= t_40_80ns)
                                    begin
                                        state_next = precompiler_delay_state; // bir clock 83.3 lük bekleme yapar, 
                                                                                         //yani 10 ns lik bir delay anca en az 
                                                                                       //bir clock yaparak uyarlanabilir.
                                        counter = 20'd0;                                
                                    end
                            else
                                counter = counter + 20'd1;
                        end     
                    precompiler_delay_state: // Pre Compiler Delay.
                        begin
                            if (counter == precomp_delay)
                                begin
                                    counter = 20'd0;
                                    precomp_delay = 20'd0;
                                    state_next = check_isthereanywritingdata_state;
                                end
                            else
                                counter = counter + 20'd1;  
                        end
                    check_isthereanywritingdata_state: // 
                        begin
                            if (substate == 5'd6)
                                begin
                                    state_next = infinity_state; // yapilacak işlemler bittiyse öbür state e geç
                                    flag_function_is_set = 1;
                                end
                            else
                                begin
                                    substate = substate + 3'd1;
                                    state_next = write_state; 
                                end
                        end
                    infinity_state:
                        state_next = state_reg ; // durumunu korur.Program sona erer.
                endcase
        end

    assign LCD_E = sampled_LCD_E;
    //assign LCD_RW = sampled_LCD_RW;
    assign LCD_RS = sampled_LCD_RS;
    assign LCD_DATA [7:0] = sampled_LCD_DATA [7:0];
/*
等45毫秒。
写入0x38,等待4.1ms。
写入0x38,等待100us。
写入0x38,等待40us。
写入0x38,等待40us。
写入0x0F,等待40us。(显示打开、光标打开、闪烁打开)
写入0x01,等待1.64毫秒。(清晰显示)
写入0x06,等待40us。(进入模式设置,自动递增,无换档)
写一封打印好的信
*/
//////////////////////////////////////////////////////////////////////////////////
模块式液晶显示器(
输入时钟,
输入复位,
输入线[7:0]已打印字母,//待打印字母
输出线LCD_E,
//输出线LCD_RW,
输出线液晶显示器,
输出线[7:0]LCD\U数据
);
//巴朗·德雷利
reg[7:0]采样的液晶显示器数据=8'd0;
reg-sampled_-LCD_E=0;
reg采样\u LCD\u RS=0;
//reg sampled_LCD_RW=0;
reg[19:0]计数器=20'd0;//83.3纳什·戈雷·赫萨普兰。
//En yüksek bekleme süresi 45女士olduğu iç在柜台100001111
//德梅西·德梅克,540671科兹·德梅西·德梅克提尔。
reg[19:0]预编译延迟=20'd0;
reg flag_45ms=0,flag_function_设置为0;
localparam t_45ms=540000;//贝斯伦姆延迟
localparam t_4_1ms=54000;//
localparam t_1_64ms=19680;//清晰显示komutun işleme循环
localparam t_100us=1200;
localparam t_40us=480;
localparam t_40_80ns=1;
localparam t_240ns=3;
localparam[3:0]
起始状态=4'd0,//45ms贝克伦kısım
重置_状态=4'd1,
write_state=4'd2,//İlk write state
数据延迟状态=4'd3,//80ns。雅兹兰数据公司garanti olsun diye
enable_high_state=4'd4,//enableın 1 oldugu durum bu state 240ns korunur。
一个时钟延迟状态=4'd5,//240秒的时间间隔10秒的时间间隔。法卡特的时间间隔为83.3秒,在阿兹比尔克萨尔巴利尔兹的时钟间隔为83.3秒。
预编译器延迟状态=4'd6,//yapılan işleme göre LCD gerçekleştirme süresidir
检查是否存在任何写入数据状态=4'd7,//yapilacak başka bir işlem varsa写入状态'e geri döner,yoksa bir state atlar
无限状态=4'd8;//索纳·埃尔迪耶计划。
reg[4:0]子状态=5'd0;
reg[3:0]状态_reg=4'd0;
reg[3:0]状态_next=4'd0;
始终@(posedge CLK或posedge重置)
开始
如果(重置)
开始

state_reg您是
计数器
信号有多个驱动程序,被认为是 一个错误

下面的示例演示了错误,但无法正常工作:

always @(posedge clk) begin
   counter <= some_signal;
end

always @* begin
   counter <= another_signal;
end
然后在组合逻辑块中添加
reset\u计数器
increment\u计数器

always @*
  begin
     state_next = state_reg;
     reset_counter = 0;
     increment_counter = 0;
最后,更改
计数器=20'd0的出现次数
reset_计数器=1

通过
counter=counter+20'd1,也同样如此。
将此行更改为
increment\u counter=1

我为你修改了密码。(请注意,我将
state_reg
计数器
寄存器,以提高可读性并使其 易于调试)

模块LCD\u Baslangic(
输入时钟,
输入复位,
输入线[7:0]已打印字母,//待打印字母
输出线LCD_E,
//输出线LCD_RW,
输出线液晶显示器,
输出线[7:0]LCD\U数据
);
//巴朗·德雷利
reg[7:0]采样的液晶显示器数据=8'd0;
reg-sampled_-LCD_E=0;
reg采样\u LCD\u RS=0;
//reg sampled_LCD_RW=0;
reg[19:0]计数器=20'd0;//83.3纳什·戈雷·赫萨普兰。
//En yüksek bekleme süresi 45女士olduğu iç在柜台100001111
//德梅西·德梅克,540671科兹·德梅西·德梅克提尔。
reg[19:0]预编译延迟=20'd0;
reg flag_45ms=0,flag_function_设置为0;
localparam t_45ms=540000;//贝斯伦姆延迟
localparam t_4_1ms=54000;//
localparam t_1_64ms=19680;//清晰显示komutun işleme循环
localparam t_100us=1200;
localparam t_40us=480;
localparam t_40_80ns=1;
localparam t_240ns=3;
localparam[3:0]
起始状态=4'd0,//45ms贝克伦kısım
重置_状态=4'd1,
write_state=4'd2,//İlk write state
数据延迟状态=4'd3,//80ns。雅兹兰数据公司garanti olsun diye
enable_high_state=4'd4,//enableın 1 oldugu durum bu state 240ns korunur。
一个时钟延迟状态=4'd5,//240秒的时间间隔10秒的时间间隔。法卡特的时间间隔为83.3秒,在阿兹比尔克萨尔巴利尔兹的时钟间隔为83.3秒。
预编译
always @*
  begin
     state_next = state_reg;
     reset_counter = 0;
     increment_counter = 0;
module LCD_Baslangic(
                     input             CLK,
                     input             RESET,
                     input wire [7:0]  LETTER_PRINTED, //letter to be printed
                     output wire       LCD_E,
                     //output wire LCD_RW,
                     output wire       LCD_RS,
                     output wire [7:0] LCD_DATA
                     );
   //Başlangıç değerleri
   reg [7:0]                           sampled_LCD_DATA = 8'd0;
   reg                                 sampled_LCD_E = 0;
   reg                                 sampled_LCD_RS = 0;
   //reg sampled_LCD_RW = 0;



   reg [19:0]                          counter = 20'd0 ; // 83.3 ns göre hesaplandı. 
   //En yüksek bekleme süresi 45ms olduğu için counter 10000011111111111111 
   //dönmesi demek,540671 kez dönmesi demektir.

   reg [19:0]                          precomp_delay = 20'd0;
   reg                                 flag_45ms = 0, flag_function_is_set = 0;


   localparam t_45ms = 540000; // beslenme delayı
   localparam t_4_1ms = 54000;  // 
   localparam t_1_64ms = 19680; // Clear Display komutun işleme cycle
   localparam t_100us = 1200;
   localparam t_40us = 480;
   localparam t_40_80ns = 1;
   localparam t_240ns = 3;

   localparam [3:0] 
     starting_state                          = 4'd0, // 45ms Beklenen kısım
     reset_state                                 = 4'd1,
     write_state                                 = 4'd2, // İlk Write State
     data_delay_state                            = 4'd3, // 80ns bir bekleme yapıyoruz. Yazılan data garanti olsun diye 
     enable_high_state                       = 4'd4, // Enable ın 1 oldugu durum bu state 240ns korunur.
     oneclock_delay_state                    = 4'd5, // 240ns den sonra 10 ns bir bekleme gerçekleşir.Fakat FPGA kartımız en 83.3 ns clock üretebildiği için en az bir clock sağlıyabilirz.
     precompiler_delay_state                 = 4'd6, // yapılan işleme göre LCD gerçekleştirme süresidir
     check_isthereanywritingdata_state   = 4'd7, // yapilacak başka bir işlem varsa write state'e geri döner, yoksa bir state atlar
     infinity_state                              = 4'd8; // Programın sona erdiği yer.

   reg [4:0]                           substate = 5'd0;
   reg [3:0]                           state_reg = 4'd0;
   reg [3:0]                           state_next = 4'd0;
   reg                                 reset_counter;
   reg                                 increment_counter;

   always @(posedge CLK or posedge RESET)
     begin
        if (RESET)
          begin
             state_reg <= reset_state;
          end
        else
          begin
             state_reg   <= state_next;
          end 
     end

   always @(posedge CLK or posedge RESET)
     begin
        if (RESET)
          begin
             counter      <= 20'd0;
          end
        else
          begin
             if (reset_counter) begin
                counter <= 0;
             end
             else if (increment_counter) begin
                counter       <= counter + 20'd1;
             end
          end 
     end

   always @*
     begin
        state_next = state_reg;
        reset_counter = 0;
        increment_counter = 0;
        case (state_reg)
          starting_state:
            begin
               if (counter == t_45ms)
                 begin
                    // counter = 20'd0;
                    reset_counter = 1;
                    state_next = write_state;
                    flag_45ms = 1;
                 end
            end
          reset_state:
            begin
               if (RESET == 0)
                 begin
                    if (flag_45ms == 1) // Demekki ilk durum gerçekleşmiş
                      begin
                         if (flag_function_is_set == 0) // Fonksiyonlarda gönderilmemiş
                           state_next = write_state;
                         else
                           state_next = infinity_state;
                      end
                    else
                      state_next = starting_state;
                 end
               else
                 state_next = reset_state;
            end
          write_state:
            begin
               case (substate)
                 5'd0:
                   begin
                      sampled_LCD_DATA = 8'h38;
                      precomp_delay = t_4_1ms;
                      sampled_LCD_RS = 0;
                   end
                 5'd1:
                   begin
                      sampled_LCD_DATA = 8'h38;
                      precomp_delay =  t_100us;
                      sampled_LCD_RS = 0;
                   end
                 5'd2:
                   begin
                      sampled_LCD_DATA = 8'h38;
                      precomp_delay = t_40us;
                      sampled_LCD_RS = 0;
                   end 
                 5'd3:
                   begin
                      sampled_LCD_DATA = 8'h38;
                      precomp_delay = t_40us;
                      sampled_LCD_RS = 0;
                   end
                 5'd4:
                   begin
                      sampled_LCD_DATA = 8'h0F; // Display ON, Cursor On, Blinking On
                      precomp_delay = t_40us;
                      sampled_LCD_RS = 0;
                   end
                 5'd5:
                   begin
                      sampled_LCD_DATA = 8'h01; // Clear Display
                      precomp_delay = t_1_64ms;
                      sampled_LCD_RS = 0;
                   end
                 5'd6:
                   begin
                      sampled_LCD_DATA = 8'h06; // Entry Set, Auto-Increment,No Shift
                      precomp_delay = t_40us;
                      sampled_LCD_RS = 0;
                   end
                 default:
                   sampled_LCD_DATA = sampled_LCD_DATA;
               endcase
               state_next = data_delay_state;
            end
          data_delay_state: // Data Oluşum Delayı
            begin
               if (counter >= t_40_80ns)
                 begin
                    state_next = enable_high_state;
//                    counter = 20'd0;
                    reset_counter = 1;
                    sampled_LCD_E = 1; // Enable High olur
                 end

            end
          enable_high_state: // 240ns Enable High durumunu korur.
            begin
               if (counter == t_240ns)
                 begin
                    state_next = oneclock_delay_state;
//                    counter = 20'd0;
                    reset_counter = 1;
                    sampled_LCD_E = 0; // 10 ns bekleme yapalım
                 end
            end
          oneclock_delay_state:
            begin
               if (counter >= t_40_80ns)
                 begin
                    state_next = precompiler_delay_state; // bir clock 83.3 lük bekleme yapar, 
                    //yani 10 ns lik bir delay anca en az 
                    //bir clock yaparak uyarlanabilir.
//                    counter = 20'd0;                                
                    reset_counter = 1;
                 end
               else
                 increment_counter = 1;
//                 counter = counter + 20'd1;
            end     
          precompiler_delay_state: // Pre Compiler Delay.
            begin
               if (counter == precomp_delay)
                 begin
                    //counter = 20'd0;
                    reset_counter = 1;
                    precomp_delay = 20'd0;
                    state_next = check_isthereanywritingdata_state;
                 end
               else
//                 counter = counter + 20'd1;
                 increment_counter = 1;
            end
          check_isthereanywritingdata_state: // 
            begin
               if (substate == 5'd6)
                 begin
                    state_next = infinity_state; // yapilacak işlemler bittiyse öbür state e geç
                    flag_function_is_set = 1;
                 end
               else
                 begin
                    substate = substate + 3'd1;
                    state_next = write_state; 
                 end
            end
          infinity_state:
            state_next = state_reg ; // durumunu korur.Program sona erer.
        endcase
     end

   assign LCD_E = sampled_LCD_E;
   //assign LCD_RW = sampled_LCD_RW;
   assign LCD_RS = sampled_LCD_RS;
   assign LCD_DATA [7:0] = sampled_LCD_DATA [7:0];