Написание кодов модуля verilog для счетчика вверх / вниз, мультиплексора 4to1, pulgen

Я довольно новичок в мире создания модулей Verilog, и мне нужно создать мультиплексор 4 на 1, генератор импульсов, счетчик вверх / вниз и отображение от шести до семи сегментов. Все они позже помещаются в модуль верхнего уровня.

Я попытался создать генератор 7segement и генератора импульсов, но мне нужна помощь в создании мультиплексора 4to1 (ранее я только создавал мультиплекс 2to1) и счетчика вверх / вниз.

это описание на моей лабораторной работе.

Pulse Gen: используется для контроля времени, в течение которого счетчик будет увеличиваться или уменьшаться. он использует вход с именем DELAU для определения промежутка времени между каждым импульсным выходом. каждый такт отсчитывается. когда количество отсчитанных тактовых импульсов равно входу задержки, генерируется импульс.

Счетчик вверх / вниз: будет увеличивать или уменьшать 8-битный регистр при каждом получении импульса. когда внешний переключатель с платы xilinx имеет высокий уровень (1), счетчик будет увеличиваться. Переключатель установлен в низкое положение (0), что приведет к уменьшению регистра. данные счета регистров выводятся на верхний уровень для светодиодов и 7-сегментного дисплея.

4to1 mux: обеспечить ввод задержки для генерации импульсов. четыре входа для мультиплексирования будут жестко заданы на верхнем уровне, чтобы обеспечить задержку 0,5, 1, 1,5 и 2 секунды соответственно. 2-битный выбор поступит от 2-х переключателей на плате xilinx. с доски пользователь сможет переключаться, выбирая время задержки, на которое счетчик будет считать вверх или вниз.

так вот что у меня так далеко. у меня действительно не так много для мукса и счетчика обновлений. (не могли бы вы также проверить мой пульген?)

4to1MUX

`timescale 1ns / 1ps
module mux4to1(sel,seg0,seg1,seg2,seg3,delay);
    input [1:0] sel;
    input seg0,seg1,seg2,seg3;
    output delay;
    wire delay;
    assign seg0 = 500000000;
    assign seg1 = 1000000000;
    assign seg2 = 1500000000;
    assign seg3 = 2000000000;
endmodule

СЧЕТЧИК ВВЕРХ / ВНИЗ

`timescale 1ns / 1ps
module updownCounter(updown,pulse,count);
    input [7:0] updown,
    input pulse;
     output [7:0] count;
     wire [7:0] count;

     (i'm not sure what goes here)
endmodule

ГЕНЕРАТОР ИМПУЛЬСОВ

`timescale 1ns / 1ps
module pulsegen(clk,rst,delay,pulse);
    input [28:0] delay;
     output pulse;
     wire pulse;
     reg [28:0] count;

     always @(posedge clk, posedge rst)
        if (rst)
            count <= 28'b0;
        else if (pulse)
            count <= 28'b0;
        else
            count <= count + 28'b1;
     assign pulse = (count == delay);
endmodule

7-сегментный дисплей

`timescale 1ns / 1ps
module sevenSegDis(hex,a,b,c,d,e,f,g);
    input [3:0] hex;
    output a,b,c,d,e,f,g;
     reg a,b,c,d,e,f,g;

     always@(*)
        case(hex)
            4'b0000: {a,b,c,d,e,f,g}= 7'b0000001;
            4'b0001: {a,b,c,d,e,f,g}= 7'b1001111;
            4'b0010: {a,b,c,d,e,f,g}= 7'b0010010;
            4'b0011: {a,b,c,d,e,f,g}= 7'b0000110;
            4'b0100: {a,b,c,d,e,f,g}= 7'b1001100;
            4'b0101: {a,b,c,d,e,f,g}= 7'b0100100;
            4'b0110: {a,b,c,d,e,f,g}= 7'b0100000;
            4'b0111: {a,b,c,d,e,f,g}= 7'b0001111;
            4'b1000: {a,b,c,d,e,f,g}= 7'b0000000;
            4'b1001: {a,b,c,d,e,f,g}= 7'b0000100;
            4'b1010: {a,b,c,d,e,f,g}= 7'b0001000;
            4'b1011: {a,b,c,d,e,f,g}= 7'b1100000;
            4'b1100: {a,b,c,d,e,f,g}= 7'b0110001;
            4'b1101: {a,b,c,d,e,f,g}= 7'b1000010;
            4'b1110: {a,b,c,d,e,f,g}= 7'b0110000;
            4'b1111: {a,b,c,d,e,f,g}= 7'b0111000;
            default: {a,b,c,d,e,f,g}= 7'b1110111;
        endcase
endmodule

1 ответ

Я думаю, что вы немного неправильно поняли описание мультиплексора. Вам не нужно создавать импульсы внутри него, поэтому цифры 500000000, 1000000000 не должны появляться там.

Вместо этого мультиплексор не должен заботиться о том, что означают его входы. Он просто должен подключить один из них к выходу, в зависимости от значения выбранного входа. Как и в 7-сегментном декодере, вы можете использовать case утверждение для моделирования мультиплексора, и это может выглядеть так:

module mux4to1 (sel, seg0, seg1, seg2, seg3, delay);
  input [1:0] sel;
  input seg0, seg1, seg2, seg3;
  output delay;

  always @(*)
    case(sel)
    /* fill in the appropriate Verilog code which expresses this:
       if `sel` is 0 -> `delay` is `seg0`
       if `sel` is 1 -> `delay` is `seg1`
       and so on */
    endcase
endmodule

Ваш счетчик вверх / вниз нуждается в дополнительном тактовом входе. updown ввод должен быть один бит, а не восемь бит.

Код счетчика должен выглядеть аналогично коду генератора импульсов. В каждом тактовом цикле должно происходить одно из следующего:

  • если pulse 0, счетчик остается как есть
  • если pulse это 1 и updown равно 1, счетчик увеличивается на один
  • если pulse это 1 и updown 0, счетчик уменьшается на единицу

Ваш генератор импульсов и 7-сегментный декодер, кажется, в порядке.

Другие вопросы по тегам