【解析新特性】300W单路输出工业电源>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 继续学习VerilogHDL,试验几个有意思的操作符

共9条 1/1 1 跳转至

继续学习VerilogHDL,试验几个有意思的操作符

高工
2012-11-26 21:33:18    评分
此帖已同步更新到FPGADIY进程贴。 2012.11.26

继续学习VerilogHDL。
大致浏览了下VerilogHDL程序设计与实践,整个书看得也是云里雾里的。前几天看51FPGA版主的教程遇见的几个问题重点看了下。
有点小收获。今天刚把ModelSIM装上去了,这不晚上就来显摆了。

实验是哟个三分频器,占空比是50%的三分频器。参照书上的做法,用一个占空比为1/3 和一个占空比为2/3的波形进行或运算,之后就得到了占空比为占空比为50%的波形,当然这两个进行与运算的波形相位是一致的。

先看RTL级的框图,我是没看明白为什么会这样,但各个模块很清晰


再上波形图,ModelSim10d里边进行的仿真。


最后是代码:
/*3分频器  占空比50%*/

module clk_div3(clk_in,rst_n,clk_out);
input    clk_in;
input    rst_n;
output    clk_out;

reg    [1:0] cnt,cnt1;
reg    clk_1to3p,clk_1to3n;

always@(posedge clk_in)   //两个Always块并行执行,
begin
    if(!rst_n)        //复位时候的处理
        begin
            cnt<=0;
            clk_1to3p <= 0;
        end
    else
        begin
            if(cnt == 2'b10)
            begin
                    cnt<=0;  //数数,到2就归零。波形不反转
                    clk_1to3p <= clk_1to3p;
                end
            else
                begin
                    cnt <= cnt+1;   //数数,0和1时候波形反转。
                    clk_1to3p <= !clk_1to3p;
                end
        end
end

always@(negedge clk_in)   
begin
    if(!rst_n)
        begin
            cnt1<=0;
            clk_1to3n <=0;
        end
    else
        begin
            if(cnt1 == 2'b10)
                begin
                    cnt1<=0;
                    clk_1to3n <=clk_1to3n;
                end
            else
                begin
                    cnt1<= cnt1+1;
                    clk_1to3n <=!clk_1to3n;
                end
        end
end

assign    clk_out    = clk_1to3p | clk_1to3n;   //或运算,得到占空比50%的波形


endmodule



关键词: 继续     学习     VerilogHDL     试验     几个     有意    

高工
2012-11-26 21:35:37    评分
2楼
不错,ModelSim都会用了,继续加油!

高工
2012-11-26 21:38:33    评分
3楼
QII 12.0没内带仿真。
昨晚手机下了一晚上才把ModelSim下下来的。

好的东西不会用。先凑合一下。

VerilogHDL内建好多仿真的东西,这些东西要专门抽出时间学吗?我这几天基本只看了语法,然后就是看代码

高工
2012-11-26 22:06:12    评分
4楼
用VerilogHDL会写些简单的仿真激励就可以了,还是要多学习下可综合的语句!

高工
2012-11-26 22:23:52    评分
5楼
你评分的实验还都没开始做呢。那些实验没有用到仿真综合之类的东西!先看一眼,试验完了再说

高工
2012-11-26 22:44:16    评分
6楼
不错~!流程走通了,下一步就是深入学习,LZ加油~!

高工
2012-11-26 22:52:14    评分
7楼
谢谢
这算是个HelloWorld吧。。。。。。

这个活动我拖了太久了,刚好最近时间多 

专家
2012-11-26 23:30:07    评分
8楼
楼主 这也都是逼出来的啊~~
嘿嘿

高工
2012-11-30 22:33:41    评分
9楼
昨天收到了热风枪,一晚上的时间将主片修改了回来。然后将坏掉的板子上边的零件拆到新板子上。
焊完之后,今天检查发现虚焊。原因我上锡上的太少了,生怕连焊。今天拿着镊子一个个引脚拨,将没焊好的引脚又补了一烙铁。然后检查连焊短路问题。基本排除。

由于不知道什么原因,我第一个焊上去的就是主片。然后才是电源部分。电源正常不正常还不知道。
板子上现在还缺几个零件,被我吹丢了,回家才能补。
今天继续写程序。

今天试验了两个东西,一个是一位运算符一个是拼接运算。
第一个程序实现了通过移位运算对输入数据乘以19,第二个实现了几个简单的数据拼接;


/*利用移位运算符实现将输入数据乘以19*/

module    amp19(sys_clk,din,dout);
input                sys_clk;
input        [7:0]        din;
output    [11:0]    dout;

reg    [11:0]    dout16;
reg    [11:0]    dout2;
reg    [11:0]    dout1;

always@(posedge    sys_clk)
    begin
        dout16 <=    din<<4;        //乘以16
        dout2     <=    din<<1;        //乘以2
        dout1     <=    din;        //乘以1
    end
assign    dout    =    dout16+dout2+dout1;    //相加,非阻塞
endmodule


拼接操作很自由,相当于把几位数放到一起,组成一个新的数
/*拼接运算符实验*/

module    pinjie(data_out,data_in,sys_clk);

input    [3:0]    data_in;
input    sys_clk;
output    [15:0]    data_out;

reg    [15:0]    data_out;
//parameter    shiftreg    = 14'b11111111111111;
//wire    [14:0]    shiftreg;
//assign    shiftreg = 15'b111111111111111;
always@(posedge    sys_clk)
    begin
        //data_out[15:0]    <={shiftreg[14:0],data_in};
        data_out[15:0]    <=    {data_in[3:0],!data_in[0],!data_in[3:1],data_in[3:0],!data_in[3:0]};
    end

endmodule

共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]