fangda 发表于 2010-6-12 20:09:56

魏坤请教你一个数字示波器触发功能实现的问题

我现在在尝试用verilog编写数字存储示波器。遇到一个问题。就是在写触发功能时,我加了一个trigger_begin的上升沿来判断trigger_en信号的有无。但是我存储了512个点后,无法将trigger_en复位。请问怎么解决这个问题。我的代码如下:
module DSO_Version2(clk,out_da2,out_da1,clk_da1,clk_da2,clk_ad,ad_in,out_switch);

input clk;
input ad_in;

output out_da2,out_da1;
output out_switch;
output clk_da1,clk_da2,clk_ad;

reg clk_ad,clk_da1,clk_da2;   
reg out_da2,out_da1;
reg ad_counter;
reg clk_counter;
reg ad_temp;
reg ad_data;
reg trigger_en,triggerjudge_en;
reg trigger_begin;
wire out_switch;
reg state,nstate;

parameter                        idle                = 3'b000,
                        triggerjudge        = 3'b001,
                        AD_RAM                = 3'b010,
                        dis                       = 3'b011;
       
always @(posedge clk_ad)       
        begin
                case(state)               
                idle:
                        begin
                                ADSample;
                                if(trigger_en)
                                        nstate <= AD_RAM;
                                                   triggerjudge_en <= 0;
                                else                                       
                                                   nstate <= triggerjudge;                                                   
                                        triggerjudge_en <= 1;
                        end
                triggerjudge:
                        begin       
                                trigger_judge(ad_temp);
                                nstate <= idle;       
                        end
                AD_RAM:
                        begin
                                write_RAM(ad_temp);
                                nstate <= dis;
                        end
                dis:
                        begin
                                display(ad_data);
                                ad_counter <= ad_counter + 1;
                                if(ad_counter >= 511)
                                        begin
                                                ad_counter <= 0;
                                                triggerjudge_en <= 1;
                                                nstate <= idle;
                                        end
                                else
                                        begin
                                                nstate <= idle;
                                        end
                        end
                default:
                                nstate <= triggerjudge;
                               
                endcase
        state <= nstate;               
        end
       
       
task ADSample;
        if(clk_ad)
                ad_temp <= ad_in ^ 8'b1000_0000;
endtask
       
task trigger_judge;
        input ad_temp;
        parameter trigger_level = 100;
        if(triggerjudge_en)
        begin
        if(ad_temp > trigger_level)
                trigger_begin <= 1;
        else
                trigger_begin <= 0;
        end

endtask

task write_RAM;
        input ram_temp;
        if(trigger_en)
        ad_data = ram_temp;
endtask

task display;
        input data;
        if(trigger_en)
                begin
                        out_da2 <= data;
                        out_da1 <= out_da1 + 8;
                end
        else
                begin
                        out_da2 <= 0;
                        out_da1 <= 0;
                end
       
endtask

always @(posedgetrigger_begin)
        begin
          if(triggerjudge_en)
                begin
                if(trigger_begin)
                        trigger_en <= 1;
                else
                        trigger_en <= 0;
                end

        end
       

       
                       
               

       
assign out_switch = 8'b1000_1100;
       
endmodule

t2397362 发表于 2010-6-12 20:14:48

不懂帮顶

lv123123123 发表于 2012-4-16 21:35:58

加个复位信号
页: [1]
查看完整版本: 魏坤请教你一个数字示波器触发功能实现的问题