微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 怎么整合这三个程序,本人初学者,大神帮忙啊

怎么整合这三个程序,本人初学者,大神帮忙啊

时间:10-02 整理:3721RD 点击:
module freqtest(clock,freq_input,dig,seg,test);
input      clock;                //系统时钟
input      freq_input;           //被测信号输入            
output[7:0]  dig;                 //数码管选择输出引脚
output[7:0]  seg;                //数码管段输出引脚
output[9:0]  test;                   //输出频率信号,用于测试
reg [25:0]    counter;                  //时钟分频计数器
reg [31:0]    freq_result;                //频率测量结果寄存器
wire [31:0]    pre_freq;                    //脉冲计数寄存器
reg      rst;
wire       divide_clk;               //1Hz 闸门信号
wire      clk_scan;                  //数码管扫描显示时钟
wire cout1,cout2,cout3,cout4,cout5,cout6,cout7;
assign clk_scan = counter[15];          //动态扫描时钟
assign test= counter[9:0];                      //输出频率信号,用于测试

//时钟分频进程:分出 1Hz 基准信号
always @(posedge clock)           
begin
  if (divide_clk)  
         counter <= 26'd0;
    else
          counter <= counter + 1'b1;
end
assign divide_clk = (counter >= 26'd50000000);
//锁存测量值进程
always @(posedge clock)         
begin
  if(divide_clk)  
    freq_result <= pre_freq;
end
//产生计数器复位信号
always @(posedge clock)         
begin
  if(divide_clk)  
    rst <= 1'b1;
  else
    rst <= 1'b0;
end
//8 位十进制计数模块:由 8 个十进制计数模块构成
cnt10 u1(.clock(clock0),.rst(rst),.cin(1'b1),.cout(cout1),.dout(pre_freq[3:0]));
cnt10 u2(.clock(clock0),.rst(rst),.cin(cout1),.cout(cout2),.dout(pre_freq[7:4]));
cnt10 u3(.clock(clock0),.rst(rst),.cin(cout2),.cout(cout3),.dout(pre_freq[11:8]));
cnt10 u4(.clock(clock0),.rst(rst),.cin(cout3),.cout(cout4),.dout(pre_freq[15:12]));
cnt10 u5(.clock(clock0),.rst(rst),.cin(cout4),.cout(cout5),.dout(pre_freq[19:16]));
cnt10 u6(.clock(clock0),.rst(rst),.cin(cout5),.cout(cout6),.dout(pre_freq[23:20]));
cnt10 u7(.clock(clock0),.rst(rst),.cin(cout6),.cout(cout7),.dout(pre_freq[27:24]));
cnt10 u8(.clock(clock0),.rst(rst),.cin(cout7),.cout(),.dout(pre_freq[31:28]));
//数码管显示模块
scan_led u9(.clk_1k(clk_scan),.d(freq_result),.dig(dig),.seg(seg));
endmodule  


module cnt10(clock,rst,cin,cout,dout);    //10 进制计数器
input clock;                //计数时钟
input cin;                 //进位输入
input rst;                  //复位信号
output cout;                //进位输出
output[3:0] dout;              //计数输出
reg[3:0] counter;              //寄存器
assign dout = counter;
assign cout = cin && (counter >= 4'd9);    //进位输出
always @(posedge clock or posedge rst)
begin
  if(rst)
    counter <= 4'd0;          //计数器复位
  else if(cin)              //进位输入
  begin
    if(cout)
      counter <= 4'd0;
    else
      counter <= counter + 1'b1;
  end
end
endmodule

module scan_led(clk_1k,d,dig,seg);
input clk_1k;
input [31:0] d; //输入要显示的数据
output [7:0] dig; //数码管选择输出引脚
output [7:0] seg; //数码管段输出引脚
reg [7:0] seg_r; //定义数码管输出寄存器
reg [7:0] dig_r; //定义数码管选择输出寄存器
reg [3:0] disp_dat; //定义显示数据寄存器
reg [2:0] count; //定义计数寄存器
assign dig=dig_r; //输出数码管选择
assign seg=seg_r; //输出数码管译码结果
always @(posedge clk_1k) //定义上升沿触发进程
begin
count <=count+1'b1;
end
always @(posedge clk_1k)
begin
        if(d<10)
        begin
                case(count) //选择扫描显示数据
                3'd0:disp_dat=d[31:28]; //第一个数码管
                3'd1:disp_dat=d[27:24]; //第二个数码管
                3'd2:disp_dat=d[23:20]; //第三个数码管
                3'd3:disp_dat=d[19:16]; //第四个数码管
                3'd4:disp_dat=d[15:12]; //第五个数码管
                3'd5:disp_dat=d[11:8]; //第六个数码管
                3'd6:disp_dat=d[7:4]; //第七个数码管
                3'd7:disp_dat=d[3:0]; //第八个数码管
                endcase
                case(count) //选择数码管显示位
                        3'd0:dig_r=8'b11111111; //选择第一个数码管显示
                        3'd1:dig_r=8'b11111111; //选择第二个数码管显示
                        3'd2:dig_r=8'b11111111; //选择第三个数码管显示
                        3'd3:dig_r=8'b11111111; //选择第四个数码管显示
                        3'd4:dig_r=8'b11111111; //选择第五个数码管显示
                        3'd5:dig_r=8'b11111111; //选择第六个数码管显示
                        3'd6:dig_r=8'b11111111; //选择第七个数码管显示
                        3'd7:dig_r=8'b11111110; //选择第八个数码管显示
                endcase
        end
        if(d>10&d<100)
        begin
                case(count)
                3'd0:disp_dat=d[31:28];
                3'd1:disp_dat=d[27:24];
                3'd2:disp_dat=d[23:20];
                3'd3:disp_dat=d[19:16];
                3'd4:disp_dat=d[15:12];
                3'd5:disp_dat=d[11:8];
                3'd6:disp_dat=d[7:4];
                3'd7:disp_dat=d[3:0];
                endcase
                case(count)
                        3'd0:dig_r=8'b11111111;
                        3'd1:dig_r=8'b11111111;
                        3'd2:dig_r=8'b11111111;
                        3'd3:dig_r=8'b11111111;
                        3'd4:dig_r=8'b11111111;
                        3'd5:dig_r=8'b11111111;
                        3'd6:dig_r=8'b11111101;
                        3'd7:dig_r=8'b11111110;
                endcase
        end
        if(d>100&d<1000)
        begin
                case(count)
                3'd0:disp_dat=d[31:28];
                3'd1:disp_dat=d[27:24];
                3'd2:disp_dat=d[23:20];
                3'd3:disp_dat=d[19:16];
                3'd4:disp_dat=d[15:12];
                3'd5:disp_dat=d[11:8];
                3'd6:disp_dat=d[7:4];
                3'd7:disp_dat=d[3:0];
                endcase
                case(count)
                        3'd0:dig_r=8'b11111111;
                        3'd1:dig_r=8'b11111111;
                        3'd2:dig_r=8'b11111111;
                        3'd3:dig_r=8'b11111111;
                        3'd4:dig_r=8'b11111111;
                        3'd5:dig_r=8'b11111011;
                        3'd6:dig_r=8'b11111101;
                        3'd7:dig_r=8'b11111110;
                endcase
        end
        if(d>1000&d<10000)
        begin
                case(count)
                3'd0:disp_dat=d[31:28];
                3'd1:disp_dat=d[27:24];
                3'd2:disp_dat=d[23:20];
                3'd3:disp_dat=d[19:16];
                3'd4:disp_dat=d[15:12];
                3'd5:disp_dat=d[11:8];
                3'd6:disp_dat=d[7:4];
                3'd7:disp_dat=d[3:0];
                endcase
                case(count)
                        3'd0:dig_r=8'b11111111;
                        3'd1:dig_r=8'b11111111;
                        3'd2:dig_r=8'b11111111;
                        3'd3:dig_r=8'b11111111;
                        3'd4:dig_r=8'b11110111;
                        3'd5:dig_r=8'b11111011;
                        3'd6:dig_r=8'b11111101;
                        3'd7:dig_r=8'b11111110;
                endcase
        end
        if(d>10000&d<100000)
        begin
                case(count)
                3'd0:disp_dat=d[31:28];
                3'd1:disp_dat=d[27:24];
                3'd2:disp_dat=d[23:20];
                3'd3:disp_dat=d[19:16];
                3'd4:disp_dat=d[15:12];
                3'd5:disp_dat=d[11:8];
                3'd6:disp_dat=d[7:4];
                3'd7:disp_dat=d[3:0];
                endcase
                case(count)
                        3'd0:dig_r=8'b11111111;
                        3'd1:dig_r=8'b11111111;
                        3'd2:dig_r=8'b11111111;
                        3'd3:dig_r=8'b11101111;
                        3'd4:dig_r=8'b11110111;
                        3'd5:dig_r=8'b11111011;
                        3'd6:dig_r=8'b11111101;
                        3'd7:dig_r=8'b11111110;
                endcase
        end
        if(d>100000&d<1000000)
        begin
                case(count)
                3'd0:disp_dat=d[31:28];
                3'd1:disp_dat=d[27:24];
                3'd2:disp_dat=d[23:20];
                3'd3:disp_dat=d[19:16];
                3'd4:disp_dat=d[15:12];
                3'd5:disp_dat=d[11:8];
                3'd6:disp_dat=d[7:4];
                3'd7:disp_dat=d[3:0];
                endcase
                case(count)
                        3'd0:dig_r=8'b11111111;
                        3'd1:dig_r=8'b11111111;
                        3'd2:dig_r=8'b11011111;
                        3'd3:dig_r=8'b11101111;
                        3'd4:dig_r=8'b11110111;
                        3'd5:dig_r=8'b11111011;
                        3'd6:dig_r=8'b11111101;
                        3'd7:dig_r=8'b11111110;
                endcase
        end
        if(d>100000&d<1000000)
        begin
                case(count)
                3'd0:disp_dat=d[31:28];
                3'd1:disp_dat=d[27:24];
                3'd2:disp_dat=d[23:20];
                3'd3:disp_dat=d[19:16];
                3'd4:disp_dat=d[15:12];
                3'd5:disp_dat=d[11:8];
                3'd6:disp_dat=d[7:4];
                3'd7:disp_dat=d[3:0];
                endcase
                case(count)
                        3'd0:dig_r=8'b11111111;
                        3'd1:dig_r=8'b10111111;
                        3'd2:dig_r=8'b11011111;
                        3'd3:dig_r=8'b11101111;
                        3'd4:dig_r=8'b11110111;
                        3'd5:dig_r=8'b11111011;
                        3'd6:dig_r=8'b11111101;
                        3'd7:dig_r=8'b11111110;
                endcase
        end
        if(d>10000000)
        begin
                case(count)
                3'd0:disp_dat=d[31:28];
                3'd1:disp_dat=d[27:24];
                3'd2:disp_dat=d[23:20];
                3'd3:disp_dat=d[19:16];
                3'd4:disp_dat=d[15:12];
                3'd5:disp_dat=d[11:8];
                3'd6:disp_dat=d[7:4];
                3'd7:disp_dat=d[3:0];
                endcase
                case(count)
                        3'd0:dig_r=8'b01111111;
                        3'd1:dig_r=8'b10111111;
                        3'd2:dig_r=8'b11011111;
                        3'd3:dig_r=8'b11101111;
                        3'd4:dig_r=8'b11110111;
                        3'd5:dig_r=8'b11111011;
                        3'd6:dig_r=8'b11111101;
                        3'd7:dig_r=8'b11111110;
                endcase
        end
end
always @(disp_dat)
begin
        case(disp_dat) //七段译码
        4'h0:seg_r=8'hc0; //显示0
        4'h1:seg_r=8'hf9; //显示1
        4'h2:seg_r=8'ha4; //显示2
        4'h3:seg_r=8'hb0; //显示3
        4'h4:seg_r=8'h99; //显示4
        4'h5:seg_r=8'h92; //显示5
        4'h6:seg_r=8'h82; //显示6
        4'h7:seg_r=8'hf8; //显示7
        4'h8:seg_r=8'h80; //显示8
        4'h9:seg_r=8'h90; //显示9
        4'ha:seg_r=8'h88; //显示a
        4'hb:seg_r=8'h83; //显示b
        4'hc:seg_r=8'hc6; //显示c
        4'hd:seg_r=8'ha1; //显示d
        4'he:seg_r=8'h86; //显示e
        4'hf:seg_r=8'h8e; //显示f
        endcase
end
endmodule

这个你要发到fpga版面把- -!

先运行一个正常后,以这个程序为基础向其中添加,一步步测试

可以帮忙整合起来吗

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top